外部のプログラムの利用で機能拡張

各種のコマンドを編集に役立てる

機能概要

フィルタとして使う以外にも外部のコマンドはいろいろと便利に利用できます
ここでは,フィルタ以外の外部コマンドの使用方法と使用例を書きます

任意のコマンドをJVimの中から実行させる

:!(外部コマンド名)

という形式で,ほとんどの外部のunixコマンドが実行できるのはご存知でしょうか ? :!ls , :!date , :!df などのコマンドは, わりと使うものだと思います

こういう時に,「現在編集中のファイル名」は,わざわざ名前を打たなくても % という文字で代用ができます. たとえば

:!chmod u+x %

とすれば,現在編集中のファイルに実行属性をつけることが可能だし :!./% とすれば現在編集中のファイルを(スクリプトかな?)実行できます

任意のコマンドをJVimを一時停止させて実行

CONT-Z を押すと, まるでJVimを終了させたかのようにシェルに戻れ ます. ここで好きなコマンドを打って実行できます. またJVimの編集に戻りたいと 思ったら,シェルのプロンプトで % とか fg と押すだけで(シェルに よって多少異なるとは思いますが) 再びJVimの編集画面になります
一時停止ならば終了と違って,変更中のファイルもそのままにできますし マークやバッファの状態や設定状況などもリセットされずに済みます

任意のコマンドの実行結果を読み込む

:(場所)r!(外部コマンド名)

とすれば,外部のコマンドを実行した結果を読み込むことができます
たとえば :0r!ls とすれば ls を実行した画面がファイルの先頭に 読み込まれます. ちなみに,この読みこまれた行のファイル名が書かれている上に カーソルを置いて CTRL-Wf と打てば, そのファイル内容の編集が できて便利だったりします. こんな風に一時的に読み込ませるだけなら, u を 押せば読み込んだ内容は何もなかったかのように消えるので手軽に使えます

ちょっと余談になりますが, ただ単にディレクトリ内容のファイル一覧が見たいのであれば

:e CTRL-D

というのも悪くない方法だとは思います. 編集に戻るには ESC キー をダブルクリック(?)すれか CONT-C です

指定した範囲の内容を任意のコマンドに与える

:(範囲)w !(外部コマンド名)

とすれば,指定した範囲の内容のテキストを外部のコマンドに与えて実行できます
注意するべきなのは,文字 w! の間にスペースが必要だということです

:(範囲)w!

のようにした場合には,ファイルへ指定範囲の書き込みコマンドとなってしまいます
普通に :w コマンドで書き込む対象のファイル名の かわりに !(外部コマンド名) と打つものだと考えると使いやすいと思います

たとえば :w !wc とすれば,現在編集中の内容すべてを wc の入力として 渡して「行数,単語数,文字数」を数えさせることが可能です. フィルタとして使う わけじゃなくって, ただ単に内容を wc コマンドに教えてあげるだけで, 別に 置換えも読み込みもしないで実行だけさせて結果を見るだけ…というわけです

範囲やオプションをつけた例を示せば, :,$w !wc -c で,「現在行からファイルの最後までの範囲に含まれる文字の数を」数える し, 6:w !wc -w なら「カーソル行以下六行中に含まれる単語の数を」数えます

"K"コマンドについて

カーソル位置の「キーワード」を拾って,あらかじめ登録しておいた外部のコマンドの 引数として渡すというコマンドがあります

まず,初期設定( $HOME/.vimrc など)に例えば set keywordprg=echo と 書いた場合,Kコマンドを使えば echo にカーソル位置の単語を渡すように なります. 英語の文章などがわかりやすいのですが, 何かの単語の上にカーソルを 置いた状態で K を押してみて下さい. するとカーソル位置にあった単語が表示 されると思います. この場合の「単語」とは, アルファベットの大文字または 小文字と"_"のみで構成されている単語 ,です. 普通の英単語のことだと思えば良いで しょう. これに当てはまる文字列をこの機能の対象となるキーワードとして認識 します. もし, カーソル位置にそのようなものが無い場合は その直後の該当する文字列が 使われます

この例の場合は echo コマンドなので,別に表示されるだけで何にも便利じゃない です.(例だということで) 具体的には,この機能はどういうコマンドに割り当てて使うのかというと おそらく,「スペルチェック」とか「英和辞書」のようなものが便利でしょう
ちなみに,私の場合は 英単語の電子辞書ひきコマンドとして使っています. 要するに

(コマンド) (調べたい単語)

の形式で辞書が引けるようなスクリプトを書いておいて使えばよいだけです
こうしておくことで,調べたい単語の上にカーソルを置いて"K"を押すだけでその単語の 意味を表示してくれるようになります. 本当の辞書引きソフトが, こういう形式じゃなく ても,スクリプトを書いてちょっと工夫して複数形の"s"を取るなどの加工をしてから 呼び出して使うような感じにすれば本格的に使えますので,自分なりにやってみて下さい

ディレクトリの確認と移動

「ディレクトリを移動したい」とか「現在いるディレクトリ名の確認をしたい」という時に :!cd (場所) とか :!pwd と打っていませんか ? もちろんこれで間違いではないのですが,実は cd pwd は JVimが自前で持って いるので
:cd :pwd でOKです. cd の引数を書く時は, タブキーで文字列の 補間もできるし, ~ 文字を自分のHOMEディレクトリの代用として 打てます. また, シェルの機能みたいに CONT-D で候補一覧も見れます

"grep"コマンド使用例

複数のファイルから一度に文字列を検索したい時には grep コマンドが便利ですね

JVimの中から使う場合には :r!grep -n (文字列) * のように使うと, 検索 結果を読み込みます. ( -n オプションを忘れずに !) 「ちょっと結果を見たい だけなのに,わざわざ読み込ませるの〜?」 と思うかも知れませんが, 読み込ませたほうが 便利だし, u を押せば何事もなかったかのように一瞬で片付くのであまり心配せずに 読み込ませましょう. そして,検索結果の中で「実際にこのファイルのこの行の場所を見に 行きたい」と思ったら,その行にカーソルを置いて

gg

と押せば 実際に編集画面が表示され,カーソルもそこに移動する ので便利 です. ただし,この機能は grepに -n オプションをつけないと機能しませんので 注意. 検索結果を読み込ませたほうの画面は,用が済んだら u を押せば片付きます

ちなみに,ktermなどのコンソール上では直接漢字が打てない環境の人も多いかと 思いますが,JVimの中だけでも漢字の入力ができるのであれば,JVimの中からgrepを 使うことによって日本語の文字列のgrep検索ができるようになります. しかも JVimから直接簡単に飛べるのですから,これはかなり便利です. ただし, 文字コードの 設定をちゃんとしておかないと grepが正しい検索をしてくれないので注意が必要 です. 具体的には jmask オプションの三つ目の文字がコマンドに受け渡す時の文字 コードなので,怪しい時はこれをチェックしましょう. (その前に,使っているgrepが 日本語対応かどうかもチェックすべきかも) 現在の文字コード設定は

:set jmask?

で表示されます. 設定は :set jmask=EEE なら, すべて(キー入力,表示,入出力,の 文字コード)がEUCという意味で設定されます. 自分の環境に合った設定にしておきましょう
ちなみに,DOSやWindowsなどのSJIS環境なら S だし,JISなら J です

"bc"コマンド使用例

ちょっとした計算をしたい時ってありますよね
JVimには電卓機能なんてありませんけども,unixのコマンド bc というのが たいていのマシンにはインストールされていると思います

:!bc

とすれば,一時的にJVimを抜けてbcを起動します. ここで 30+2 などと 数式を打って(Return)を押せば結果を教えてくれます
quit と打って(Return)すれば,bcを終了してJVimに戻ってこれます
bc コマンドの使い方は,ここでは説明しませんが,実はかなり本格的な複雑な目的にも 使えるし,変数なんかもとりあえず手軽に使えるので,マニュアルを読むと良いかも

また,編集ファイル中にある数式を計算させたければ,たとえば

3+5

などと書かれた行の上にカーソルを置いて !!bc とすれば, この式の 計算結果で置き換えたりできます

"lynx"コマンド使用例

文字表示専用のWWWブラウザである lynx というコマンドを知っているでしょうか ? このコマンドはただ単に引数で指定したurlのWebページをGETしてきて標準出力に 表示することもできるので,JVimから外部のWebページ内容をとってくるのに便利です
もちろん"lynx"が適切にインストールされてなければ使えませんが

たとえば

:r!lynx -dump http://www.なんとかかんとか…

のように打てば,指定したWebページの内容を読み込みますので,引用などをしたい時に 便利に使えます. Webページそのもののソースが欲しい時は

:r!lynx -source http://www.なんとかかんとか…

で持ってこれます

ページ内容に書かれているリンクのurlをまた打てば,超簡易なWeb閲覧システム(?)が できますね(すごく苦しいけど). urlを手で打ちたくないという人はmapや外部スク リプトなどを工夫して,がんばってみて下さい. でもlynxがあるならlynxでWebを 見るほうが,はるかに快適 でしょう多分

外部のWebページを持って来るコマンドは,他にも探せばあると思うし,perlなどの スクリプトを書いても良いので,使い勝手のよい環境を目指すのも面白いかと 思います. 応用としては,FTPで遠方のファイルを読み書きさせたりするのも便利かも

全然関係ないですが,"lynx"には Vi風のキーバインド設定ができます
Vi(JVim)を使う人なら是非この設定を使いましょう

さらなる活用を

ここでは,grep機能,電卓機能,単語の辞書引き,Webページを持ってくるなどの例を紹介し ましたが, このように手軽に外部のコマンドが使えるような設計になっていると, どのよ うに便利なのか考えてみましょう.

世の中には,"grep"や"sort"に相当する機能を自前で持っているエディタソフトもあり ますが,これらの細かい挙動は簡単には変えられないと思います. 例えば, "grep"なら「行番 号つきで」とか「該当行の前後の数行も一緒に表示」とか表示の仕方にも人それぞれ好み があるでしょう. 自前で"grep"相当の機能を持っている場合に,その挙動をいろいろ変化 させるためにはあらかじめ希望の設定項目が用意されていればラッキーですが,ソフトの作者に 要望を出して実現するのを待ったり,ありとあらゆる機能を詰め込んで巨大なソフトに 膨れ上がって重くなるとか…ということもあり得ます

それに比べて,JVimは外部のプログラムと手軽に連係可能な設計となっているので エディタ本体に機能を詰め込まなくても,無限に機能を拡張できる も同然です
"grep"なら,すでに知っているオプションをエディタの中でそのまま使えるし, その 結果はエディタ 独自のものじゃなくて 「普段から使い慣れている」コマンドの 結果表示そのままなのです. 何も我慢することも,要望が実現するのを祈る必要も 無いのです

あるいは,既存の"grep"のオプションや出力などの挙動に不満があれば自分でプログラム を書いて使うこともできます. 何もかも思いのまま です. しかも, そうやって作った コマンドは,通常のunixのコマンドとして使うこともできるのですから自動化の際に役立てる こともできるし, JVimなんて全然使わない人にも便利に使ってもらえる… なんて こともあることでしょう. 他のエディタの独自仕様のマクロ言語のようなもので, 一生懸命に 凝った機能を実現しても,役に立つのは そのエディタ内部だけという悲しさとは比べものに なりません

そういうわけで,ここに紹介した例以外にも,自分で便利に使えるコマンドをどんどん 見つけたり自作したりして楽に使おうではありませんか. 自作といっても独自の新しい 文法や規則を覚える必要はありません. 他のunixコマンドのように動作すれば, C言語で も,perlやrubyやsedのようなスクリプトでもなんでもかまわないのですから気軽ですよね
また,コマンドを作ったり探したりマニュアルを読んだりすることで,unix環境を楽に使 うための知識が深まることもあるでしょう.


前項目, 「外部のフィルタプログラムの利用」へ

目次へ

次項目, 「スクリプトファイルの活用」へ