パーソナルツール

vimエディタから外部のプログラムやコマンドを実行する。

作者: 小見 拓 最終変更 2012年01月08日 11時58分

この記事では、vimエディタから外部のプログラムを実行する方法、 そして、vimエディタで外部プログラムの実行結果を受け取って編集作業に役立てる方法を紹介します。 外部のプログラムを利用できるようになると、vimエディタでできる事が格段に広がります。 (Windows, Mac)

概要

この記事では、vimエディタから外部のプログラムを実行する方法、
そして、vimエディタで外部プログラムの実行結果を受け取って編集作業に役立てる方法を紹介します。
外部のプログラムを利用できるようになると、vimエディタでできる事が格段に広がります。

「!」による外部プログラムの実行

外部プログラムの単純な実行

最も簡単に外部プログラムを実行する方法は、exモードで ! を使用することです。
次のようにコマンドを入力すると、 ! の後に入力した外部プログラムが実行されます。

:! {外部プログラム}
" ディレクトリのファイル一覧を確認(Mac OSX環境のみ)
:!ls

" 時間を確認(Windows環境のみ)
:!date /T

" 不要なファイルを削除(Windows環境のみ)
:!del log.txt

" 編集中のファイルをCVSレポジトリにコミット
:!cvs ci -m "" %
Windows環境での外部プログラムの実行

↑Windows環境では別ウィンドウ、↓Mac OSX環境では同じウィンドウ内で実行されます。

Mac OSX環境での外部プログラムの実行

Note

vimエディタのコマンドの中で「%」を使用すると、
コマンド実行時に、「%」は今開いているファイルのパスと置き換わります。

実行した外部プログラムの結果の読み取り

:r コマンドを外部プログラム実行用の ! と組み合わせると、外部プログラムの実行結果を読み取ることができます。
次のようにコマンドを実行すると、外部プログラムが実行された後、プログラムの実行結果がコマンド実行時のカーソルの位置に書き込まれます。

:r ! {外部プログラム}
" カーソルの位置に、日付を書き込む
:r! date /T
コマンド入力

↓(外部コマンドの実行結果がファイルに書き込まれる)

プログラムの実行結果がカーソル位置に書き込まれる

外部コマンドをフィルターとして使用する。

範囲を指定してから、 ! で外部プログラムを実行すると、
選択した範囲のテキストに外部プログラムを実行してから、その実行結果で選択範囲のテキストを置き換える、という
外部プログラムのフィルター的な使い方が出来ます。

:'<,'>:! {外部プログラム}
:2,50! {外部プログラム}
" 選択範囲に行番号をつける
'<,'>:!cat -n

" 15から40行目に「native2ascii -reverse」コマンドを実行する
:15,40!native2ascii -reverse
範囲選択

↓(コマンドを実行すると、選択範囲が外部コマンドの実行結果で置き換わる)

行番号の付与

外部プログラムの実行結果の即展開

使用できる状況はかなり限定されますが、
vimエディタのコマンドの引数で「`{外部プログラム}`」の書式を使用すると、
外部プログラムの実行結果を即座に展開して、コマンドの引数として、プログラム実行結果を利用できます。

:e `{外部プログラム}`
" echoコマンドの結果文字列をファイル名として使用する
:e `echo test.txt`

" rand_filename.shスクリプトの実行結果を、書き込み先のファイル名として使用する
:w `rand_filename.sh`

Note

正直使い道はあまり考え付きません。
ファイル名などをプログラム的に決めたいが、vimスクリプトではどう書くかわからない時などに、
perl、rubyなどの得意な言語でファイル名を決定したりすることはできます。

シェルを起動して、そのシェルで外部のプログラムを実行

シェルを起動して、そのシェル上で外部のプログラムを実行することもできるでしょう。
vimエディタ上でシェルを起動するには次のコマンドを実行します。

:sh
Windows環境で「sh」コマンドを実行する

↑Windows環境では別ウィンドウ、↓Mac OSX環境では同じウィンドウ内で実行されます。

Mac OSX環境で「sh」コマンドを実行する

この場合、シェルを起動すると、そのシェルに制御が移りますが、
シェルを終了すると、vimエディタに制御が戻ります。

vimエディタと、「:sh」コマンドで起動したシェルの間で、データをやり取りするには

:sh コマンドで起動したシェルと、vimエディタの間でデータのやり取りをするには、
・作業ファイルを用意してファイルを経由して結果を受け渡しするか、
・システムのクリップボードを使用すると良いでしょう。

クリップボードを使用してデータをやり取りするなら、
Windowsのcygwin環境なら「getclip」「putclip」コマンド、
Mac OSX環境なら「pbcopy」「pbpaste」コマンドが役に立つかもしれません。

環境 クリップボードからの出力 クリップボードへの入力
Cygwin環境 putclip getclip
Mac OSX環境 pbpaste pbcopy
ドキュメントアクション
コメント
blog comments powered by Disqus