Humanity

Edit the world by your favorite way

「実践Vim 思考のスピードで編集しよう!」レビュー (1日目)

この記事はVim Advent Calendar 2012の276日目の記事です。
また「実践Vim」のレビュー記事の1日目でもあります。

全て読み切ってからレビュー書こうと思いましたが、
KoRoNさんにTwitter

2回に分けても良いのよ? VACにしても良いのよ?

MURAOKA Taro on Twitter: "@tyru 2回に分けても良いのよ? VACにしても良いのよ?"

と仰せつかったので何回かに分けちゃいます。
(ちょうどVACも書く人がいなかったみたいで、ちょうどよかった)


また本書はKoRoNさんにプレゼントしてもらいました。重ね重ねありがとうございます。
「実践Vim」レビュワー選考結果発表 — KaoriYa

本書

効率良い編集方法を模索しながらVimをある程度長く使っていれば、
大体Vimの効率の良い使い方が理解できてくると思いますが、
helpを読んだり、他のユーザのvimrcを見る以上に、
熟練Vimmerに使い方と背景にある考えを見て/聞いてしまった方がよっぽど上達が早いものです。
本書はどのように考えてそのコマンドを選んだのかをとても分かりやすい図付きで平易に解説しています。
本書はまさにVimの知の高速道路となる本だと思います。
(ただ本当に基本的なコマンドについては知っている前提なので、vimtutorは読む前に済ませておきましょう)


ちなみに本書のターゲットOSは特に記載していませんが、Unix系がターゲットとなっています。
そのため:shellや:!コマンドで外部プログラムを呼び出しての
フィルタリング操作はWindows環境では使えない可能性があります。
その場合GnuWin32等のUNIXツールWindows移植版ツール群を入れることで使えるようにはなりますが、
sortコマンド、uniqコマンド等はそれぞれ「:sort」「:sort u」*1として実装されていますし、何より本書を読めばそれらのツールに頼らなくともテキストを整形する方法が考えられるようになっているはずです。
本書はそういう本です。

Vimの組込み機能について重点的に書かれた本

本書にはほぼvimrcの設定例のような記述はありません。
デフォルトマッピング前提での記述がほとんどです。
例えば、コマンドラインウインドウの章では「:qのつもりでq:を押してしまいコマンドラインウインドウを開いてしまう」のなら「いっそのこと:をq:に割り当ててしまう」とか「を割り当てて無効化する」などといった設定を勧めるといいのではないかと思いました。*2
あとコマンドラインモードからコマンドラインウインドウに切り替えられるとの記述がありますが、このキーは'cedit'オプションで変更可能であることは記載されていません。
よってVimのカスタマイズ方法ではなく、あくまでVimの組込み機能の使い方について重点的に書かれているといった印象です。
しかし、おかげでカスタマイズできない状況*3Vimを使っている人にも勧められるような内容になっています。
Vimは設定しなければ使えない」と言っているような人にこそ、本書を読んでほしいと思います。*4

繰り返しに便利なgnコマンドも紹介してほしかった

Practical Vim執筆当時は存在しなかったと思うので仕方ないですが、
繰り返しについてあそこまで重点的に解説されているなら、比較的最近追加された「gn」について紹介されているといいと思いました。
以下はgnコマンドの例です。(#がカーソル位置を表すとします)

1. start
#

var BACKUP_FAILED  = 0;
var BACKUP_SUCCESS = 1;
var BACKUP_LINK_DELETED = 2;
var BACKUP_SKIPPED = 3;
2.「/BACKUP」と入力

var #BACKUP_FAILED  = 0;
var BACKUP_SUCCESS = 1;
var BACKUP_LINK_DELETED = 2;
var BACKUP_SKIPPED = 3;
3.「cgnTASK」と入力

var #TASK_FAILED  = 0;
var BACKUP_SUCCESS = 1;
var BACKUP_LINK_DELETED = 2;
var BACKUP_SKIPPED = 3;
4.「.」コマンドを3回入力

驚くのはここからです。
次に「.」コマンドを3回入力するとどうなるでしょうか。


var TASK_FAILED  = 0;
var TASK_SUCCESS = 1;
var TASK_LINK_DELETED = 2;
var TAS#K_SKIPPED = 3;

このように「cgn」を実行すると前回の検索結果にジャンプしてから(gn)対象を削除してインサートモードに入る(c)といった動作をします。
前まではマクロを作っていたケースが.(ドット)コマンドで簡単に繰り返し可能になったのがとても素晴らしいです。
gnコマンドがない頃は「qanc4lTASKq」のようにaレジスタに一旦記録して「@a」を押して繰り返していたのが、
「/BACKUP」で適当に検索した後、「cgnTASK」として「BACKUP」を「TASK」に置き換え、あとは皆大好き「.」(ドット)コマンドで繰り返していけばよいのです。


ちなみにgnコマンドはkanaさんが作成したvim-textobj-lastpatというプラグインと同様の機能が本体に実装されたものです。
両者の詳しい経緯は知りませんが、gnコマンドがあればvim-textobj-lastpatはいらないと思われます。

総括

初級者、中級者、上級者、どの層が読んでも、そして何度読み返しても発見がある、そういった本だと思います。
TIPS集ですが初めから読んでも違和感がなく、じっくり読んでも、ふとパラパラとめくったページを読んでもいい本に仕上がっている点も素晴らしいです。
私が唯一同じ印象を持った本は「サーバ/インフラを支える技術」です。
あの本も読み返す度に何か気付かせてくれる本です。
Vimの効率の良い操作をもっと知りたいと思ったら、現時点で本書以外の選択肢はないでしょう。

*1:uniq -c相当のコマンドはありません

*2:私は設定していませんが、あくまで考え方の例として

*3:職場で使っているサーバ上で個人アカウントが与えられていないのでvimrcが作れない等

*4:ただそう言った人が本書を買って、vimtutorを済ませてVimの操作体系に慣れ、本書を読んで勉強する気概を持ち合わせているかどうかは別ですが...