완성 메뉴가 열려 있을 때 zle 위젯을 여러 번 반복하는 방법은 무엇입니까?

완성 메뉴가 열려 있을 때 zle 위젯을 여러 번 반복하는 방법은 무엇입니까?

저는 zsh쉘을 사용하고 있으며 완성 메뉴를 열 때 Vim의 버퍼에서 사용하는 것과 유사한 키를 사용하도록 일부 키 바인딩을 설치하려고 합니다.

따라서 키맵 내부에 다음 줄을 추가하여 menuselectj와 위젯을 k바인딩 합니다 .zledown-line-or-historyup-line-or-history~/.zshrc

bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history

down-line-or-history그리고 다음과 같이 up-line-or-history설명됩니다 .man zshzle

down-line-or-history (^N ESC-[B) (j) (ESC-[B)
        Move down a line in the buffer, or if already at the bottom line, move to the next event in  the  his‐
        tory list.

up-line-or-history (^P ESC-[A) (k) (ESC-[A)
        Move up a line in the buffer, or if already at the top line, move to the previous event in the history
        list.

C-d이제 동일한 위젯에 및 를 바인딩 하고 싶지만 C-u원하는 만큼 반복할 수 있습니다(예: ) 5.

처음에는 다음과 같은 간단한 코드를 시도했습니다.

some-widget() {
    zle backward-char -n 5
}
zle -N some-widget
bindkey '^D' some-widget

C-dzle 위젯에 바인딩되어 있지만 여러 번 backward-char반복됩니다 .5

그런 다음 키 바인딩을 기본 키맵에서 키맵으로 이동하는 코드를 다시 작성해 보았습니다 menuselect.

some-widget() {
    zle backward-char -n 5
}
zle -N some-widget
bindkey -M menuselect '^D' some-widget

C-d하지만 완성 메뉴가 열려 있는 동안 클릭 하면 바인딩된 기본 위젯을 실행하는 것처럼 zle보이기 때문에 예상한 대로 작동하지 않습니다 .C-ddelete-char-or-list

delete-char-or-list (^D) (unbound) (unbound)
        Delete the character under the cursor.  If the cursor is at the end of the line, list possible comple‐
        tions for the current word.

5현재 완성 메뉴를 종료하고 커서를 여러 번 뒤로 이동하는 대신 현재 단어에 대해 가능한 완성을 나열합니다 .

예상대로 작동한다면 결국 다음과 같은 최종 코드를 사용하게 될 것입니다.

fast-down-line-or-history() {
    zle down-line-or-history -n 5
}
zle -N fast-down-line-or-history
bindkey -M menuselect '^D' fast-down-line-or-history

fast-up-line-or-history() {
    zle up-line-or-history -n 5
}
zle -N fast-up-line-or-history
bindkey -M menuselect '^U' fast-up-line-or-history

zle하지만 그렇지 않기 때문에 완성 메뉴가 열렸을 때 위젯을 반복하는 방법을 찾아야 합니다 .

down-line-or-history완성 메뉴가 열린 상태에서 클릭하면 여러 번 반복 되도록 이전 코드를 수정하려면 어떻게 해야 합니까 ?5C-d

답변1

위젯 때문에 코드가 작동하지 않습니다."메뉴 선택 그래프에서는 항상 동일한 작업을 수행하며, 사용자가 정의한 위젯으로 대체하거나 기능 세트를 확장할 수 없습니다.".

그러나 다음과 같은하다일하다:

bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'k' up-line-or-history
bindkey -M menuselect -s '^D' 'jjjjj'
bindkey -M menuselect -s '^U' 'kkkkk'

-s옵션을 사용하면 마치 직접 입력한 것처럼 ZLE(Zsh Line Editor)에 입력될 텍스트 문자열을 지정할 수 있습니다. 이제 ctrlD를 누르면 j5번의 누름이 발생하여 원하는 효과를 얻을 수 있습니다.

하지만 특별히 빠르지는 않으니 주의하세요. 실제로 커서가 한 번에 한 단계씩 위나 아래로 5단계씩 움직이는 것을 볼 수 있습니다.

관련 정보