2019-07-10viに初めて触れたのは1986年の頃だった。プログラミングの師匠に、Cでコードを書くならviが便利だと勧められたのだ。ところがそもそもviが動く環境がない。したかというと、先輩の下宿に遊びに行くたびにPCを借り、プログラミングの手ほどきを受けるたびにviの使い方も習うという具合だった。自分で自由に使えるようになったのはPC-286v(これもPC-9800の互換PCだ)を買い、MS-DOSで動く互換viを手に入れた1988年だ。TOOLS」が出て、「MS-DOSを256倍使うための本」が出て、DOS環境をUnix化するのが(個人的な)ブームだった。TOOLSのおかげで多くのコマンドがUnixぽくなった......が、問題はviだった。この頃の自分にとってもっとも重要な事は、viがどの程度「本物」に近い動作をするか、ということだった。Joyが作ったバージョンのviという意味だ。これを実際に使うことは非常に難しかった。1988年当時、Unixを触るには大学の計算機センターに行って端末の前に座るしかなかったのだ。インターネットはまだ自由に使える時代ではなかったのだ。苦労してVAX11/785のアカウントを手に入れるのだが、それにしても徹夜でコードを書けるような環境ではない。そこで自宅のPCで、DOSで動く互換viを使うことになる。当時の自分は、cursesのマニュアルを読みながらPC-9800のエスケープシーケンスでtermcapを作りメンテナンスするぐらいにviに凝っていた。脱線だが、termcapをチューンするとlessなんかも調子よく動く。ページバックするときに本当に逆スクロールさせるには、正しいエスケープシーケンスを登録しておかなければならないのだ。この延長で同じくcursesライブラリを使っていたNetHack用に98パッチを送る縁ができ、それがきっかけでdevteamに名前が載ることになるのだが、まあそれは別の話だ。viのキーバインドに慣れるためにrogueをやりすぎて、斜めにカーソルを動かそうとしたこともあった。当時の互換viは、キーバインドをviっぽくしただけのなんちゃってviが多く、使っていると却ってストレスが溜まるエディタも多かった。viは「i」と「ESC」を交互に押すとカーソルは左へ1文字ずつずれていく(わかりますよね?)。ところがいい加減な実装だと、これが再現できていない。思うかもしれないが、viをタッチタイプで使っているとコマンドモードでのカーソルの移動が思った場所に行かないことが途方もないストレスになる。些細な振る舞いも、どうしても見逃せない瑕疵に思えてしまうのだ。「cw」などとしたときの振る舞いだ。互換viではこれを「dwi」っぽい動作で代替することがある(最後のスペースを削除しないので厳密には異なる)。最終的な結果は同じかもしれないが、画面の書き換えの様子は全然異なる。本物のviには「ボーレートが低い端末で画面書き換え工程を最小にするために、変更範囲を$で示す」という機能が備わっている。具体的には以下のような差になって表れる。viとvimの違いこれも一見つまらない機能に見えるが、慣れると手放せなくなってしまう。自分の場合、retypeするようなときは「元々何と書いてあったか」が表示されていた方が修正しやすく、とても便利だからだ。それなのに互換viのようにバッサリ消されてしまうと「あれ、なんて書こうと思ってたんだっけ」ということになってしまう。時代はvimさて、時代は変わって無料のUnixが世に出回ってきたころ。FreeBSDを使っていたときは何の問題もなかった。FreeBSDにはnviという非常に互換性の高いviが備わっていたので、文句のつけようがなかったのだ。仮想化ショック後、Linuxに乗り換えると事情が変わった。Linuxにnviはなく、vimを使わなければならないからだ。実はvimはMS-DOSの頃に触ったことがあり、やはり互換性の問題で使うのをあきらめた系のエディタだった。それから20年過ぎて他に選択肢がなくなってしまったので渋々使い始めたのだが、vimは大きく進化していた。vimのvi互換モードは、viを完璧に再現できているという。compatibleと書くことだ。これでvi互換は保たれる。あとはお好みのオプションを好きなだけ書き加えればよい。......さて、これで話はおしまいなのだが、これだけではツマラナイのでもう少し話を続けよう。vimがvi互換性を実現するために具体的にどんなことをしているのかを調べてみたい。見た目はシンプルだが、その動作はかなり複雑だ。1つのオプションを設定すると、69個のオプション設定に影響が及ぶ。これらは、vimによって拡張された機能の数々を、vi互換性のために無効にしたり、調整するために変更される。自分にとっては「vimにおいて追加された、viとは互換性のない新機能」のリストに見える(わはは)。見てみると、たしかにvimのほうが合理的だなとか、新機能は便利だなと思われるものもなくはない。いうオプションがある。同等のスペースに置き換える機能だ。書くときは重要と思うが、常にONにしておきたいワケではない(たぶんsyntax解釈と絡めると便利に使えるのだろうが、そういう機能も求めていないので使っていない)。これはチルダコマンド(大文字と小文字を変換する機能がある)をオペレーターとして扱うというオプションだ。本物の動作に慣れすぎて、ちょっとONにするのが怖い(ONにしてしまうとチルダが即座に実行されなくなる)。こちらは52個ものオプション文字からなる。それらは、実に瑣末な振る舞いの違いを指定することができるようになっている。使ったとき、最後の空白の前から挿入する。このフラグが含まれていないと、最後の空白の後から挿入を開始する」とある。ぶっちゃけどうでもよさそうに見えるが、どうでもいいなら本物と同じ動作であってほしい、と思うわけだ。これはLisp用インデントモードのとき、vi互換かvim拡張かを選べるオプションなのだが、「これが含まれないと、いくらか良いアルゴリズムが使われる」とマニュアルに書いてある。モードなんて使ってないので、いちいち設定するまでもないかと思いとどまるのだった。ペアのような文字列もカッコとして扱ってくれるし、ダブルクォートで括られた文字列内のカッコを無視して「賢く」対応するカッコを探してくれるというのだ。これは確かに便利なので、これだけ利用したい。cpo-=%逆に、もしも前述した「$」表示機能を利用したいという正統派vimmerの方がいらっしゃるなら、このように記述すればよい。cpo+=$ところでつらつら書いていてひとつ気づいたことがあるのだが、長いコンピュータ人生において自分が最初に触れたエディタはviだったんだなということに今さら思い至った。PascalについていたWordstar互換の簡易エディタか、それより以前だとMAIコンパイラとかPORTについていたラインエディタ、はたまたN-BASICのエディタとは呼べないようなエディットモードが原体験で、きちんと機能を持ったエディタはviが最初だったのだ。vzもMifesもこれより後の話なので、そりゃあviが好きに決まってるよなあと改めて思う次第だった。