
zshを使って、ほぼ完璧な「シングルファイルセレクタ」を持っていたいと思います。これまでは、コマンドラインzleの設定に焦点を当てる傾向があるため、何の問題も見られませんでした。ユーザーにディレクトリ内の単一のファイルを要求するファイルセレクタを作成するとします。以下はうまくいきますが、いくつかの改善が必要なスタートコードです。
- 強調表示:現在のメニューオプションを反転画像で強調表示する必要があります。
- 手順:可能なファイルの完了がプロンプトの下に表示されるはずです。
- プロンプトステップバイステップ:上記の可能なオプションを印刷した後は、プロンプトを下に進めないでください。これは2に関連しています。
- 1つだけ:ユーザーに複数のファイル名を1つだけ要求するので、最初の項目を完了するにはTabキーのみを押します。 (これは「機能的に正しい」ことを意味します。)
- サイズ:可能な完了回数がヒントの下の範囲を超えると、正常に処理できます。バックアップ画面があり、画面の移動やスクロールができないとします。
- ボーナス:シングルファイルセレクタのもう1つの良い機能がある場合は、自由に追加してください。ただし、別のリストに入れるか、上記の回避策1〜5から削除する方法を説明する説明と一緒に入れることをお勧めします。
注:答えはスタンドアロンzshコードです。ユーザーが.zshrcを編集したり、一部のzsh拡張/プラグイン/フレームワーク/ライブラリをインストールしたりする必要はありません。
foofiles.zsh
一時ディレクトリのchmodにファイルを作成して実行します。
#!/usr/bin/env zsh
setopt extendedglob
setopt globcomplete
setopt nomenucomplete
mkdir ./foo 2>/dev/null
cd ./foo
touch abcd ebcf gbch ijkl mnop qrst unov wxyz
cd ..
function foofileselector {
cd ./foo/
local curcontext=foofileselector:::
vared -p "Select file: " -c foofile;
cd ..
}
function _foofileselector {
_files -W ./foo/
}
zstyle ':completion:foofileselector:*:' insert-tab false completer _foofileselector
autoload -Uz compinit && compinit
foofileselector
[[ -z $foofile ]] && foofile="NIL"
echo "You selected: $foofile"
rm -rf ./foo/
これは近いです(ジムファイルが完了しました):