zsh: foo를 만들어요* 즉시 foo 확장*

zsh: foo를 만들어요* 즉시 foo 확장*

최근에 bash에서 zsh로 전환했습니다. 한 가지 차이점은 bash에 명령을 입력하고 Esc-*(vi 편집 모드에서)를 수행하면 bash가 즉시 glob 인라인을 확장한다는 것입니다. 예를 들어, 다음을 입력하면:

$ ls
bar foo1 foo2 foo3
$ cp foo<Esc>*

bash는 명령을 다음과 같이 변경합니다.

$ cp foo1 foo2 foo3

줄 끝 부분에 커서를 놓으면 다시 삽입 모드로 돌아갑니다. zsh가 동일한 작업을 수행하도록 하려면 어떻게 해야 합니까?

답변1

기본 구성에서는 다음에서 이 효과를 얻을 수 있습니다.expand-word^X *Emacs 모드에서는 ( ) 에 바인딩되어 있습니다 Ctrl+X *(Vi 모드에서 사용하려면 키에 바인딩해야 합니다). ESC *bash와 달리 ^X *zsh는 변수 및 명령 대체도 확장합니다.

또한 기본 구성에서는 Tab와일드카드가 포함된 단어 뒤를 누르면 해당 단어가 일치하는 목록으로 확장됩니다.

당신에게 선택권이 있다면glob_completeTab모든 일치 항목을 삽입하는 대신 일치 항목을 켜고 반복합니다. 이 경우에는 할 수 있습니다_all_matches완성자(의지하다스티븐 차제라스 코멘트). 매뉴얼의 예제 코드를 인용하면 다음과 같습니다.

setopt glob_complete
zle -C all-matches complete-word _generic
bindkey '^Xa' all-matches
zstyle ':completion:all-matches::::' completer _all_matches _complete
zstyle ':completion:all-matches:*' insert true

Tab완성 위젯(기본값과 this )과 내장 위젯 all-matches의 차이점은 expand-word완성 expand-word컨텍스트에 관계없이 쉘 파일 이름 확장을 수행하는 반면, Tab완성 all-matches컨텍스트는 와일드카드 처리 방법을 결정하는 데 사용된다는 것입니다. 예를 들어, 다음은 rmdir *모든 ^X*파일로 확장되지만 ^Xa디렉터리로만 확장됩니다.

관련 정보