スクリプトファイルの活用

自動的な処理を書いて楽をする

概要

例えば…こんな時

のために, JVimには便利な機能があります. 一連の操作を記録しておいたものを ファイルとして書き出しておいて, 後で これを読み込ませて自動実行させる というものです. これをうまく使うと 読み込み時に特定の動作をするような 特別なJVim を作れます. また, 設定ファイルのように命令や設定をファイルに 書いておいたものを好きな時に読み込ませて自動設定や自動実行できるのです

ちょっと難しそうですが, 以下を読んでみて下さい

sourceコマンド

例えば設定ファイルを読み込みなおす時には :source ~/.exrc という コマンドを打ちますが, この時に指定するファイル名は 設定ファイルじゃなくても 任意の Exコマンドを書いて並べたものなら何でも読み込んで実行することが可能です. たとえば

%s/old/new/g
%s/aaa/bbb/g

という二行だけのファイルを作って "aaaa"というファイル名をつけておけば, 他の ファイルを何か編集中に :so aaaa と打つだけで ファイル中に書かれた 二つの置き換えをするようになります. もちろん置換コマンド以外にもいろいろな Exコマンドが書けるので 工夫次第で魔法のように使えます. いろいろ実験して 便利に使いましょう

また, これを利用すると, 「HTMLファイルの編集用」とか「特別な形式のファイル編集用」といった 目的別に作った mapコマンドや設定 を使いたい時に呼び出して実行できますので 便利です. fexrc オプションによる拡張子別の設定も便利ですが, こういう方法も あることを知っておくと さらに快適になれますね

source! コマンド

いま説明した source コマンドでは, 呼び出されるファイルの中に任意の Exコマンド が書けたのに対して, source! コマンドでは, 任意の JVimのコマンドが 書けます. …ということは JVimで普段操作していることならば何でも自動的に できるということです. 例えば

4Gdd:%!sort

のような一行だけのファイルを作っておいて 「source」コマンドと同様に :source! file として呼び出せば, そのファイルの通りの作業を一発で処理できます. この場合は 4行目に移動して行を削除してからファイル全体をソートしてますね. このように 処理内容の書き方は mapコマンドの時の書き方と同様で, 制御文字などをそのまま書く必要が あります. そして, source! コマンドでも : を書いてから後ろに任意の Exコマンドが書けます. たとえば

:%s/old/new/g
:%s/aaa/bbb/g

と書けば, sourceコマンドの説明の例と同等の処理を source! コマンドで出来ます. 先頭 に : (コロン)を書く所だけが違います. この時には Exコマンド実行のための (Return) を書かなくても良いのか?? と思う人もいるかも知れませんが, 改行しているので これが (Return)制御文字を書く代わりと なります. …ということは, 見易さのために安易に改行を入れることができないということ でもありますので注意

これを利用すれば 似たような形式が同じファイルが沢山ある時に, 同じ一連の操作を延々と 繰り返したい時に利用できそうですよね. この時に使う「処理内容を記述したファイル」 のことを JVimのスクリプトファイルと(ここでは)呼びます

自動的に操作をファイルに記録

このような自動化のためのファイルは, 通常のmapなどと同じ内容を書くのだといっても, 制御文字も書かなければいけないし…なかなか難しそうだ と思うかも知れません. でも 実は簡単に作る方法があります

source! コマンドは, mapコマンドや @(バッファ) コマンドと 全く同し書き方で処理内容を記述しますので q コマンドで自動的に作ることも できます. でも もっと手軽な自動記録のやり方を以下で説明します

この方法は, あるひとつのファイルを編集してから編集終了までの間にした「すべて」 のキー操作を指定されたファイルに自動的に書き出す…というものです
作りたいスクリプトファイル名を "scriptfile", 編集するファイルを "testfile.txt"と するならば, まず

jvim -w scriptfile testfile.txt

のように -w オプションと 書き出させたいファイル名指定 をつけて起動させます. すると, 特に何事もなかったかのように "testfile.txt"の編集画面 となりますが, もうすでに何か操作をすれば記録される状態にいるのです. ここで いろいろな操作を自由にして, ファイルの編集が終わったら, 特に何もせずに JVimを 終了させて下さい. もうすでに新しいファイル "scriptfile"は出来てますので 開いて確認してみれば 何やら自分の打った文字があるかと思います

これで "scriptfile"が出来てしまえば, 後は同じようなファイルを開いて すぐ :so! scriptfile と打った瞬間に さっきのファイル操作のすべてを 完了できます. もちろんファイルごとに違う動作をしてしまわないように 記録する時に 気を付けていないといけないのですが…使い方のコツみたいなものが分かってくれば 強力な手段になると思います

JVimのスクリプト ?

ファイルの編集開始から終了までのすべてを記録したスクリプトに「通す」だけなら わざわざファイルを開いて :so! scriptfile などと打たなくても

jvim -s scriptfile filename

と打つだけで同じことが出来ます
この -s オプションでは ":so!"形式のスクリプトファイルを指定して ファイル読み込みと同時に実行するというわけです

多くのunixっぽいOSでは ファイルの先頭を #!(コマンド名) (オプション) のような 行にして実行属性を設定しておけば まるで通常のコマンドのように振舞いますから 例えば…

#!/usr/bin/jvim -s
:se jc=e

のようなファイルを作って "jvim-euc"などと名前をつけて (jvimのパス名などは自分の環境に それぞれ合わせておくのは もちろんですが) unixのコマンド"chmod"などで 実行属性を設定しておけばこれを JVimの代わりに

jvim-euc filename

のように起動して使えば「ファイルを開いた時に文字コードをいつでもeucに変換する」ような 「特別な挙動をする JVim」として使えます. 特定のファイルを開いたらいつも必ず一連の操作を しなければならない時には使えると思います

あるいは あんまり現実的な例じゃないですが, sedみたいに

#!/usr/bin/jvim -s
:%g/abc/s/old/new/g
:%s/aaaa/bbbb/g
ZZ

のようなファイルを試して遊んだりできます. でも こうすると (jvim -sでは)複数のファイルをまとめて処理できないし, 先頭の行が邪魔をして :so! コマンドでは正常に動作しなくなってしまうので こういう目的には, やはり本物の"sed"などを使うべきでしょう(か?)

tag機能との連係

以前解説した :tag コマンド用の設定ファイルは, 普通は

memo $HOME/memo/memofile.txt 1

などと 3つ目の項目には行番号を書いたり /abc/ などと「最初に見つかる行」を 書いておくことが多いと思いますが, この場所には(ある程度制限があるみたいですが) ほとんどの Exコマンドが書けて, ファイルを開いた時に実行されます

ちょっと試しに

memo $HOME/memo/memofile.txt e /etc/fstab

などというtag設定ファイルを書いて試してみると分かります. :e filename というExコマンドが書かれているので "memofile.txt"を読み込んで後に "/etc/fstab"を 開きに行くようになります. この考え方をすすめて…

memo $HOME/memo/memofile.txt so!scriptfile

などと書けば, ファイルが呼び出された時に, "scriptfile"に書かれたことを実行 します. ここにはJVimで出来る操作なら何でも書けるわけだし, JVim単体では不可能な ことだって…外部のコマンドを呼び出せますから, まさに「何でも!!」できてしまいます

これを利用すれば ファイル編集中に他のファイルを tag機能で呼び出す感覚で lynxなどを使ってネット上にあるWWWページやファイルを持ってきたり, "ls"コマンドの結果を 自動的にファイルに書かせてgfコマンドで飛べるので「ファイルセレクト」みたいに 使えるし…という具合に, いろいろ考えたらきりがないくらい便利です

設定のパワーアップ

JVimの操作にも慣れてきて いろいろな使い方を覚えてくると…だんだんと設定ファイルも にぎやかになってくると思います
壮大なマップとかもあるかも知れませんが, 滅多に使わないのに巨大な map行は 直接設定ファイルに書くかわりに ファイルに切り分けて :source!scriptfile^M のようなmap内容とすれは, 実行時に読み込むように できます
ちょっと管理しにくくなるかも知れませんが, 遅いマシンの場合は良いかも

最後に…使用例

最後に, ちょっとした使い方の例として, 設定ファイルに「名前付きバッファに内容を 入れておく」方法を書きます. JVim起動時に最初から 特定の名前つきバッファに 自分で設定した内容を入れておく…というものです

例なので とりあえず…「名前つきバッファ"z"に "abc"という三文字を入れておく」 場合について考えましょう. どのようにするのかの概略を書くと…

まず, 名前つきバッファ"z"に内容を入れるような操作を自動的にするには…

という操作なら, 特に後にゴミも残さずに出来そうです. ([注] uコマンドは 挿入した操作は戻しても, 名前つきバッファの中身は戻さないのです.)

実際にこの操作を Recording機能(qコマンドのことです)で 記録して書き出して みると…

oabc^]^"zy$u

のようになると思います.(制御文字Escに注意) この時, 文字列の最後に "q"という文字もくっついてしまうので(ゴミなので)消します. そして この内容だけを書いたファイルを作って :so!scriptfile のように呼び出せば さっきの操作と同じ事を実行しますので ひとりでに名前つきバッファの中身を設定 できますし, 設定ファイルに

source!scriptfile

のような一行を入れておけば 起動時に実行できますね
"scriptfile"のほうは

oaaa^]^"ay$u
obbb^]^"by$u
occc^]^"cy$u

のように複数書いても大丈夫だし @(バッファ名) コマンドで使うための 文字列なども書けますから マップしたいキー不足解消のために使うなんて ことも出来ます.(でも結構ややこしいかも?)


前項目, 「外部のプログラムの利用で機能拡張」へ

目次へ