This page has been renovated on 08-Aug-2006
Vimスクリプトって便利だね☆
エディタVimには独自のスクリプト言語が備わっています。
これを使いこなすといろいろなことができます。
漢字コードを変換したり、Vimから辞書をひいたり、
さらに文章の自動整形をしたりもできます。
そんなVimスクリプトの便利さを少しでも伝えることができれば…
文章の自動整形を行なうformat.vim
(作:西岡拓洋さん)
の使い方を解説することで、
Vimスクリプトの可能性を知ってもらえればと思います。
|
formatの実行例
| format前 |
tw=30でformat |
format.vimは日本語の文章(英文混じり可)を、
ある一定の幅で
自動的に折り返す機能を持っている。
これを整形(format)と呼ぶ。
|
format.vimは日本語の文章(英文
混じり可)を、ある一定の幅で自
動的に折り返す機能を持ってい
る。これを整形(format)と呼ぶ。
|
format.vimは日本語の文章(英文混じり可)を、
ある一定の幅で
折り返す機能を提供する。
これを整形(format)と呼ぶ。
もともとvimには英文のformat機能は備わっているが、
日本語文章には対応していない。
format.vimはそれを補うものである。
一定の幅というのは
textwidth
(
tw)に
指定した幅+αとなる。
twが指定されない場合、76文字となる。
実際にフォーマットを行なうと、twで指定した幅を超えて折り返されることがある。
行頭禁止文字を行末にもってくる(ぶら下げる)ときに起こる現象である。
先の
+αはぶら下げ許可幅となる。
これは変数
format_allow_over_tw
によって任意に指定可能である。
format対象となる行が
twの幅に足りない時は
次行と
Join(連結)される。
Jするときに、
スペースが挿入される時とされない時がある。
この
スペース挿入ルールは3つあるが、
どれも連結する行末と行頭を調べることで決定している。
ルールの詳細は次の通り:
- 両方がマルチバイト文字(いわゆる全角文字)ならばスペースは挿入しない
- どちらか片方がマルチバイト文字ならばスペースは挿入しない
- デフォルト(基本的に挿入する)と同じ動作
ルールは変数
format_join_spacesによって、
選択することができる。
format.vimを使うためには幾つか手順が必要になる。
大まかに言って次の3ステップ。
- format.vimのインストール(香り屋で配布しているvimはインストール済み)
- 上述の変数設定(好みに応じて)
- 整形したい領域をVisual modeで選択してgq
村岡の_vimrc例(抜粋)
let format_join_spaces = 2
let format_allow_over_tw = 0
|
起動するたびに、毎回format.vimのオプションを設定し直しても構わないが、
左のように
_vimrcに記述してしまうと面倒でなくて便利。
各変数の設定の仕方は例にみられるとおりで、値は村岡の好み。
19-Jan-2002修正
format.vimは本当はスゴク高機能で素晴らしい。
その素晴らしさを少しずつ、紹介して行きたい。
但し、実際に使ってみて実感するのがformat.vimを理解する近道だろう。
-
formatする範囲はどうやって指定する?
11-Jun-2000修正
範囲の指定には、多くのvimコマンドが使えるようである。
検索(/)でさえ使えてしまう。
普段、現在の行から10行消したい時には、
d10jとタイプするだろう。
同様に10行をフォーマットしたい場合には
gq10jとタイプすれば良い。
(実はコレができないことが発覚^-^;)
当然マウスによるドラッグや
Visual mode(v)による指定の後
gqとタイプすることも可能だ。
-
段落もなんのその
format範囲内に空行があった場合は、そこを段落の切れ目と判断して、
そのまま空行を保存する。これにより広い範囲を一度にformatすることも可能。
-
インデント対応
インデントをかけたテキストには、頻繁に遭遇する。
そういった文章にもformat.vimは有効である。
キチンとインデントの深さを見分け保存してくれるし、
必要ならば補ってくれさえもする。
インデントの深さは段落毎に変化がついても大丈夫。
-
インデント補足
11-Jun-2000追記
vimのオリジナルgqコマンドでは、
aiオプションによって
インデントを補う時の挙動を制御している。
その他smartindentや
cindentの影響も受ける。
format.vimもそれに従う。
つまり、オリジナルのgqが
極力忠実に再現されているのでなにか挙動に疑問があれば、
:he gqの内容の大部分が参考になるということ。
-
インデントと段落
11-Jun-2000追記
基本的には段落の切れ目とは空白行である。しかし変数
format_indent_sensitive = 1
をしておくことで、
インデントが変わった場所を段落の切れ目と判断させることができる。
-
コメント対応
シェルスクリプトコメントや、Cスタイルのコメントにも対応している。
非常に綺麗にフォーマットしてくれる。
commentsオプションに従うので、
詳しくは:he comments参照。
細々説明するよりも実際にやってみて納得するほうが良いだろう。
本当はこのほかにも幾つも機能があるが、
説明できるほど使いこなしていない。
ただ、知らないうちに恩恵にあずかっているかもしれない。
歴史&謝辞
そもそも最初にformat.vimのプロトタイプ(jfold.vim)を作ったのは、
「ほらこんなこともできるんだぜ」ということの証明という気持ちがあった。
加えて、ちょうど一部のマニュアルの和訳をした際に、
整形に非常に苦労したということも重なっている。
最初の版から、Vim本体を拡張してしまったインチキ版を経由して、
WinでもUNIXでも動く面白いアルゴリズム(Vimのカーソルを使用する)を提案した。
ここまでが村岡の仕事の総てである。
提案したものは非常に限定された機能しか持ち合わせていなかったが、
それを基に
西岡拓洋さんが
改良を進めてくれたおかげで、現在の素晴らしいformat.vimが誕生した。
Vim本来の
gqとの置き換え、
段落・コメント・インデントへの対応、
連結方法の多様化、その他諸々の日常において非常に役立つ機能は全て、
西岡さんの手によるものである。
村岡も多用させていただいている機能である。
西岡さんには、この場を借りて感謝したい。
Vim6への移行にあたりformat.vimにも随分と手を入れた。
それにともないインストール方法が以前と変わっている。
19-Jan-2002追記
終りに
この文章と内容について、質問・コメントがある場合は気軽にどうぞ。