前几天,我发现了这个导航小技巧,当我输入“ 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-”命令中。尽管如此,我还是想在任何地方使用它。
任何为完成菜单编写包装函数(或类似的东西)的技巧都可以在触发时从菜单中通过管道传递完成功能 并将它们显示在编号列表中,其中那些数字选择相应的元素?
我已经开始阅读本手册,而没有开始阅读,但一切仍然不透明。谢谢!
答案 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
来应用是可能的。但是,这是不平凡的完成魔术,这是我尝试过的一切