zsh 运行 bundle exec 时提示更正可执行文件

zsh 运行 bundle exec 时提示更正可执行文件

为什么 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 passTAB将完成为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

相关内容