在Zsh中无论上下文如何,将键绑定到完整文件名

8
有时候我想要一个文件名,而不是zsh为我猜测的文件名。例如,我有一个没有正确的.png后缀的PNG文件,这使得zsh认为它不是图片,并且在我键入Tab来完成display的参数时不会列出它。
我想知道是否有一个键序列可以在任何上下文中完成文件名,就像^XC用于_correct_filename一样,或者如何配置zsh来实现这个功能?
2个回答

9

您可以添加一个按键绑定来完成您想要的操作:

zle -C complete complete-word complete-files
bindkey '^X\t' complete
complete-files () { compadd - $PREFIX* }

编辑:添加了$PREFIX

您可以将这些行添加到您的~/.zshrc文件中。

这将使完成列表在每个步骤按下Ctrl-x Tab时列出所有文件,而不是Tab。您可以选择适合您的其他按键组合。

或者,要使ImageMagick完成始终包括所有文件,请尝试编辑(首先备份)文件/usr/share/zsh/functions/Completion/Unix/_imagemagick(或类似文件),并将其更改为注释掉以_files开头的现有行,并添加新行如下所示:

if (( $# )); then
  # _files "$@" -g "*.(#i)(${~formats//:/|})(-.)"
  _files "$@"
  return
fi

有用但不是很理想。complete-files函数只能完成当前目录下的文件。我尝试了使用_files代替它,但是出现了(eval):1: no matches found: *:all-files错误。有没有办法让它在完成cat之后的操作时表现得像样? 我希望它不仅适用于display,所以后者并不适合我的情况。 - lilydjwg
@lilydjwg: 我不明白。就我而言,complete-files 函数完成显示的方式和常规完成功能相同(除了不添加文件类型后缀,如“@”和“*”)。当我对 cat 进行正常的 tab 补全时,只会获取当前目录中的文件。 - Dennis Williamson
我的意思是,如果我输入一个路径(例如./或../或abc/,其中'/'是我键入的),然后触发函数,将不会显示任何内容。 - lilydjwg
@lilydjwg:我在complete函数中添加了$PREFIX变量。看看是否有帮助。 - Dennis Williamson

5

丹尼斯的回答没有为我扩展波浪号,所以当我尝试在foo ~/ma上调用它时,我会得到这样的东西:complete-files: no matches found: ~/ma*。不过我在zsh FAQ找到了另一种方法可以扩展它们:

zle -C complete-file complete-word _generic
zstyle ':completion:complete-file::::' completer _files
bindkey '^xF' complete-file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接