bash
내 Mac에서 macOS 12.0.1을 실행 중인데 에서 으로 전환하려고 합니다 zsh
. 다음과 같은 명령을 실행하려고 합니다.
gem install pg -v 1.2.3 -- --with-pg_config=/opt/homebrew/opt/libpq/bin/pg_config
내가 닿을 수 있다면
gem install pg -v 1.2.3 -- --with-pg_config=
그런 다음 을 클릭하면 TAB
완료되지 않았습니다. 터미널 창 제목에서 약 3초(및 3회 탭) 후에 커서가 다시 나타나는 것을 볼 수 있습니다 ruby
.zsh
시기적절한 관점에서 보면 에 정의된 ctrl-C
셸 함수를 호출하는 것처럼 보입니다 ._gem
/usr/share/zsh/5.8/functions/_gem
zsh
나는 여기서 영리한 일을 하려고 한다고 생각했지만 그것이 무엇이든 작동하지 않고 필요하지도 않으며 왜 내 특정 사용 사례나 이 특정 환경에서 작동하지 않는지 상관하지 않습니다. 시스템(자작, RVM 등). 나는 단지 정상적인 파일/디렉토리 완성을 원합니다.
zsh
이 특정 기능을 제거하지 않고 비활성화할 수 있는 방법이 있습니까 /usr/share/zsh
? (아마도 다음 OS 업데이트에 다시 포함될 것입니다.)
답변1
compinit
"새로운"(1990년대) 완성 시스템을 사용한다고 가정합니다. 즉, .zshrc
귀하(또는 이를 사용하는 경우 zsh 구성 프레임워크)에 호출이 있다고 가정하면 다음 두 가지 방법으로 표준 완성을 재정의할 수 있습니다.
_gem
에 동일한 이름의 함수를 배치하여 이를 수행할 수 있습니다 . 호출되기 전에$fpath
디렉토리가 존재해야 합니다 .$fpath
compinit
- 전화해도됩니다
compdef
compinit
설정된 내용을 덮어씁니다 . 이 작업은 통화 후에 수행해야 합니다compinit
.
따라서 나중에 파일 이름을 완성하려면 gem
호출 후 다음 명령을 실행하십시오 compinit
.
compdef _files gem
그러나 그렇게 과감한 조치를 취할 필요는 없습니다. zsh가 컨텍스트에 다른 것이 필요하다고 생각하더라도 파일을 완성할 수 있는 방법이 있습니다.
개념적으로 가장 간단하지만 가장 편리한 방법은 아니지만 일시적으로 컨텍스트를 변경하는 것입니다. 예를 들어 를 입력하고 ;l
파일 이름을 입력한 다음 삭제합니다 ;l
. 또는 Home 0
End파일 이름을 입력합니다 Home Del End.
당신은 묶을 수 있습니다_bash_complete-word
/
예를 들어 키 바인딩을 종료 ^X/
한 다음 ^X/
아무 곳이나 눌러 파일 이름을 완성하세요. 귀하의 경우 --with-pg_config
이 위젯은 구분 기호로 간주되지 않으므로 등호 대신 공백을 넣은 경우에만 작동합니다 =
.
당신은 이점을 누릴 수 있습니다_most_recent_file
, 기본적으로 바인딩됩니다 ^Xm
. 컨텍스트에 관계없이 최신 파일 이름이 완성됩니다. 귀하의 경우 --with-pg_config
이 위젯은 구분 기호로 간주되지 않으므로 등호 대신 공백을 넣은 경우에만 작동합니다 =
. 예를 들어: --with-pg_config /o
^Xm
/h
^Xm
/o
^Xm
/*pq
^Xm
…
당신은 할 수정의당신 자신위젯 완성파일을 완성하고 키에 바인딩합니다.
_complete_files () {
if [[ $PREFIX == [-0-9A-Z_a-z]##=* ]]; then
IPREFIX+=${PREFIX%%\=*}=
PREFIX=${PREFIX#*=}
fi
_main_complete _files
}
zle -C _complete_files complete-word _complete_files
bindkey '\e^F' _complete_files
그런 다음 아무 곳이나 눌러 Ctrl+Alt+F파일 이름을 완성할 수 있습니다. 이 함수는 문맥에 관계없이 현재 쉘 단어를 완성하지만 와 같은 접두사는 무시합니다 --option=
.