Zsh:使单个文件选择智能、时尚且功能正确(突出显示、光标下方的完成等)

Zsh:使单个文件选择智能、时尚且功能正确(突出显示、光标下方的完成等)

我希望使用 zsh 拥有一个近乎完美的“单文件选择器”。到目前为止,我还没有看到任何问题,因为他们倾向于关注命令行的 zle 设置。假设我们正在编写一个文件选择器,提示用户在某个目录中提供单个文件。下面是我的起始代码,可以工作,但需要进行多项改进:

  1. 突出显示:当前菜单选项应反白突出显示。
  2. 顺序:可能的文件补全应显示在提示下方。
  3. 提示步进:在打印上面可能的选项后,提示不应向下步进。这与2有关。
  4. 仅一个:仅按 Tab 键完成第一项,因为我们只要求用户提供 1 个文件名,而不是多个。 (这就是我所说的“功能正确”的意思)
  5. 大小:如果可能的完成数量超出了提示下方的范围,则可以优雅地处理这种情况。假设有备用屏幕,并且没有可用的屏幕移动或滚动。
  6. 奖励:如果您能想到单个文件选择器的另一个好功能,请随意添加。不过,最好将其放在单独的列表中或带有注释来确定如何从上述 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/

它是这样的: foofiles.zsh 文件完成运行

这很接近(齐姆的文件完成): zim 文件完成运行

相关内容