ホーム » 技術 » viのZZのこと

viのZZのこと

実をいうとZZのことは書かないつもりだったのだが、成り行きで書いた方がいい雰囲気になってきたので書くことにした。viに関する記事は2週間ぐらいのうちに別途公開予定なので、本論はそちらで語りたい。今回は完全に脱線だ。

923

最近の若い人(まあ自分はそう言う権利はあると思う)は、だいたいviを終了するのに :wq を使う。だがこれには問題がある。ファイルをtouchしてしまうのだ。自分にとっては不用意なtouchは不要なmakeなどにつながるので困るのではないかと思うのだが、近年のコードの管理手法や、必ずしもコンパイルしなければならない訳ではない開発環境や、コンパイルに一晩かかるわけではない強力なマシンの普及などによって、touchされても問題ないという向きなのかなと考えるようになった。が、なんだかよくよく話を聞いてみると「ZZなんて知らない、だいたい:wqと:qと:q!を習うので使い分けている」などというのだ。それはまったく困った話だ。

実際、巷にあふれている入門書や、繰り返し掲載される雑誌の記事などを見ると、viの終了コマンドとして「保存して終了します」などと称して:wq、「書き込まずに強制終了します」と:q!を紹介して終わり、というようなケースが多い。ZZを紹介しないのだ。そういうわけなので、そんなものがあると知らない人が増える一方なのだ。

viを終了させるのにZZを使う理由はいくつかある。第一は、ZZは変更されたバッファだけを書き込んで終了するという点だ。もしバッファに変更を加えなかったとすれば、ZZは何もせずに終了してくれる。ファイルはtouchされず、余計な書き込みは行われない。このようなmodify-flagの管理をする必要がないというのが、ZZの利点なのだ。ZZを使うときは「変更があればセーブして欲しいし、変更がなければtouchして欲しくない」という、ごく当たり前の要求をごく普通に実行してくれるシンプルなコマンドなのである。

第二の理由は、ZZはviコマンドだということだ。え、:wqはなんなのかって? これはexコマンドだ。「:」を押した時点でexモードに移行しており、リターンキーを押すまで実行されない。「viを終了させたい」のなら、ZZを使ったらよいのだ。残念ながらviには、変更されたバッファを書かずに終了するコマンドがないので、そういうときはexコマンドの:q!を使うことになるが。

第三の理由は、ZZはキーストローク最小で望む結果を得られるということだ。ZZは2ストロークだが、:wqはリターンまで含めて4ストロークだ。昔、「ZZはシフトキーを押しているから都合4ストロークだろ。まあオマケで3ストロークにしといてやる」と屁理屈を並べた友人がいたが、じゃあ「NASA」は5文字なのかよ、という話である。そんなわけないよね。

さてここでvimのマニュアルがどうなっているのか見てみよう。

=============================================================================
02.7  Vim の終了

Vim を終了するには “ZZ” コマンドを使います。ファイルが保存され、Vim が終了しま
す。

        Note:
        他の多くのエディタと違い、Vim は自動的にバックアップを作成しません。
        “ZZ” と打つとファイルが上書きされるため、元に戻す方法はありません。バッ
        クアップファイルを作成するように設定することもできます。07.4を参照し
        てください。

変更を破棄する
————–

ファイルを編集した後で、元の方が良かったと気づくことがあると思います。心配はい
りません。「全部投げ捨てて終了する」コマンドがあります。

        :q!

コマンドを確定するには <Enter> キーが必要ですよ。お忘れなく。

詳細を説明すると、このコマンドは三つの部分から成っています。”:” はコマンドライ
ンモードの開始、”q” コマンドはエディタを終了するコマンド、”!” はオーバーライド
修飾詞です。
変更を破棄するにはオーバーライド修飾詞が必要です。単に “:q” を実行した場合、エ
ラーメッセージが表示され、コマンドは実行されません:

        E37: 最後の変更が保存されていません (! で変更を破棄)

オーバーライドを指定することで、「バカげたことをしてるように見えるのはわかって
る。でもボクは大人だし、本当にそうしたいんだ」と Vim に告げているわけです。

Vim を終了したくない場合は、”:e!” コマンドでオリジナルのファイルを再読み込みで
きます。

https://vim-jp.org/vimdoc-ja/usr_02.html#02.7

というわけで、終了の項にはこの2つしか紹介されていない。実に合理的だ。

参考リンク