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

mrb*_*mrb 3 zsh autocomplete

zsh 具有命令行制表符补全执行上下文感知补全的功能,因此您可以执行以下操作:

# Good:

$ wget g<tab>    # becomes:
$ wget gopher://

$ wget --hea<tab>    # becomes:
$ wget --header=
Run Code Online (Sandbox Code Playgroud)

我喜欢这个功能,但有时它会阻止我在 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
Run Code Online (Sandbox Code Playgroud)

我已经^I绑定到expand-or-complete(默认小部件)。我想要的是有一个不同的键执行未过滤的文件名扩展,例如:

# Desired behaviour:

$ adb push v<shift-tab>     # would become:
$ adb push vs-debug.apk
Run Code Online (Sandbox Code Playgroud)

我在zshzle(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)。

Gil*_*il' 5

虽然没有内置的小部件,但定义一个小部件很容易。我假设您正在使用 \xe2\x80\x9cnew-style\xe2\x80\x9d 完成系统(由 加载compinit)。

\n\n
_complete_files () {\n  eval "$_comp_setup"\n  _main_complete _files\n}\ncompdef -k _complete_files complete-word \'^X/\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

完成函数遵循 zsh 发行版中定义的函数Completion/Base。内置compdef函数将该函数声明为完成小部件并将其绑定到一个键。

\n