다음과 같이 말해보자:
% ls ./ _
foo
호출 시 _
커서 위치는 어디입니까 ?
foo(){
echo $COMMAND
}
zle -N foo
실행되는 "명령"을 작성할 수 있도록 어떻게 COMMAND
설정 합니까 foo
(예: 줄의 첫 번째 단어 - &&
그런 것을 나열하거나 사용할 필요가 없음)?
답변1
다양한 변수에 접근할 수 있습니다.사용자 정의 위젯, 특히 BUFFER
해당 줄을 포함하는 콘텐츠(또는 더 광범위하게는 여러 줄이 될 수 있는 전체 버퍼)입니다.
첫 번째 단어를 추출하는 방법은 BUFFER
단어 정의에 따라 다릅니다. 이 경우 아마도 가장 유용한 정의는 다음을 통해 수행할 수 있는 셸 구문을 기반으로 하는 것입니다.z
매개변수 확장 플래그.
first_word=${${(z)BUFFER}[1]}
기타 합리적인 정의는 공백으로 구분된 단어 또는 다음으로 구성된 단어입니다.$WORDCHARS
. 가지다이동 명령이렇게 하려면 문자열을 수동으로 분할하는 것이 더 쉽습니다. 단, zle
내장 기능을 통해 문자열을 호출하고 이동을 관찰 할 수도 있습니다 .CURSOR
$BUFFER
완료 위젯에는 완료되는 명령에 대한 단어가 위치합니다.words
범위.
답변2
ls
그러면 현재 줄의 시작 부분부터 비트를 시작 하시겠습니까 ? 무엇이 설정되어 있는지 봅시다 zsh
...
% foo(){ set > whatallisset }
% zle -N foo
% bindkey "^W" foo
% ls ./ # here I mash control+w, etc
% fgrep 'ls ./' whatallisset
BUFFER='ls ./ '
LBUFFER='ls ./ '
따라서 우리는 변수 중 하나의 "첫 번째 단어"를 구문 분석하여 BUFFER
그것이 가장 적합하다고 가정한 다음 zshexpn(1)
문서를 조사하고 "분할"과 관련된 내용을 찾은 후 다음과 같이 생각할 수 있습니다.
foo(){ echo -n ${${(z)BUFFER}[1]} }