zsh: 명령 이름과 파일 이름을 별도로 완성

zsh: 명령 이름과 파일 이름을 별도로 완성

파일 이름 탭 완성이 파일 이름의 시작 부분에 우선순위를 두는 것을 원하지 않습니다. 예를 들어, 파일 이름이 red_blue.txt 및 blue_red.txt인 경우 vim red가 tabred_blue.txt의 우선 순위를 지정하는 것을 원하지 않습니다.

이는 다음을 사용하여 수행할 수 있습니다.

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'

그러나 이 동작은 내가 원하지 않는 명령 이름의 탭 완성에도 적용됩니다. 예를 들어, nit tab검색 명령 "nitrogen"을 입력하면 mkinitcpio, xinit, compinit 등과 같은 명령도 일치합니다.

명령에 대해 다음 완성을 사용하고 싶습니다.

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

zsh 탭 완성이 명령 이름과 파일 이름을 다르게 처리하도록 하려면 어떻게 해야 합니까?

답변1

일반적으로 말하자면, 다듬어야 합니다.zstyle부르다따라서 모든 완성에 대해서는 작동하지 않고 파일 완성에만 작동합니다. 일반적인 완성의 경우 컨텍스트 지정자의 구문은 다음과 같습니다.:completion:WIDGET:COMPLETER:COMMAND:ARGUMENT:TAG

  • WIDGET일부 특수 위젯에 의해서만 설정되며 일반( *)은 남습니다.
  • COMPLETER정상적인 완성을 위해 사용되며 complete, 자동수정 등의 작업을 위해 다른 값을 설정할 수 있습니다.
  • COMMAND일반적으로 인수가 완료되는 명령의 이름입니다. 더 정확히 말하면 후자의 말이다 compdef. 일부 복잡한 명령은 완료되면 하위 명령을 변경합니다. 쉘 구문의 특수 위치의 경우 다음과 같습니다.대시 사이의 컨텍스트 이름예를 들어, 명령의 첫 번째 단어 위나 뒤입니다 -parameter.$-command-
  • ARGUMENT일반적으로 argument-3옵션이 아닌 세 번째 인수 또는 option--foo-1option 의 인수 와 유사합니다 --foo.
  • TAG일부 완성 함수에 의해 내부적으로 사용됩니다. 일반적으로 항상 그런 것은 아니지만 다음 중 하나입니다.일반 태그 이름.

존재하다zstyle성명, 보다 구체적인 설명이 덜 구체적인 설명보다 우선합니다.

  • 콜론이 더 많은 선언( )은 :콜론이 적은 선언보다 더 구체적입니다.
  • 동일한 수의 열이 주어지면 콜론으로 구분된 각 부분이 다른 선언의 해당 부분만큼 구체적이라면 선언은 적어도 다른 선언만큼 구체적입니다. 각 부분에 대해:
    • *그 어떤 것보다 더 구체적입니다.
    • 와일드카드가 있는 모든 항목은 와일드카드가 없는 단순한 문자열보다 더 구체적입니다.

따라서 일반적으로 명령 이름에 대한 예외를 만들려면 zstyle해당 명령과 관련된 또 다른 선언을 추가하면 됩니다.

그러나 반전이 있습니다. matcher-list완전한 기반이 아닌 글로벌 규모로 적용된다는 것입니다. 귀하의 경우에는 일치자만 원하는 한 다음을 사용할 수 있습니다.matcher대신에.

zstyle ':completion:*' matcher 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
zstyle ':completion:*:*:-command-:*' matcher 'm:{a-zA-Z}={A-Za-z}'

관련 정보