从zsh完成菜单中按编号选择

时间:2018-10-31 05:30:57

标签: zsh oh-my-zsh zsh-completion

前几天,我发现了这个导航小技巧,当我输入“ cd-”时,它可以按数字触发菜单完成。

~ cd -
0 -- ~/home
1 -- ~/home/stuff
2 -- ~/downloads
3 -- ~/wallpaper

Shell脚本语法对我来说仍然像是一门外语,但是为了获得此功能,我的目录堆栈历史记录已通过管道传递到下面的函数中。

DIRSTACKSIZE=9
DIRSTACKFILE=~/.zdirs

if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; 
   then dirstack=( ${(f)"$(< $DIRSTACKFILE)"} )
   [[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD
fi
  chpwd() {
  print -l $PWD ${(u)dirstack} >$DIRSTACKFILE

}

神奇的部分是可以从列表中选择数字,但是我发现这可能是 因为按数字导航的功能已包含在“ cd-”命令中。尽管如此,我还是想在任何地方使用它。

任何为完成菜单编写包装函数(或类似的东西)的技巧都可以在触发时从菜单中通过管道传递完成功能 并将它们显示在编号列表中,其中那些数字选择相应的元素?

我已经开始阅读本手册,而没有开始阅读,但一切仍然不透明。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您显示的代码段与完成无关。相反,它的作用是将目录堆栈记录到一个文件中,以便在zsh会话之间保留它。 (就我个人而言,我什至不确定这是个好主意。)

_complete_help ZLE小部件是开始调查zsh完成的一个好地方。默认情况下,它在zsh的^Xh(vi插入)键盘映射中绑定到viins,但在emacs键盘映射中默认未绑定。如果要在emacs键盘映射(许多人的默认设置)中使用它,则必须将其绑定:

bindkey -M emacs "^Xh" _complete_help

现在,您可以输入cd -(或cd +),然后按 CTRL-X h ,而不是 TAB kbd>。您应该看到以下输出:

tags in context :completion::complete:cd::
    directory-stack  (_directory_stack _cd)

(在这一点上,我承认我们已经接近我对zsh完成系统知识的了解。)

现在,您可以在此特定上下文中查看directory-stack标记的完成函数。您可能感兴趣的是_directory_stack,您可以通过以下方式查看该函数的内容:

functions _directory_stack

…实际上是生成这些前导数字的地方。

可以说,为其他完成上下文编写类似的完成函数,并使用zstyle来应用是可能的。但是,这是不平凡的完成魔术,这是我尝试过的一切