我希望使用 zsh 拥有一个近乎完美的“单文件选择器”。到目前为止,我还没有看到任何问题,因为他们倾向于关注命令行的 zle 设置。假设我们正在编写一个文件选择器,提示用户在某个目录中提供单个文件。下面是我的起始代码,可以工作,但需要进行多项改进:
- 突出显示:当前菜单选项应反白突出显示。
- 顺序:可能的文件补全应显示在提示下方。
- 提示步进:在打印上面可能的选项后,提示不应向下步进。这与2有关。
- 仅一个:仅按 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/
这很接近(齐姆的文件完成):