ZSH : 위젯을 직접 ZLE하는 방법?


12

문서는 섹션 18.4 위젯 에서 "위젯의 작업은 단순히 작은 작업을 수행하는 것"이라고 말합니다. 그러나 이러한 작업을 호출하는 방법, 즉 위젯을 호출하는 방법에 대한 일반적인 설명을 찾을 수 없습니다.

위젯에서을 사용하여 키에 바인딩 할 수있는 예제 (예 : 이 Q & A 참조)에서 보았습니다 bindkey KEY WIDGET. 그런 다음을 사용하여 위젯을 호출 할 수 있습니다 KEY.

나는 토글 set-local-history하고 싶었고 시도했다.

$ zle set-local-history 1
zle: widgets can only be called when ZLE is active

zle -h작동하지 않지만 여기서 인수에 대한 설명을 찾았 습니다 . 그러나 같은 것이 보이지 않습니다 --call.

내가 무엇을 잘못하고 있지? bindkey없이 위젯을 호출하는 방법은 무엇입니까? 현재 상태를 어떻게 인쇄합니까? ( set-local-history상태를 토글합니다)

답변:


9

widget에 의해 widget을 실행할 수 있으며 execute-named-cmd, 이는 ESC-x(emacs 바인딩) 또는 :(vi 바인딩)에 바인딩됩니다.

execute-named-cmd (ESC-x) (:) (unbound)

편집기 명령의 이름을 읽고 실행하십시오.

그러면 명령 행 아래에 미니 버퍼 가 열리고 zle 위젯을 시작할 수 있습니다. (자동 완성이 가능합니다!) :

$ [ESC-x]
execute: set-[TAB]
set-local-history  set-mark-command

zle(로컬 히스토리 포함) 상태를 쿼리하려면 변수를 사용하십시오 $ZLE_STATE(위젯 함수 내에서만 액세스 가능).

ZLE_STATE (scalar)

현재 zle 상태를 설명하는 공백으로 구분 된 단어 세트를 포함합니다.

현재 표시된 상태는 겹쳐 쓰기 모드 또는 vi- 교체 위젯에 의해 설정된 삽입 모드와 히스토리 명령이 set-local-history 위젯에 의해 제어되는 가져온 항목을 방문하는지 여부입니다. 문자열 insert 은 명령 행에 삽입 할 문자가 기존 문자를 오른쪽으로 이동하거나 overwrite삽입 할 문자가 기존 문자를 겹쳐 쓰는지 여부를 포함합니다. 로컬 히스토리 명령 만 방문하는지 또는 가져온 히스토리 명령도 방문 하는지를 포함 localhistory합니다 globalhistory.

하위 문자열은 사전 순으로 두 개의 특정 하위 문자열을 테스트하려면 다음을 수행하여 일치시킬 수 있도록 사전 순으로 정렬됩니다.

if [[ $ZLE_STATE == *globalhistory*insert* ]]; then ...; fi

의 모든 인용문 man zshzle.


예, 두 따옴표를 이미 보았지만 세 괄호의 값을 이해하지 못했습니다. 매뉴얼 페이지에 "이러한 특수 매개 변수는 항상 위젯 기능에서 사용 가능하지만 ZLE 외부에서는 특별하지 않습니다." 즉, ZLE_STATE를 얻으려면 함수와 사용자 정의 위젯을 정의해야합니다.
lumbric

@lumbric : 맞습니다. ZLE_STATE위젯 함수 내부에서만 정의됩니다. 나는 대답을 다듬었다. 당신의 목표는 무엇입니까? [와일드 추측 : 프롬프트에서 로컬 / 글로벌 히스토리를 표시하려면 위젯을 사용하여 (i.) 쉘 변수를 설정하고 (위젯 내에서 가능) (ii.) 실행하십시오 zle set-local-history.]
mpy

저의 주요 목표는 zle 위젯의 개념을 이해하는 것이 었습니다. set-local-history를 가지고 놀면서 현재 글로벌 또는 로컬로 설정되어 있는지 알고 싶었습니다. 현재 상태를 가져와야한다고 생각했습니다 (현재 활성화 된 옵션을 얻기 위해 "setopt"를 호출하는 것과 비슷 함). 내 원래 목표는 이 Q & A 에서 이미 해결되었습니다 .
lumbric

1
예제 이전의 문장을 읽은 경우 if 테스트의 문자열이 " *globalhistory*insert*"대신 " " 이어야한다고 예상 *insert*globalhistory*합니까?
Volker Siegel

@ VolkerSiegel : 아주 좋은 지적, 감사합니다! 소스 코드를 확인하고 제공된 예제를 직접 사용해 보았습니다. 맨 페이지의 예제가 문이 아니라 잘못된 것으로 결론을 내 렸습니다 ( "알파벳순 정렬"). 답변을 수정 한 후 zsh-workers 메일 링리스트 로 경로를 보내겠습니다 .
mpy

1

사용중인 경우을 사용 tmux하여 바운드 키를 호출 할 수 있습니다 send-keys.

예 :

# Current pane
$ tmux send-keys C-r

# Some targeted pane
$ tmux send-keys -t SESSION_NAME:WINDOW_NUMBER.PANE_NUMBER C-z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.