zsh 완료 및 해당 메뉴의 동작을 수정하려고 합니다. 막혔어요. 너무 많은 문서를 읽어서 머리가 어지러워졌습니다.
다음은 단지 예일 뿐입니다. 저는 구체적이지 않은 답변을 선호합니다 cd
.
나는 명시적으로 완료되었을 때 선택 메뉴()만 표시하도록 zsh를 설정했습니다 zstyle ':completion:*:*:*:*:*' menu select=2
.
나는 별칭을 가지고 있습니다 alias cd='nocorrect cd'
. cd<TAB>
공백 없이 이 작업을 수행하면 zsh는 그것이 명시적이라고 생각하고 별칭을 완성합니다. zsh는 그것이 모호하지 않다고 생각합니다. 실제로 제가 이 작업을 수행하면 cd<^D>
가능한 완료가 하나만 표시됩니다. 다른 완성 옵션(예: )을 표시해야 할 것 같습니다 cdiff
. 실제로 이 작업을 수행하면 cd<^Xn>
다른 옵션이 표시됩니다. 이것은 또한ZSH 사용자 가이드, 섹션 6.5.2.
나는 무슨 일이 일어나고 있는지 이해하는 것 같았습니다. zstyle ':completion:*' completer _expand _expand_alias _complete _ignored _match _correct _approximate _prefix
해당 별칭을 확장하는 것이 우선 순위라고 생각하는 이유를 이해할 수 있도록 완료자를 설정했습니다 . 왜 이런 일이 일어나는지 이해가 안 돼요오직옵션.
나는 이것이 tag-order
사용자 가이드의 두 번째 예와 관련이 있다고 생각합니다.섹션 6.4.2. 그러나 :completion::complete:-command-::
이 컨텍스트()에 대해 이와 같은 설정이 없으며 상속할 수 있는 다른 항목도 없습니다.
내 완료 관련 설정은 모두이 파일은 Github에 있습니다. 거기에서 위로 올라가면 내 zsh 구성의 전체 내용을 볼 수 있습니다. 그러나 :completion:
내 파일을 포함하여 이 파일 외부에는 아무것도 설정 하지 않았 .zshrc
으므로 이를 재정의하는 것이 있는지 의심됩니다.
그렇다면 내가 원하는 행동을 얻기 위해 무엇을 해야 하는지 누군가 나에게 설명해 줄 수 있습니까?
참고로 저는 Prezto 프레임워크와 함께 zsh를 사용하고 있는데 문제는 내장된 zsh 기능 및 모듈과 전적으로 관련되어 있기 때문에 이는 관련이 없다고 생각합니다.
일부 출력:
cd<TAB>
: cd
으로 변경되었을 뿐입니다 nocorrect cd
. 메뉴가 없습니다.
$ cd<^D>
-- alias --
nocorrect cd
$ cd<^Xn>
-- external command --
cdbs-edit-patch cd-fix-profile cdiff
cd-create-profile cd-iccdump
-- builtin command --
cd
-- shell function --
cdls
-- alias --
cd
-- parameter --
CDPATH cdpath
답변1
@Ilua의 답변작동하지 않았지만 무엇을 검색해야 할지에 대한 몇 가지 아이디어를 얻었고 문제를 해결했습니다.
내가 필요한 스타일은 다음 과 같습니다 regular
.man zshcompsys
regular
This style is used by the _expand_alias completer and bindable command.
If set to ‘true’ (the default), regular aliases will be expanded but only in command position.
If it is set to ‘false’, regular aliases will never be expanded.
If it is set to ‘always’, regular aliases will be expanded even if not in command position.
나는 그것을 사용했고 zstyle ':completion:*' regular 'false'
훌륭하게 작동합니다.
답변2
accept-exact
false로 설정하고 싶은 스타일을 찾고 계신 것 같아요 .
manzshcompsys
accept-exact
This is tested for the default tag in addition to the tags valid for the current context. If it is set to `true' and any of the trial matches is the same as the string on the command line, this match will immediately
be accepted (even if it would otherwise be considered ambiguous).