bash에서 zsh로 전환하려고 하는데 zsh에서 한 가지 큰 불편함을 발견했습니다. 설정 해제 menucomplete
옵션, 바인딩 tab
및 expand-or-complete-prefix
바인딩 alt-s
이 있습니다 menu-complete
.
그러나 을 눌러 메뉴 완성을 호출하면 bash처럼 메뉴 완성을 종료하고 마지막으로 표시된 항목에서 완성을 수행하는 대신 alt-s
후속 클릭이 계속해서 메뉴 완성 항목을 순환합니다. 내가 이것을 원하는 주된 이유는 여러 개의 중첩된 디렉토리로 원 하거나 이동하려는 경우 표시된 마지막 디렉토리로 신속하게 "이동"할 수 있기 tab
때문입니다 .cd
ls
저는 zsh 버전 5.8을 사용하고 있으며 ~/.zshrc에 다음이 있습니다.
setopt autolist
unsetopt automenu autoremoveslash listambiguous menucomplete
bindkey '^i' expand-or-complete-prefix # Bind tab
bindkey '^[s' menu-complete # Bind alt-s to menu-complete
다음은 실제 예입니다.
$ mkdir dir dir/a dir/b dir/b/d dir/c
$ ls dir/ <alt-s>
$ ls dir/a/ <alt-s>
$ ls dir/b/ <tab>
$ ls dir/c/ <tab>
$ ls dir/a/ <tab>
$ ls dir/b/ <tab>
$ ls dir/c/
...etc.
tab
대신 bash처럼 "입력" 하고 싶습니다 .dir/b/
$ ls dir/ <alt-s>
$ ls dir/a/ <alt-s>
$ ls dir/b/ <tab>
$ ls dir/b/d/ <-- Pressing tab exits menu-complete and immediately goes into the currently displayed directory.
내가 어떻게 이런 행동을 할 수 있는지 아는 사람이 있나요? 당신의 도움을 주셔서 대단히 감사합니다!
편집하다:
~/.zshrc 에 다음을 추가하여 menuselect
약간 완화된 솔루션을 찾았습니다 .zsh/complist
zmodload -i zsh/complist
bindkey -M menuselect '^i' accept-line
zstyle ':completion:*' menu select=1
이제 작업이 진행되는 tab
동안 menu-complete
종료를 누르세요 menu-complete
. 그러나 마지막으로 표시된 디렉토리에 "입력"되지 않으며 tab
마지막으로 표시된 디렉토리에서 자동 완성을 수행하려면 다시 눌러야 합니다. 따라서 tab
bash에서 한 번 누르는 대신 zsh에서 두 번 누르는 것이 동일한 기능을 얻습니다.
다른 옵션이 있습니다 menuselect
.
bindkey -M menuselect '^i' accept-and-infer-next-history
간단히 누르면 표시된 마지막 디렉터리에 "입력"되지만 tab
원하는 대로 정상적으로 완료되지 menu-select
않고 해당 디렉터리에서 실행됩니다 .tab
단 한 번의 키 입력으로 이 기능을 얻을 수 있는 방법을 아는 사람이 있다면 tab
감사하겠습니다. menuselect
예를 들어 사용자 정의 zle 명령을 작성할 수 있습니까 accept-and-complete-next-history
?
답변1
여기에서 요청한 작업을 수행하도록 Zsh의 완성 시스템을 구성하려면 실제로는 가능하지만 꽤 많은 코드 줄이 필요합니다. 직접 만드는 것보다 내 것을 사용하는 것이 좋습니다zsh-autocomplete
끼워 넣다대신에. 이는 다음을 제공합니다:
- 내용을 입력하면 완료 항목이 자동으로 나열됩니다.
- 누를 필요가 없습니다 ⇥ Tab.
- 선택 범위를 좁히려면 더 많이 입력하세요.
- 이것은 퍼지 자동 완성을 지원합니다. 즉, 다음에 입력하는 내용이 대상 단어의 오른쪽에 있는 한 찾고 있는 단어의 어떤 부분이라도 입력할 수 있다는 의미입니다.
- 상단 삽입을 눌러 ⇥ Tab완료하세요.
- 디렉터리인 경우 하위 디렉터리가 자동으로 나열됩니다.
- 헹구고 거품을 내고 반복하십시오.
- 상단에서 원하는 완성을 얻을 수 없는 경우 ↓ Down(다른 화살표 키와 함께)를 사용하여 탐색할 수 있습니다.
- 원하는 완성이 전혀 표시되지 않으면 을 눌러보세요 ⌃ Ctrl␣ Space. 이로 인해 추가 완료가 표시됩니다(있는 경우).
답변2
글쎄요, 당신의 zsh-autocomplete
플러그인이 재미있어 보이는군요 Mr. Malone, 확인해 보아야 할 것입니다.
어쨌든 원래 문제에 대한 해결책을 찾았습니다. 기본적으로 나는 내가 원하는 것을 수행하는 간단한 위젯을 만들었습니다. ~/.zshrc에서:
zmodload -i zsh/complist
accept-and-complete-next-history() {
zle expand-or-complete-prefix
}
zle -N accept-and-complete-next-history
bindkey -M menuselect '^i' accept-and-complete-next-history
zstyle ':completion:*' menu select=1
또는 동등하게:
zmodload -i zsh/complist
bindkey -M menuselect '^i' .expand-or-complete-prefix
zstyle ':completion:*' menu select=1