![Zsh:使单个文件选择智能、时尚且功能正确(突出显示、光标下方的完成等)](https://linux22.com/image/216828/Zsh%EF%BC%9A%E4%BD%BF%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6%E9%80%89%E6%8B%A9%E6%99%BA%E8%83%BD%E3%80%81%E6%97%B6%E5%B0%9A%E4%B8%94%E5%8A%9F%E8%83%BD%E6%AD%A3%E7%A1%AE%EF%BC%88%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E3%80%81%E5%85%89%E6%A0%87%E4%B8%8B%E6%96%B9%E7%9A%84%E5%AE%8C%E6%88%90%E7%AD%89%EF%BC%89.png)
我希望使用 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/
这很接近(齐姆的文件完成):