有没有一种像 fish 一样的方法来执行 zsh 的 noglob 内置命令?

有没有一种像 fish 一样的方法来执行 zsh 的 noglob 内置命令?

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_bindingfish_用户_密钥_绑定.fish

function fish_user_key_bindings
    bind '*' findf_binding
end

全面披露 - 这是我在 fish 中编写的第一个键绑定脚本。这是我一直想学习/尝试的 fish 功能,我认为这是一个很好的机会。但毫无疑问,我错过了一些极端情况,并且可以进行样式或语法改进。

例如,作为一个已知的限制,如果您想使用通配符来匹配多个路径(例如findf path* *.yaml),此绑定也会错误地将引号添加到路径组件。

但希望这能让你接近你所寻找的东西,或者至少让你走上正确的轨道来调整它或编写你自己的。

相关内容