접두사와 일치하지 않는 zsh 완성에서 자동 완성 제안을 제공하는 방법

접두사와 일치하지 않는 zsh 완성에서 자동 완성 제안을 제공하는 방법

값을 기반으로 퍼지 검색을 수행하고 제안을 반환하는 gdzsh autocomplete라는 명령이 있습니다 . $words[CURRENT]검색은 제대로 작동하지만 입력한 텍스트가 제안된 접두사가 아니기 때문에 zsh는 어떤 후보도 표시하지 않습니다.

예를 들어

% gd hw

생성될 수 있다oh hello there, world

hw그러나 zsh는 제안 시작 부분에서 찾을 수 없기 때문에 이를 표시하지 않습니다 .

선택 시 현재 단어를 바꾸도록 zsh에서 제안을 제공하도록 할 수 있습니까?

_gd다음은 my 라는 파일에 있는 완성 스크립트의 단순화된 버전입니다 fpath.

#compdef gd

_gd() {
  local -a list

  clue="$words[CURRENT]"

      pattern=""
      for i in $(seq $#clue)
      do
        pattern="$pattern.*${clue[i]}"
      done
      while read dir
      do
        list=( $list $dir )
      done <<<$(grep "$pattern" ~/.recent-dirs)

  _describe gd list
}

답변1

함수 를 제거 _gd하고 파일에 다음을 추가합니다 .zshrc.

autoload -Uz compinit
compinit
zstyle ':completion:*' matcher-list 'r:|?=**'

이는 입력하는 내용 사이와 그 주변에 추가 콘텐츠를 허용하도록 완성 코드에 지시합니다. 이를 통해 Zsh는 이제 완료를 흐리게 할 수 있습니다.아무것.

  • r:X|Y=Z패턴과 일치하는 겹치지 않는 모든 하위 문자열을 찾아 XY일치 항목으로 만듭니다.X 반품Z일치가 완료되면 패턴과 일치하는 항목이 있는지 확인하세요.
  • ?임의의 문자와 일치합니다.
  • 같 거나 X같으면 임의 개수의 연속 문자와 일치합니다.Y*
  • Z같음 인 경우 *임의 개수의 연속 문자와 일치합니다.와는 별개로무엇이든 일치합니다 Y.
  • Z같음 인 경우 **임의 개수의 연속 문자와 일치합니다.
  • 에서는 빈 문자열과 같습니다 r:|?=**.X
  • 기본적으로 Zsh는 이미 입력 끝에 와일드카드를 추가하여 전체 퍼지 일치 주기를 완료합니다.

여기에서 문서를 찾을 수 있습니다:http://zsh.sourceforge.net/Doc/Release/Completion-Widgets.html#Completion-Matching-Control

답변2

좀 더 합리적인 답변을 기다리는 동안 이것은 해킹입니다 ...

내가 한 일은 제안 생성기가 다음과 같은 제안을 생성하도록 하는 것뿐이었습니다.

hw»oh hello there, world

명령(실제로는 함수)이 내가 제어할 수 있으므로 처음부터 쓰레기를 제거하기만 하면 됩니다.

input="${input#*»}"

하지만 올바르게 수행하는 방법을 아는 것이 좋을 것입니다.

관련 정보