나는완료된 파일을 자동으로 로드zsh의 경우. 이를 위해 _myprog
fpath의 폴더에 파일을 추가했습니다.
파일은 대략 다음과 같습니다.
#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
따라서 내 프로그램에는 자동화하려는 두 가지 시나리오가 있습니다.
하위 명령을 사용하지 않을 때 원격 위치의 경로를 지정하고 싶습니다. 이는
_myprog_complete_files
function 덕분에 함수에 의해 수행됩니다_value
. 파일 목록은myprog ls
각 원격 파일을 새 줄에 인쇄하는 를 실행하여 제공됩니다.새 원격 파일을 삽입할 때 폴더 이름을 자동 완성할 수 있기를 원합니다. 이 작업은
_myprog_complete_folders
using 함수에서도 수행 되지만_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 a
tab슬래시를 추가해야 하며 테스트는 /
지금 부터 추가 완료를 방지해야 합니다.compset