zsh를 사용하여 후행 문자를 자동으로 로드하고 관리합니다.

zsh를 사용하여 후행 문자를 자동으로 로드하고 관리합니다.

나는완료된 파일을 자동으로 로드zsh의 경우. 이를 위해 _myprogfpath의 폴더에 파일을 추가했습니다.

파일은 대략 다음과 같습니다.

#compdef myprog
_myprog () {
    local cmd
    if (( CURRENT > 2)); then
        cmd=${words[2]}
        curcontext="${curcontext%:*:*}:myprog-$cmd"
        (( CURRENT-- ))
        shift words
        case "${cmd}" in
          list|ls)
            _arguments : "--limit[Max depth]" "--folders[Print flat list of folders]"
            _describe -t commands "myprog list" subcommands
          ;;
          insert)
            _arguments : "--force[Overwrite file]" "--append[Append to existing data]"
            _describe -t commands "myprog insert" subcommands
            _myprog_complete_folders
          ;;
        esac
    else
        local -a subcommands
        subcommands=(
          "insert:Insert a new file"
          "list:List existing files"
        )
        _describe -t command 'myprog' subcommands
        _arguments : "--yes[Assume yes]" 
        _myprog_complete_files
    fi
}

_myprog_complete_files () {
    _values 'files' $(myprog ls)
}

_myprog_complete_folders () {
    _values 'folders' $(myprog ls --folders)
}

_myprog

따라서 내 프로그램에는 자동화하려는 두 가지 시나리오가 있습니다.

  1. 하위 명령을 사용하지 않을 때 원격 위치의 경로를 지정하고 싶습니다. 이는 _myprog_complete_filesfunction 덕분에 함수에 의해 수행됩니다 _value. 파일 목록은 myprog ls각 원격 파일을 새 줄에 인쇄하는 를 실행하여 제공됩니다.

  2. 새 원격 파일을 삽입할 때 폴더 이름을 자동 완성할 수 있기를 원합니다. 이 작업은 _myprog_complete_foldersusing 함수에서도 수행 되지만 _value이번에는 폴더 목록이 다음을 사용하여 생성되고 myprog ls --folder폴더만 인쇄됩니다.

<tab><tab>지금까지는 괜찮습니다... 값 목록을 표시하는 데 사용할 때 폴더 이름 뒤에 파일 이름을 입력하려고 할 때 zsh가 폴더 이름 뒤에 공백을 삽입한다는 점만 빼면요 .

예를 들어:

$ myprog insert web<tab><tab><tab>
 -- folders --
web/                          web/foo/                web/bar/

를 선택해야 합니다 web/foo. 이 작업을 효과적으로 수행하고 자동으로 수행 myprog insert web/foo/ 하지만 후행 공백을 조심하세요! 그래서 사용하고 싶은 폴더를 선택한 후( <tab>내가 부르고 싶다는 가정 하에) 삽입하고 싶은 파일명을 직접 입력하려고 하면 , 전혀 이것이 목적이 아니라는 baz것을 알게 됩니다 .myprog insert web/foo/ baz

나는 성공하지 못한 채 zsh 문서를 검색해 보았습니다. 예를 들어, zstyle ':completion::complete:myprog-insert:' add-space false.zshrc 및 파일에서 설정을 시도했지만 아무 소용이 없습니다 _myprog. 설정되어 있을 때와 설정되지 않았을 때의 차이를 알 수 없습니다.

매개변수 등을 지정하기 위해 자동 완성 후 직접 입력할 수 있는 기능이 바람직한 기능처럼 보이기 때문에 뭔가 빠진 것이 있는 것 같습니다.

답변1

add-space의 코드는 를 $fpath[-1]/_expand통한 완료와 관련이 없는 것 같습니다 _values. 이는 add-space모든 곳에서 false로 설정하거나 호출하여 _complete_debug완료 프로세스를 통과하는 코드를 확인하여 확인할 수 있습니다.

% bindkey -M viins "^t" _complete_debug
% foo 
Trace output left in /tmp/zsh438foo2 (up-history to view)

한 가지 해결책은 일반적으로 여러 값을 연결하는 데 사용되는 구분 기호를 선택적으로 삽입한 다음 구분 기호가 사용될 때 기능을 비활성화하는 함수를 -s ...사용 하는 것입니다 ._values

#compdef foo
local curcontext="$curcontext" state line

choices=(aaa bbb ccc)

_arguments '1:dir:->folders' && return 0

case "$state" in
  folders)
    if ! compset -P '*/'; then
      _values -s / folders $choices
    fi
  ;;
esac

여기서 a에는 foo atab슬래시를 추가해야 하며 테스트는 /지금 부터 추가 완료를 방지해야 합니다.compset

관련 정보