Vim でシェルのコマンドを実行したいとき、 :!
の後にコマンドを打てばよいことはご存知かと思います。しかし、デフォルトのままでは .bashrc に書いてあるエイリアスの設定が有効にされていません。例えば、
alias ll='ls -l'
と設定していても、vim 上で :!ll
は使えません( command not found
となる)。
これを使えるようにするためには、適当なファイル(~/.bash_aliases としておきます)に
shopt -s expand_aliases
alias ll='ls -l'
と記述し、 .vimrc 内に
let $BASH_ENV = "~/.bash_aliases"
と記述しておけば大丈夫です。この状態で vim を再起動し、 :!ll
を試してみましょう。動くはずです。この .bash_aliases に自分の好きなエイリアスを書いて使ってください。
参考リンク:
http://stackoverflow.com/questions/4642822/commands-executed-from-vim-are-not-recognizing-bash-command-aliases(Zahnon 氏の回答)
http://stackoverflow.com/questions/8841116/vim-not-recognizing-aliases-when-in-interactive-mode(Jacob 氏の回答)
メモ
以下、ちょっとした解説がてらのメモです。動けばそれで満足、という方は以下は読まなくても構いません。
shopt って何だ?
.bash_aliases 内 1 行目の shopt
は、その名の通りシェルのオプションです。エイリアスの設定を有効にするためにこの行が必要で、普通のインタラクティブモードのシェル(ターミナル)ではデフォルトで有効になっています。vim の :!
はインタラクティブではないため、明示的に設定してやる必要があります。
shellcmdflag じゃダメか?
いろいろな回答を見ていくと、「.vimrc 内に set shellcmdflag=-ic
と書いておけばおk」みたいな回答がだいたい先頭に出てきます。しかし、これをしてしまうと、vim からターミナルが立ち上がってしまい、コマンド終了後に例の Press ENTER or type command to continue
が出てこず、ターミナルがそのまま居座ってしまうのです。
僕はもとの :!
コマンドの使用感(終了後何かキーを押せば終了)が好きでしたので、冒頭の解決策に落ち着きました。