在Zsh中上下文所在的位置绑定键以完成文件名

在Zsh中上下文所在的位置绑定键以完成文件名,zsh,zsh-completion,Zsh,Zsh Completion,有时我想要一个文件名,而不是zsh为我猜测的文件名。例如,我有一个PNG文件,没有正确的.PNG后缀,这使zsh认为它不是图片,当我键入选项卡以完成显示的参数时,不会列出它 我想知道无论上下文在哪里,文件名是否都有一个完整的键序列,比如^XC对于\u correct\u filename,或者如何配置zsh来完成这项工作?您可以添加一个键绑定来完成您想要的操作: zle -C complete complete-word complete-files bindkey '^X\t' complet

有时我想要一个文件名,而不是zsh为我猜测的文件名。例如,我有一个PNG文件,没有正确的
.PNG
后缀,这使zsh认为它不是图片,当我键入
选项卡
以完成
显示
的参数时,不会列出它


我想知道无论上下文在哪里,文件名是否都有一个完整的键序列,比如
^XC
对于
\u correct\u filename
,或者如何配置zsh来完成这项工作?

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

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/\u ImageMagick
(或类似文件),并将其更改为注释掉以
\u files
开头的现有行,然后添加新行,如图所示:

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

丹尼斯的回答没有为我扩展tilde,所以当我试图在
foo~/ma
上调用它时,我会得到类似
complete files:no-matches:~/ma*
。我确实在中找到了一个替代方案,可以扩展它们,不过:

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

有用但不太理想。
完成文件
功能只能完成当前目录下的文件。我尝试了
\u files
而不是它,但得到了一个
(eval):1:未找到匹配项::::::all files
错误。是否有办法使其在
cat
之后完成时的行为类似?我希望它不仅能用于
显示
,所以后者不适合我的情况。@lilydjwg:我不明白。对我来说,complete files函数和completing For的显示方式与常规completion For cat的显示方式相同(除了没有添加“@”和“*”等文件类型后缀。当我为cat执行常规选项卡完成操作时,我只获取当前目录中的文件。我的意思是,如果我键入路径(例如./or../或abc/,在键入的路径中加上“/”)然后触发该函数,将不显示任何内容。@lilydjwg:I在
complete
函数中添加了
$PREFIX
变量。查看是否有帮助。