f

アーカイブ

2014-12-25

Use of alias for Vim external command

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

0 件のコメント:

コメントを投稿