gem 명령의 zsh "지능형" 자동 완성을 비활성화하지만 일반적인 경로 완성은 유지합니다.

gem 명령의 zsh "지능형" 자동 완성을 비활성화하지만 일반적인 경로 완성은 유지합니다.

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디렉토리가 존재해야 합니다 .$fpathcompinit
  • 전화해도됩니다compdefcompinit설정된 내용을 덮어씁니다 . 이 작업은 통화 후에 수행해야 합니다 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=.

관련 정보