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

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

gd값을 기반으로 퍼지 검색을 수행 하고 제안을 반환하는 명령에 대한 zsh 자동 완성 기능이 있습니다 $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#*»}"

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

관련 정보