zsh 具有命令行制表符补全执行上下文感知补全的功能,因此您可以执行以下操作:
# Good:
$ wget g<tab> # becomes:
$ wget gopher://
$ wget --hea<tab> # becomes:
$ wget --header=
我喜欢这个功能,但有时它会阻止我在 zsh 认为其他内容更合适的上下文中完成文件名:
# Bad:
$ file vs-debug.apk
vs-debug.apk: Zip archive data, at least v2.0 to extract
$ adb push v<tab> # becomes:
$ adb push version
我已经^I
绑定到expand-or-complete
(默认小部件)。我想要的是有一个不同的键执行未过滤的文件名扩展,例如:
# Desired behaviour:
$ adb push v<shift-tab> # would become:
$ adb push vs-debug.apk
我没看到什么扎什勒(1)看起来很合适,但我还是尝试了以下其他小部件:
expand-or-complete-prefix
menu-expand-or-complete
expand-cmd-path
expand-word
我不想失去上下文感知的完成。关于如何使用备用键绑定执行未过滤的文件名扩展/完成有什么想法吗?
我正在使用 zsh 5.0.2 (x86_64-apple-darwin12.4.0) 和 zsh 4.3.17 (i686-pc-linux-gnu)。
答案1
虽然没有内置的小部件,但定义一个很容易。我假设您正在使用“新式”完成系统(由 加载compinit
)。
_complete_files () {
eval "$_comp_setup"
_main_complete _files
}
compdef -k _complete_files complete-word '^X/'
完成函数遵循 zsh 发行版中定义的函数Completion/Base
。这compdef
builtin 将函数声明为完成小部件并将其绑定到键。
答案2
我想更好的方法是让 zsh 执行正确的补全。看一眼zsh-完成。它是各种程序的完成集合。也有完成的adb
。