Vimから外部コマンドの実行時にaliasを使う方法を記す。
Introduction
Vimを使っていると外部コマンドでaliasを使いたいときがある。たとえば,私は以下のように普段頻繁に使うlsコマンドをaliasで再定義したり,OSごとで異なるクリップボードへの書き出しコマンドをaliasでまとめることで,同じコマンドからアクセスできるようにしている。
alias ls="ls -AFh --color=auto"
#### Copy to clipboard
# [ `command -v clip` ] && alias clip="clip" # MSYS (Windows)
[ "`command -v xsel`" ] && alias clip="xsel -ib" # Linux
[ "`command -v putclip`" ] && alias clip="putclip" # Cygwin
[ "`command -v pbcopy`" ] && alias clip="pbcopy" # Mac
これらのaliasをVimからも使えるようにしたい。Vimから外部コマンドを使うには,コマンドラインモードで!<command>という書式で実行する。
:!ls
ここでの外部コマンドでaliasを使えるようにしたい。
Method
私はログインシェルをbashにしており,そこからtmuxの起動と同時にzshにシェルが変わるようにしている。したがって,Vimでの外部コマンドは,/bin/bash
から実行される。そのため,bashのシェルスクリプトで読み込む設定ファイルを読み込むようにしたらよい。
BASH_ENV
環境変数は,bashにおいて非対話的に実行したときに読み込む設定ファイル(既定はなし)を指定できる(zshでは~/.zshenv
のファイルが非対話実行時に読み込まれる)。したがって,aliasを書いた設定ファイルをこの変数に指定すればよい。ただし,このままだとVimから外部コマンドの実行時にaliasが展開されないためうまくいかない。そこで,bashのexpand_aliases
オプションを有効にすることでaliasを展開することができ,Vimから外部コマンドをaliasで利用できるようになる。
たとえば,冒頭に示したaliasの設定とaliasを展開するオプション設定を~/.bashenv
に記述し,BASH_ENV環境変数の設定を~/.bashrc
に書いておけばよいだろう。
## .bashenv
shopt -s expand_aliases
alias ls="ls -AFh --color=auto"
#### Copy to clipboard
# [ `command -v clip` ] && alias clip="clip" # MSYS (Windows)
[ "`command -v xsel`" ] && alias clip="xsel -ib" # Linux
[ "`command -v putclip`" ] && alias clip="putclip" # Cygwin
[ "`command -v pbcopy`" ] && alias clip="pbcopy" # Mac
## .bashrc
export BASH_ENV=~/.bashenv
ちなみにこのexpand_aliases
はaliasの設定前後のどちらに書いても問題なく動作する。
BASH_ENV
環境変数に設定したファイルは非対話実行時に常に読み込まれる。そのため,シェルスクリプトなどで意図しない動作を起こす可能性があり危険である。そこで,Vimの起動時にだけBASH_ENV変数を設定し,Vimの実行中だけBASH_ENV変数を読みこめばいい。つまり,以下の内容を~/.vimrc
に記述して~/.bashenv
ファイルが読み込み可能で存在するときにBASH_ENV
変数を設定すればいい。
"" 外部コマンドでaliasを使えるようにする
if filereadable(glob('~/.bashenv'))
let $BASH_ENV=expand('~/.bashenv')
endif
これに合わせて,~/.bashrc
の設定からはBASH_ENVの設定を除去し,aliasの展開オプションだけを記述する。
shopt -s expand_aliases
これによりVimから外部コマンド実行時にaliasを使えるようになった。
Appendix
なお,蛇足ではあるが自分の備忘録のために私の設定についても述べておく。
bashとzshは設定が似通っている部分があり,aliasやPATHなどの共通設定を~/.zbashrc
ファイルで管理し,~/.bashrc
と~/.zshrc
の最後に以下を記述して,~/.zbashrc
を読み込むようにしている。
## for shared shell setting
[ -e ~/.zbashrc ] && source ~/.zbashrc
~/.vimrc
でのBASH_ENV
環境変数の設定では~/.bashenv
でなく~/.zbashrc
を指定し,~/.zbashrc
では以下のようにシェルがbashのときだけexpand_aliasesを設定している。
## enable alias in non-interactive shell
shell=`readlink /proc/$$/exe`
case $shell in
*bash) shopt -s expand_aliases;;
# *zsh) setopt aliases;;
esac
[ "`command -v xsel`" ] &&
やshell=`readlink /proc/$$/exe`
は説明が必要と思われるが,今回はテーマが異なるため省略する。
参考:
- Vimの外部コマンド実行でaliasを使う http://sanrinsha.lolipop.jp/blog/2013/09/vim-alias.html
- $BASH_ENV - メモ帳 http://d.hatena.ne.jp/parasporospa/20061103/p2