【问题标题】:Zsh tries to correct a command to a fileZsh 尝试将命令更正为文件
【发布时间】:2013-07-01 07:06:09
【问题描述】:

Zsh 有一个功能,可以提示对当前目录中的文件进行更正。例如,如果我说cd bar,而我的意思是cd baz,那么zsh 会说:zsh: correct 'bar' to 'baz' [nyae]?

通常,这可以正常工作。但是, sudo 似乎把事情搞砸了。具体来说,假设我想用 git 对我的 apache2 目录进行版本控制。我会输入类似sudo git add . 这是运行的正确命令。但是,zsh 会提示我 zsh: correct 'git' to '.git' [nyae]? 好像它不知道 git 是一个命令,所以它认为我试图引用 .git 文件夹。

为什么会这样?在这些情况下如何让它停止提示我?

谢谢!

编辑:默认情况下,zsh 似乎会将命令的所有参数视为文件或目录。但是,我知道有一些功能可以扩展它。例如,如果我输入 git sttab,那么 zsh 会将其完成为 stash、status 或 stripspace(每个都有文档)。理想情况下,即使使用 sudo 之类的东西,我也会像 zsh 一样继续提供这样的提示(所以,我宁愿不做不正确的事情)。如何在 zsh 中自定义该功能?

【问题讨论】:

  • 奇怪的是你只用 sudo 才注意到这一点。我曾经看到emerge/cave/paludiseix(它们接受程序名称作为参数;程序名称通常与其配置目录名称相同),有时grep,我自己的在后台启动应用程序的脚本等等。结果,我禁用了除命令名称更正之外的所有更正:setopt nocorrectall.
  • 这里的问题是sudo(和emerge/…)是一个程序,git是它的参数。 Zsh 更正期望 only 程序参数中的文件(或目录)名称,因此任何接受不是文件名的东西的命令都会受到此类问题的影响。你是对的,因为sudo 不是内置的shell,zsh 不知道git 是一个命令。
  • 感谢您提供的信息!我为我的问题添加了更多描述。
  • 没有“考虑所有参数……默认情况下”这样的事情。 Zsh 完成和 zsh 更正是不同的机制,后者是不可配置的。我还希望看到它们合并(即使用完成的变体进行更正)或至少可以单独配置更正(尽管这将需要完成脚本作者编写更多代码),但这个想法将在 zsh 邮件列表中讨论。在完成之前,我将拥有setopt correctsetopt nocorrectall

标签: zsh sudo


【解决方案1】:

在命令本身之前使用nocorrect,或者定义一个别名

alias sudo="nocorrect sudo"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2018-11-21
    • 2023-02-08
    • 1970-01-01
    • 2021-04-25
    • 2021-08-26
    相关资源
    最近更新 更多