탭(또는 다른 키 조합)을 누를 때 터미널에서 미리 정의된 일부 문자열을 확장하는 방법을 찾고 있습니다. 이는 탭 완성과 다릅니다. 내 터미널이 내 홈 디렉토리로 확장되었습니다(어떻게 알아냈는지 기억이 나지 않지만, 내가 찾고 있는 것의 특별한 경우일 뿐이라는 것은 확실합니다).
예:
입력 cdd
하고 Tab 키를 누르면 으로 확장되고 cd /your/home/folder/Downloads/
커서는 해당 줄의 끝에 위치합니다. 따라서 폴더 안에 폴더 이름을 입력 Downloads
하고 명령을 실행하면 됩니다. 더 나은 예는 커서를 확장 sshu
하고 기호 뒤에 ssh |@a-pre-defined-host.foo
커서를 놓아 @
사용자 이름을 입력하는 것입니다.
이는 많은 IDE에 있는 코드 조각 확장 기능과 유사합니다. 파일의 bash 함수에 매개변수를 작성하여 .bashrc
동일한 결과를 얻을 수 있다고 말하지 마십시오.
점은 무엇인가?
그렇다면 함수 호출과 비교하여 이와 같은 것을 사용하는 요점은 무엇입니까? 글쎄요, 명령줄을 사용하는 많은 사람들과 달리 저는 기억력이 좋지 않습니다. 자주 사용하는 명령어라도 매개변수 등의 세부사항이 기억나지 않습니다. 나는 보통 온라인에서 "curl을 사용하여 json 파일을 게시하는 방법은 무엇입니까?"와 같은 것을 검색합니다. 글쎄, 파일 이름, 호스트 이름, 포트 이름 및 기타 매개 변수를 허용하고 POST를 수행하는 함수를 만들 수 있습니다. 그러나 매개변수와 그 순서를 기억하는 것은 전체 명령을 기억하는 것보다 쉽지 않습니다. 조각 확장을 사용하면 조각 이름(예: )만 기억하면 됩니다. snppost
그렇지 않으면 조각 이름도 기억할 필요가 없습니다. 입력 snp
하고 Tab을 누르면 스니펫 목록을 얻을 수 있고 내가 찾고 있는 스니펫을 찾을 수 있습니다. 조각을 확장하려면 Tab 키를 다시 누르세요. 웹을 검색하고 복사/붙여넣기할 필요 없이 내가 찾고 있는 명령이 있습니다. 원하는 방식으로 명령을 사용자 정의하고 실행할 수 있습니다.
답변1
원하는만큼 쉽지는 않을 것입니다. 프로그래밍 가능한 완성은 명령을 대체할 수 없습니다. 그리고 프로그래밍 가능한 완성이 시작되기 전에 명령어(즉, 후행 공백)를 완성해야 합니다.
즉, 별칭이나 함수를 만들고 cdd
이를 cd
. 이는 문제가 되지 않습니다(개행 문자가 포함된 디렉토리 이름 제외...). 나머지는 다음과 같이 수행할 수 있습니다.
_cdd () { IFS=$'\n'; if [ 1 -eq "$COMP_CWORD" -a 0 -eq "${#COMP_WORDS[1]}" ];
then COMPREPLY=("/your/home/folder/Downloads/");
else COMPREPLY=($(compgen -A directory "${COMP_WORDS[1]}"));fi; }
complete -o filenames -F _cdd cdd
단어 안에 커서를 놓습니다.
나는 이것이 좋은 생각이라고 생각하지 않습니다. 그러나 이것을 고려하십시오. 커서를 뒤로 이동하는 것이 가능하지만 프로그래밍 가능한 완성에서는 이것을 구현하지 않았습니다.
back_seq=$'\e[D'
output=""; for((i=0;i<5;i++)); do output+="$back_seq"; done
echo -n 123456789"$output"; sleep 5
답변2
READLINE 함수에서 사용할 수 있는 것을 찾을 수 있습니다.
LESS='+/shell-expand-line' man bash
시작하자 .
shell-expand-line
echo $SHELLOPTS
귀하의 목적에 가장 적합하지 않을 수도 있지만 기본적으로 설정되어 있습니다 ( 기본 셸 옵션이 포함 되어 있다고 가정 :emacs:
).
를 실행하면 다른 가능성도 볼 수 있습니다 bind -p | grep expand
. 이러한 "확장" 기능은 어떤 형태로든 사용자가 요청한 작업을 수행합니다.
기본적으로 별칭을 설정합니다.
alias cdd='cd /your/home/folder/Downloads/'
...당신의 것에서 .bashrc
확장하고 싶을 때 입력하면 cdd<Esc><C-e>
확장됩니다. 이는 위에서 언급한 이미 설정을 사용하여 수행됩니다 shell-expand-line
. 이는 변수뿐만 아니라 별칭 및 기록 확장도 확장합니다. (입력 l.; echo $SHELLOPTS; !!
하고 를 눌러 보세요 <Esc><C-e>
.)
alias-expand-line
귀하의 목적에 더 잘 맞는 기능을 간단히 바인딩하는 등 다른 기능을 바인딩할 수 있습니다 .