zsh 扩展或完成所有文件,无论命令/上下文如何

zsh 扩展或完成所有文件,无论命令/上下文如何

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。这compdefbuiltin 将函数声明为完成小部件并将其绑定到键。

答案2

我想更好的方法是让 zsh 执行正确的补全。看一眼zsh-完成。它是各种程序的完成集合。也有完成的adb

相关内容