vimから実行されたコマンドがbashコマンドのエイリアスを認識しない


96

Macでbashを使用していますが、エイリアスの1つは次のようになります

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エイリアスでエイリアスを繰り返す必要はありません。Bashだけでなく、gitを使用するすべてのユーザーがエイリアスを認識します。したがって、DRYは立派ですが、SPOT(シングルポイントオブトゥルース)もあり、SPOTを適切な場所に配置することで、DRYの方が簡単になります。
ジョナサンレフラー、


回答:


113

インタラクティブでない限り、bashは.bashrcをロードしません。使用する

:set shellcmdflag=-ic

Vimの:!シェルがコマンドプロンプトのように動作するようにします。


6
.vimrcファイル(
vim〜

9
これは良いですが、問題があります-インタラクティブモード(iフラグ)を有効にすると、エイリアスシェルコマンドを正常に実行できますが、コマンドの実行が完了するとすぐにvimが終了し、これは望ましくありません。例:shellcmdflag = -icで!lsを実行してみました:[4] +停止
vi〜

6
@Kevin:インタラクティブなbashでviwの通常の動作を取得する方法はありませんか?(コマンドを実行し、任意のキーを待ち、vimに戻ってください)
Mayeu

7
私にとって、.vimrcにコマンドがあると、suspended (tty output)「いつ使用するか」につながりますgit commit
has2k1

27
常に対話型シェルを使用するようにVimに指示すると、問題が発生する可能性があります。より良い解決策は、bash構成で何がエイリアスを設定し、それを非対話型シェルでもロードされる場所に移動する方法を理解することです。たとえば、zshell ~/.zshrcはインタラクティブシェルに対してのみ読み込まれますが~/.zshenv、すべてのシェルに対して読み込まれるため、エイリアス設定をそこに移動すると、Vim内から機能します。詳細はman zsh(またはシェルのmanページ)を参照してください。
Nathan Long

83

この質問はすでに「回答済み」であることは知っていますが、回答に問題があります。Vimでシェルをインタラクティブに設定する必要ありません。対話型シェルを終了せずに別の答えを得るには、このスレッドを参照してください。

非対話型シェル(デフォルト)が必要であるがbashエイリアスの拡張が必要な​​場合は、エイリアス定義をファイル(たとえば.bash_aliases)に入れ、このファイルでエイリアス拡張を明示的に有効にします。

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

次に、これを.vimrcに追加して、vim内からシェルコマンドを実行するたびにエイリアスファイルが実際に読み取られるようにします。

let $BASH_ENV = "~/.bash_aliases"

このソリューションは「Jakob」によって提案されました。オリジナルについては、以下のリンクを参照してください。これをMac OS X 10.9でテストしましたが、問題なく動作しました!

vim-インタラクティブモードでエイリアスを認識しませんか?


7
最高のソリューションです。個人的に$BASH_ENVは、.bashrc(カスタムインタラクティブモードチェックの前に)var を設定して、アプリケーション全体ですべてのエイリアスを使用できるようにします。
el.atomo

2
変更の範囲はVim内に限定されるため、これはおそらくこのページの最良のソリューションです。andをさらに進めることもできlet $BASH_ENV="~/.vim/vim_bash"、これは:!Vim内のすべての呼び出しに使用されます。
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

残念ながら、これはmacOS 10.15.2のデフォルトシェルであるzshでは機能しません。
Ben Quigley

8

bashドットファイルの構成方法によっては、-iオプションではなく-lオプションを使用する場合があることに注意してください。これにより、シェルがログインシェルとして起動します。


4
dreftymacは、「これを機能させるには、-licオプションを実行する必要がありました。それ以外の場合、vimは 'command not found'を返しました。」
dreftymac

8

私はそれが古い質問であるかもしれないことを知っています、しかし上記の答えのどれも私が望んだようにうまくいきませんでした。だからグーグルからここに来た人たちと(oh-my-)zshユーザーのために:

これに対する私の解決策は、単に.zshenvに.zshrcをコピーするようにした-ごとにhttp://zsh.sourceforge.net/Intro/intro_3.html

`.zshenv 'は、-fオプションが設定されていない限り、シェルのすべての呼び出しで提供されます。コマンド検索パスを設定するコマンドと、その他の重要な環境変数が含まれている必要があります。`.zshenv 'には、出力を生成したり、シェルがttyに接続されていると想定するコマンドを含めないでください。

そう $ cp ~/.zshrc ~/.zshenv事をします。


これありがとう!シェルのエイリアスがファイルにある場合は、それらを.zshenvから取得できることに注意してください。次のようなもの . $HOME/.aliases
scifisamurai

2

-iオプションの設定にはあまり慣れていません。かなりの影響があり、vimのシェルを頻繁に使用しているためです。代わりに私がすることは次のようなものです:!bash -c ". ~/.alias; gitlog"


これは最良の解決策のようですが、私にとってはうまくいきません。それでもコマンドは見つかりませんでした
still_dreaming_1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.