为什么 zsh 在运行 bundler 时要求将 rspec 更正为 spec?
✗ rspec --version
2.12.2
✗ bundle exec rspec --version
zsh: correct 'rspec' to 'spec' [nyae]? n
2.12.2
系统:
- Ubuntu 12.10
- 使用 rvm
我该如何解决这个问题?谢谢!
更新:
ctrl-x h
按照bundle exec
@mpy 的要求
✗ bundle exec
tags in context :completion::complete:bundle::
all-files (_files _default (eval))
更新2:
[[ -o correctall ]] && echo enabled
enabled # on both machines
回答评论:spec
是一个目录
我按照以下手动安装https://github.com/zsh-users/zsh-completions
✗ echo $fpath
/home/ole/app/zsh-completions/src /scripts/zsh/Completion /home/ole/.oh-my-zsh/plugins/ruby /home/ole/.oh-my-zsh/plugins/bundler /home/ole/.oh-my-zsh/plugins/zeus /home/ole/.oh-my-zsh/plugins/rvm /home/ole/.oh-my-zsh/plugins/rails3 /home/ole/.oh-my-zsh/plugins/git-extras /home/ole/.oh-my-zsh/plugins/git-flow /home/ole/.oh-my-zsh/plugins/git /home/ole/.oh-my-zsh/functions /home/ole/.oh-my-zsh/completions /usr/local/share/zsh/site-functions /usr/share/zsh/vendor-functions /usr/share/zsh/vendor-completions /usr/share/zsh/functions/Calendar /usr/share/zsh/functions/Chpwd /usr/share/zsh/functions/Completion /usr/share/zsh/functions/Completion/AIX /usr/share/zsh/functions/Completion/BSD /usr/share/zsh/functions/Completion/Base /usr/share/zsh/functions/Completion/Cygwin /usr/share/zsh/functions/Completion/Darwin /usr/share/zsh/functions/Completion/Debian /usr/share/zsh/functions/Completion/Linux /usr/share/zsh/functions/Completion/Mandriva /usr/share/zsh/functions/Completion/Redhat /usr/share/zsh/functions/Completion/Solaris /usr/share/zsh/functions/Completion/Unix /usr/share/zsh/functions/Completion/X /usr/share/zsh/functions/Completion/Zsh /usr/share/zsh/functions/Completion/openSUSE /usr/share/zsh/functions/Exceptions /usr/share/zsh/functions/MIME /usr/share/zsh/functions/Misc /usr/share/zsh/functions/Newuser /usr/share/zsh/functions/Prompts /usr/share/zsh/functions/TCP /usr/share/zsh/functions/VCS_Info /usr/share/zsh/functions/VCS_Info/Backends /usr/share/zsh/functions/Zftp /usr/share/zsh/functions/Zle
$fpath 已更改。 它没有效果。
摘自我的.zshrc
# Path to your oh-my-zsh configuration.
ZSH=$HOME/.oh-my-zsh
ZSH_THEME="robbyrussell"
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
plugins=(git git-flow git-extras rails3 rvm zeus bundler ruby)
source $ZSH/oh-my-zsh.sh
# Customize to your needs...
export PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PATH=$PATH:$HOME/.rvm/bin # Add RVM to PATH for scripting
[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function
PATH=$PATH:/usr/lib/postgresql/9.1/bin/
export JAVA_HOME=$HOME/app/jdk1.7.0_15
fpath=($HOME/app/zsh-completions/src $fpath)
我的变化
- plugins=(git rails ruby)
+ plugins=(git git-flow git-extras rails3 rvm zeus bundler ruby)
+ fpath=($HOME/app/zsh-completions/src $fpath)
这没有任何效果。错误仍然存在(我每次都会打开一个新的终端选项卡)
答案1
因为它认为 rspec 是 spec 的拼写错误?
- 您可以使用
nocorrect
(例如alias bundle='nocorrect bundle'
), - 或者干脆停止使用命令行修正。
- 或者使用你
CORRECT
似乎CORRECT_ALL
正在使用的
[编辑] 注意 zsh 使用完成函数来确定预期结果。在第二种情况下,它使用完成函数bundle
答案2
自动拼写检查可以通过两种方式激活(我使用 O. Kiddle 等人的“从 bash 到 Z Shell”作为指南/参考):
setopt correct
按下 Enter 后,zsh 会“查看命令词,如果不将其识别为命令,它会尝试找到更正,然后提供给您”。
setopt correctall
类似于
correct
,但另外检查命令后的“参数。但是,它只是假设它们是文件,并尝试将单词更正为文件名。通常不是你想要的“”。
因此,后者解释了为什么您会被spec
要求更正rspec
-- zsh 认为这应该是一个文件(或者在您的情况下是一个目录)。它没有解释为什么它在另一台机器上工作。(我猜想您的个人或全局配置文件(~/.zshrc
或/etc/zsh/
)中的一些设置不同,不太可能是版本问题。)
[与这个相当简单的拼写检查密切相关的是补全系统的一个功能,称为“近似补全”。zsh 的补全系统非常先进,值得研究一下。(*) 由于我自己不使用那个“近似补全”,如果您感兴趣的话,我想引导您到man zshcompsys
“控制功能”一节。]_approximate
但是,除非你有特殊的理由,否则我会unsetopt correctall && setopt correct
摆脱所描述的行为(这是 Francisco 提出的最后一点)并使用一个合适的完成函数来捆绑(这是我的最后一条评论)。
借助完成函数,zsh 变得相当“聪明”。例如,它知道 sudo 之后必须跟一个命令,因此sudo pass
TAB将完成为sudo passwd
。您可以使用bundle
,它还有一个完成函数,但显然默认情况下不附带。(**) 有了它,您将获得 bundle 选项的良好提醒:
$ bundle -TAB-
check -- Determine whether the requirements for your application are installed
config -- Specify and read configuration options for bundler
console -- Start an IRB session in the context of the current bundle
exec -- Execute a script in the context of the current bundle
gem -- Create a simple gem, suitable for development with bundler
...
键入后,bundle exec
您只会看到显示的命令。我更喜欢这种行为,而不是更正,但这取决于您。
(*)它由 激活autoload -U compinit && compinit
。要检查它是否处于活动状态(可能处于活动状态),请使用which compinit
:
$ zsh -f
$ which compinit
compinit not found
$ autoload -U compinit
$ which compinit
compinit () {
# undefined
builtin autoload -XU
}
(**) 复制https://github.com/zsh-users/zsh-completions/blob/master/src/_bundle到你的目录中$fpath