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