
私完了したファイルを自動的にロード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
したがって、私のプログラムには自動化したい2つのシナリオがあります。
サブコマンドを使用しないときにリモートロケーションへのパスを指定したいと思います。これは
_myprog_complete_files
関数のおかげで関数によって行われます_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)
1つの解決策は、通常、複数の値を連結するために使用される区切り文字を選択的に挿入し、区切り文字が使用されたときに機能を無効にする関数を-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