![如何让 zsh 在文件名中间完成工作?](https://linux22.com/image/82655/%E5%A6%82%E4%BD%95%E8%AE%A9%20zsh%20%E5%9C%A8%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E9%97%B4%E5%AE%8C%E6%88%90%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
这有效
通常,zsh
的制表符补全效果很好。
$ touch foo-1-bar foo-2-bar
$ touch f<Tab>
$ touch foo--bar
^ cursor here
再次按下Tab会弹出一个菜单,我可以从中选择文件。
$ touch foo--bar
foo-1-bar foo-2-bar
这不
但是,这似乎不适用于开头和结尾匹配的字符串。例如:
touch foo-bar foo-foo-bar
touch f<Tab>
touch foo-bar
^ cursor here. <tab> again.
touch foo-bar
^ cursor here.
没有显示任何菜单,也没有机会选择foo-foo-bar
。这是预期的行为还是错误?是否有设置可以使菜单出现在后一种情况下?
我在用着oh-my-zsh
。我尝试从 中删除所有与完成相关的行~/.zshrc
,但这没有什么区别。
答案1
根据评论,我尝试禁用oh-my-zsh
,这解决了这个问题。然后我浏览了oh-my-zsh
源代码,有选择地禁用模块。
我以前有过CASE_SENSITIVE="true"
,但是注释掉这一行为我解决了这个问题。显然这是一个已知错误。
~/.zshrc
为了解决这个问题,我可以在 source 之后添加以下行oh-my-zsh
。
zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
答案2
就我个人而言,我更喜欢这个解决方案 -http://zsh.sourceforge.net/FAQ/zshfaq04.html#l50,它的工作方式类似于 tcsh 中的完成,并且仅完成光标之前的单词。
只需使用
bindkey '\CI' expand-or-complete-prefix
代替
bindkey '\CI' expand-or-complete
(默认情况下)。
答案3
另一个选项是设置 COMPLETE_IN_WORD,如同一页面上所述 -http://zsh.sourceforge.net/FAQ/zshfaq04.html#l50。
setopt complete_in_word
这将尝试填充光标处的单词,并且光标点之后的所有字符将被替换为填充的内容。