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

したがって、私のプログラムには自動化したい2つのシナリオがあります。

  1. サブコマンドを使用しないときにリモートロケーションへのパスを指定したいと思います。これは_myprog_complete_files関数のおかげで関数によって行われます_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)

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 atabスラッシュを追加し、テストは/今後の追加完了を防ぐ必要があります。compset

おすすめ記事