从https://linux.die.net/man/1/zshmisc:
noglob
Filename generation (globbing) is not performed on any of the words.
zsh 示例:
$ ls /*
<lots of output>
$ noglob ls /*
ls: cannot access '/*': No such file or directory
$ ls "/*"
ls: cannot access '/*': No such file or directory
在 fish 中,这适用于引号:
$ ls "/*"
ls: cannot access '/*': No such file or directory
在 fish 中是否可以做同样的事情而不需要引号?
答案1
原始答案:至于noglob
行为本身,我相当肯定答案是“不”。这个 Github 问题。
编辑/更新: 但是考虑到您在评论中描述的用例,可能还有另一种方法可以避免输入引号,尽管远不如那么简单noglob
。
为了尽可能保持简单,我在评论中略微偏离了您的示例。根据该示例,您可以noglob
在 zsh 中使用来创建别名,以便:
findf /path/*.ext
映射到find /path -name "*.ext"
我使用空格将路径和名称分隔为两个不同的参数:
findf /path *.ext
映射到find /path -name "*.ext"
嗯,有点 - 至少你会输入这些。在这种情况下,解决方法是让 fish 在你输入带有通配符的参数时自动为你添加周围的findf
引号*
。
为此,设置三个函数(其中两个只是单行函数),全部在~/.config/fish/functions
:
查找.fish:
function findf --description 'alias findf=find {path} -name {name}'
find $argv[1..-2] -name $argv[-1]
end
非常简单——只需将最后一个参数findf
作为-name
参数传递给find
。
接下来是真正的主力。 findf_binding.fish:
function findf_binding
commandline -i '*'
set -l tokens (commandline -bo)
if test (count $tokens) -gt 0
and [ $tokens[1] = "findf" ]
set -l currentToken (commandline -t)
if not contains "\"" (string split "" $currentToken)
set -l replaceToken "\""$currentToken"\""
set -l cursorPos (commandline --cursor)
commandline -t $replaceToken
commandline --cursor (math $cursorPos+1)
end
end
end
这基本上可以归结为“如果*
按下,并且行以 findf
,并且带有的参数*
尚未引用,则引用它并将光标移到 之后*
。"
最后,*
将findf_binding
fish_用户_密钥_绑定.fish:
function fish_user_key_bindings
bind '*' findf_binding
end
全面披露 - 这是我在 fish 中编写的第一个键绑定脚本。这是我一直想学习/尝试的 fish 功能,我认为这是一个很好的机会。但毫无疑问,我错过了一些极端情况,并且可以进行样式或语法改进。
例如,作为一个已知的限制,如果您想使用通配符来匹配多个路径(例如findf path* *.yaml
),此绑定也会错误地将引号添加到路径组件。
但希望这能让你接近你所寻找的东西,或者至少让你走上正确的轨道来调整它或编写你自己的。