从vim执行的命令无法识别bash命令别名

Nic*_*ilt 92 vim bash alias

我在mac上使用bash,其中一个别名是这样的

alias gitlog='git --no-pager  log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges'
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做

 :! gitlog
Run Code Online (Sandbox Code Playgroud)

我明白了

/bin/bash: gitlog: command not found 
Run Code Online (Sandbox Code Playgroud)

我知道我可以在我的.gitconfig中添加这样的别名

[alias]
    co = checkout
    st = status
    ci = commit
    br = branch
    df = diff
Run Code Online (Sandbox Code Playgroud)

但是,我不想将所有bash别名添加到.gitconfig.那不是干.

有更好的解决方案吗?

Jos*_*Lee 109

除非它是交互式的,否则Bash不会加载.bashrc.使用

:set shellcmdflag=-ic
Run Code Online (Sandbox Code Playgroud)

使Vim的:!shell表现得像命令提示符.

  • 告诉Vim总是使用交互式shell可能会产生问题.更好的解决方案是弄清楚bash配置中的哪些设置别名以及如何将其移动到即使在非交互式shell中也会加载的位置.例如,zshell只为交互式shell加载`〜/ .zshrc`,但它为所有shell加载`〜/ .zshenv`,所以我在那里移动了我的别名设置,它现在可以在Vim中运行.有关更多信息,请参阅`man zsh`(或shell的手册页). (24认同)
  • 这很好,但是我遇到了问题 - 如果我启用交互模式(i标志),那么我可以执行我的别名shell命令,但是一旦命令执行完毕,vim就会退出,这是不可取的.例如,我尝试过:!ls with shellcmdflag = -ic:[4] + Stopped vi~/.vimrc (9认同)
  • 对我来说,在.vimrc中使用命令导致```suspended(tty output)```当我使用```git commit``` (7认同)
  • 编辑你的.vimrc文件(vim~/.vimrc)并将其放在那里(没有:) (6认同)
  • @Kevin:用交互式bash无法获得viw的正常行为?(执行命令,等待任何键,回到vim) (6认同)
  • @ashgromnies'[4] + Stopped`意味着它被暂停,使用`fg`在前台运行它. (2认同)
  • @ashgromnies仍然更好,将命令运行为:!命令&& fg (2认同)
  • 这对我来说只适用于`:set shell = bash\--login` (2认同)

Zah*_*non 79

我知道这个问题之前已经"回答"了,但我的答案有问题.在Vim中不需要将shell 设置为交互式.无需退出交互式shell,即可查看此主题以获取备用答案.

如果您需要非交互式shell(默认情况下)但扩展bash别名,请将别名定义放在一个文件中,例如.bash_aliases并在此文件中明确启用别名扩展:

shopt -s expand_aliases  
alias la='ls -la'
Run Code Online (Sandbox Code Playgroud)

然后将其添加到.vimrc中,以便每次从vim中运行shell命令时实际读取别名文件:

let $BASH_ENV = "~/.bash_aliases"
Run Code Online (Sandbox Code Playgroud)

这个解决方案由"Jakob"提出.请参阅以下链接了解原件.我在Mac OS X 10.9上进行了测试,它运行得很完美!

vim - 在交互模式下不识别别名?

  • 迄今为止最好的解决方案.就个人而言,我在`.bashrc`中设置`$ BASH_ENV` var(在任何自定义交互模式检查之前),所以我可以在应用程序中使用我的所有别名. (6认同)
  • 这可能是此页面上的最佳解决方案,因为更改范围将限制在Vim内.甚至可以更进一步,`让$ BASH_ENV ="〜/ .vim/vim_bash"`,这将用于Vim中的所有`:!`调用. (2认同)

use*_*003 7

请注意,根据bash dotfiles的配置方式,您可能需要使用-l而不是-i选项.这将以shell身份启动shell.

  • dreftymac写道:"为了让这个为我工作,有必要做-lic选项,否则vim返回'命令未找到'" (4认同)

小智 6

我知道这可能是一个古老的问题,但是以上答案均无法满足我的要求。因此,对于那些通过谷歌搜索来到这里的用户以及(oh-my-)zsh用户而言:

我对此的解决方案就像将.zshrc复制到.zshenv一样简单-按照http://zsh.sourceforge.net/Intro/intro_3.html

除非设置了-f选项,否则.zshenv会在shell的所有调用中得到。它应包含用于设置命令搜索路径的命令,以及其他重要的环境变量。“ .zshenv”不应包含产生输出或假定外壳已连接到tty的命令。

所以$ cp ~/.zshrc ~/.zshenv会做的事情。

  • 这次真是万分感谢!只是想注意,如果您的 shell 别名存在于文件中,则只需在 .zshenv 中获取它们即可。像这样的东西:`。$HOME/.aliases` (2认同)