【问题标题】:How to make .bashrc aliases available within a vim shell command? (:!...)如何在 vim shell 命令中使 .bashrc 别名可用? (:!...)
【发布时间】:2011-01-10 00:38:49
【问题描述】:

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

alias gitlog='git --no-pager  log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges'

但是当我这样做时

 :! gitlog

我明白了

/bin/bash: gitlog: command not found 

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

[alias]
    co = checkout
    st = status
    ci = commit
    br = branch
    df = diff

但是我不想将我所有的 bash 别名添加到 .gitconfig。那不是 DRY。

有没有更好的解决方案?

【问题讨论】:

  • 如果别名在 .gitconfig 中,那么您就不需要在 Bash 别名中重复它们,使用 git 的所有东西都会知道它们,而不仅仅是 Bash。所以,DRY 是令人钦佩的,但也有 SPOT(Single Point Of Truth),把你的 SPOT 放在正确的地方意味着它也更容易成为 DRY。

标签: bash vim alias


【解决方案1】:

Bash 不会加载您的 .bashrc,除非它是交互式的。

运行:set shellcmdflag=-ic 将其设置为当前会话的交互式。

要使设置永久化,请将 set set shellcmdflag=-ic 添加到 .vimrc 文件的末尾。

在向 shell 发送命令之前使用 bang (!)。例如::! cd folder/

【讨论】:

  • 编辑您的 .vimrc 文件 (vim ~/.vimrc) 并将其放在一行中(不带 :)
  • 这很好,但是我遇到了问题——如果我启用交互模式(i 标志),那么我可以很好地执行我的别名 shell 命令,但是一旦命令执行完毕,vim退出这是不受欢迎的。例如,我尝试使用 shellcmdflag=-ic: [4]+ Stopped vi ~/.vimrc 执行 :!ls
  • @Kevin:没有办法通过交互式 bash 获得 viw 的正常行为? (执行命令,等待任意键,返回vim)
  • 对我来说,在 .vimrc 中使用命令会导致 suspended (tty output) 当我使用 git commit
  • 告诉 Vim 总是使用交互式 shell 会产生问题。更好的解决方案是弄清楚 bash 配置中设置别名的内容以及如何将其移动到即使在非交互式 shell 中也已加载的位置。例如,zshell 只为交互式 shell 加载 ~/.zshrc,但它为所有 shell 加载 ~/.zshenv,所以我将我的别名设置移到那里,它现在可以在 Vim 中工作。有关更多信息,请参见 man zsh(或您的 shell 的手册页)。
【解决方案2】:

我知道这个问题之前已经“回答”过,但我对答案有疑问。在 Vim 中,shell 不需要 设置为交互式。无需退出交互式 shell,请参阅此线程以获得替代答案。

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

shopt -s expand_aliases  
alias la='ls -la'

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

let $BASH_ENV = "~/.bash_aliases"

此解决方案由“Jakob”提出。原文见下方链接。我在 Mac OS X 10.9 上对此进行了测试,结果完美无缺!

vim -- not recognizing aliases when in interactive mode?

【讨论】:

  • 迄今为止最好的解决方案。就个人而言,我在我的.bashrc 中设置了$BASH_ENV var(在任何自定义交互模式检查之前),所以我可以在应用程序中使用我的所有别名。
  • 这可能是此页面上最好的解决方案,因为更改的范围仅限于 Vim 内。甚至可以更进一步,let $BASH_ENV="~/.vim/vim_bash",这将用于 Vim 中的所有 :! 调用。
  • 不幸的是,这在 macOS 10.15.2 默认 shell zsh 中不起作用。
【解决方案3】:

我知道这可能是一个老问题,但是上述答案都没有按我的意愿工作。所以对于那些通过谷歌搜索来到这里的人和 (oh-my-)zsh 用户:

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

`.zshenv' 源自 shell 的所有调用,除非设置了 -f 选项。它应该包含设置命令搜索路径的命令,以及其他重要的环境变量。 `.zshenv' 不应包含产生输出或假定 shell 附加到 tty 的命令。

所以$ cp ~/.zshrc ~/.zshenv 会做这件事。

【讨论】:

  • 谢谢你!只是想注意,如果你的 shell 别名在一个文件中,你可以在 .zshenv 中获取它们。比如:. $HOME/.aliases
【解决方案4】:

请注意,根据您的 bash 点文件的配置方式,您可能希望使用 -l 而不是 -i 选项。这会将 shell 作为登录 shell 启动。

【讨论】:

  • dreftymac 写道:“为了让这个对我有用,有必要做 -lic 选项,否则 vim 返回 'command not found'”
【解决方案5】:

我对设置 -i 选项感觉不太舒服,因为它有相当大的影响,而且我经常从 vim 使用 shell。我会做的是类似:!bash -c ". ~/.alias; gitlog"

【讨论】:

  • 这似乎是最好的解决方案,但它对我不起作用。它仍然说找不到命令
猜你喜欢
  • 2013-04-07
  • 2011-04-22
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多