ZSH: ZLE 위젯을 직접 호출하는 방법은 무엇입니까?

ZSH: ZLE 위젯을 직접 호출하는 방법은 무엇입니까?

문서에는 섹션에 나와 있습니다.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.

내가 도대체 ​​뭘 잘못하고있는 겁니까? 바인드키 없이 위젯을 호출하는 것이 어떻게 가능합니까? 현재 상태를 어떻게 인쇄할 수 있나요? ( set-local-history상태를 전환합니다)

답변1

(emacs 바인딩) 또는 (vi 바인딩) execute-named-cmd에 바인딩된 위젯으로 위젯을 실행할 수 있습니다 .ESC-x:

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 상태를 설명하는 공백으로 구분된 단어 집합을 포함합니다.

현재 표시되는 상태는 overwrite-mode 또는 vi-replace 위젯에 의해 설정된 삽입 모드와 set-local-history 위젯에 의해 제어되는 내역 명령이 가져온 항목을 방문할지 여부입니다. 문자열에는 insert 명령줄에 삽입할 문자가 기존 문자를 오른쪽으로 이동하는 경우 또는 overwrite삽입할 문자가 기존 문자를 덮어쓰는 경우가 포함됩니다.localhistory로컬 기록 명령만 방문할지 또는 globalhistory가져온 기록 명령도 방문할지 여부가 포함됩니다 .

하위 문자열은 알파벳 순서로 정렬되므로 미래에 대비한 두 개의 특정 하위 문자열을 테스트하려는 경우 다음을 수행하여 일치를 수행할 수 있습니다.

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

의 모든 인용문은 man zshzle.

답변2

를 사용하는 경우 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

관련 정보