Vim からシェルコマンドを実行する方法には、Vim のコマンドライン領域から以下のように実行する方法が有名だと思います。
:echo system("ls")
:!ls
例えば、カレントディレクトリのファイルリストをさっと見たかったりすると上記のように実行すればよいです。しかし、この方法はきれいな出力が得られなかったりします。前者はタイプ数も多く、後者は画面が一時的にシェルに切り替わります。この挙動を好まない方と多いと思います。また、どちらの方法もシェルのコマンドに依存するので、(/bin/ls
がない、なんて状況はほぼないと思いますが)ときによっては実行できなかったりします(Windows など)。
vim-shellutils
そこで、ちょっとしたプラグインをおすすめします。
このプラグインは Vim script のみで各コマンド(ls
や cp
など)をエミュレートしています。なので、Windows や、/bin/ls
がない環境でも動作します。
使い方
使い方は簡単です。
各コマンドを Vim のコマンド風に実行するだけです。
例:ls
→ :Ls
便利な使い方
このプラグインが提供するエミュレートしたシェルコマンドは、あくまでも Vim というエディタ用に最適化されています。つまり、シェルコマンドの cp source dest
のような Usage を求めません(文法が少し違うという意味)。
cp
コマンドは「コピー元」「コピー先」の2つの引数を求めます。しかし、Vim 用にエミュレートした :Cp
は「コピー元」を省略することが出来ます。そのときに自動でカレントバッファが「コピー元」として解釈されます
つまり、.vimrc
を編集中に、:Cp ~/Dropbox
とすると、:Cp .vimrc ~/Dropbox
と同じことです。これは、結構便利で、「さっき Vim で編集してたファイルを削除しよう/バックアップしよう」とか思うことは多いと思いますが、:Rm
/:Cp ~/some_file.bak
としてやるだけです。
エミュレートされたコマンド
今現在、以下のコマンドを使用できます。随時増やしていく予定です。
シェルコマンド | Vim コマンド |
---|---|
ls | :Ls |
mv | :Mv |
cp | :Cp |
file | :File |
cat | :Cat |
head | :Head |
tail | :Tail |
touch | :Touch |
mkdir | :Mkdir |
今のところ、シェルのようなオプション指定は出来ません。後述しますが、このプラグインは手軽に実行できることが本来の目的だからです(オプションを使って…となるくらいちゃんと実行するなら、シェルに戻って実行したほうがいいという発想)。ただ、よく使うようなオプション(例えば ls -a
など)くらいなら実装してもいいかなと思っています。
詳細な使い方は vim-shellutils のドキュメントを覗くか、シェルコマンドそのものの使い方を知るなら man command
してください(Vim ユーザなら基本コマンドくらい man しなくても知っているとは思いますが)。
最後に
プラグイン誕生秘話
もともと、Vim で編集中に画面を切り替えることなく(視点の移動を最小に)、ササッとファイル一覧を取得したかったのが始まりです。:!ls
したくないし、Windows で実行することもあり、手軽に見たかったのが大きなバックボーンでした。最初は .vimrc
に簡単な関数として書いていたものがあまりに便利だったので、より元の ls
に似せていくうちに大きくなり、また兄弟(cp
や mv
や rm
)を作ってみるとこれもまた便利で、自分用にとプラグインに書きだしただけです。もしかしたら、こんなプラグインを使わずとも簡単に同じことを実現できるかもしれません。