読者です 読者をやめる 読者になる 読者になる

103

Vimのあとさき

vim

Vim。それはテキストエディタ

今となってはそれナシには何も書けない、というほどではないにしても、なければけっこうなストレスをこうむることになる、とは言えそうなそのエディタについて、ここ数ヶ月ずーっと編集していた本がようやく校了して少し時間ができたので、一気に書きたいと思います。

目次

  • 漢字かな変換しづらい
  • コピペしづらい
  • 一括検索の非一覧性
  • Wordをプレインテキストにできない
  • カタマリで扱える
  • 移動が早い
  • よく使うTIPS
  • 触覚的なノーマルモード
  • すぐ消せる
  • 目を動かさなくて済む(ことが多い)
  • 検索・置換
  • まとめ・宣伝

漢字かな変換しづらい

とりあえず「Vimのどこが苦手か」ということから書くと(なぜ)、それはいまだにつらめのところでもあり、

シフトを押しながら矢印キーで移動しても文字が選択されない

というところ。今でもついやろうとして「あ、できないんだ・・」って残念になることがある。

これがVimでなければ(というか普通は)、たとえば、

山路を登りながら、こう考えた。

なんて文章(夏目漱石『草枕』(青空文庫))に対して、「考えた」を「かんがえた」にしたいなと思ったら、最後の「た」と「。」の間にカーソルを置いて、そこからシフトキーを押しながら左矢印キーを3回叩けば「考えた」が選択される。
その状態で「かな変換キー」を連打するか、Google日本語入力なら「コントロール+シフト+r」をポンと押せば変換候補が出てくるので、あとはタブキー等で好きなところを選択してエンターすればそれに変換される。

これは大変重宝されるやり方なんだけど(私には)、Vimでそれをやるのは難しい。

言い換えるとしかし、これはもっと大きな

Vimってそもそも矢印キーを使った操作に向いてない

という事実を示しているにすぎないのかもしれず、いかに矢印キーから脱却・卒業できるか、というのがVimを楽しめるかどうかを分けたり分けなかったりするのかもしれない。

コピペしづらい

もうひとつ「うわー無理だVimこれー」と思ったのは、

コピペしづらい

ということで(カット&ペーストも含む)、といっても、これは同じファイル内でのコピペならむしろラクなんだけど(その場合はコピペというよりyank/putということになるようだけど)、異なるファイル間、あるいは別のアプリケーションとの間で文字要素をコピペしようとするとかなりつらいことになる。

とくにぼくがやるようなテキスト編集の作業では、エディタのファイルからファイルへ、あるいはワードなりエクセルなり何なりの別アプリとテキストエディタとの間で、どんどんコピペしまくるのでこれがしづらいというのは結構きつい。

で、この点については、今使っているMacVimは柔軟に、「コマンド+x/c/v」によるコピペとか、あるいはCUIVimなら「:w」等としなければならない保存も普通に「コマンド+s」で出来るとか、一般のエディタ操作との互換性が高いので、実際にはそれで何とかしのいでいる。

#でも後述のように、Vimには「:q」で終了とか「/」で検索とかのコマンドモードならではの良さも多いので、一般のエディタ的操作性「の方が」良いということではない。

一括検索の非一覧性

上記は「うわーVimだめだー」と思った点だが、「わーCotEditorのあの機能よかったってつくづく思うわー」というのがこれで、たとえば長文の中で特定の単語が何個、どこに、どうやって出てくるか、というようなことを知りたいとき(あるある!)、CotEditorなら一括検索でこんなふうに見える。

これは片岡義男さんの『ラハイナまで来た理由』(青空文庫)という小説の冒頭から「僕」という言葉を検索したところだけど、これをCotEditorでやるためのアクションは、

  • 「コマンド+f」で検索窓を出して「僕」を記入してエンター。
  • 「シフト+コマンド+f」。

という、これだけ。
これだけをやると、こういう画面がバッと出てきて、「僕」にハイライトが入って、左下には何個それが該当しているかも出てくる。

同じことをVimでやろうとすると、『実践Vim』に書かれているTIP99「レジスタにTODOアイテムを収集する」(globalコマンドとyankコマンドを組み合わせて)で近いことが出来なくもなく、実際使っているけど、それはトラックパッドに手を伸ばすのが面倒だからというだけで、見やすい&使いやすいのは圧倒的にこっちである。

ようは一覧性、俯瞰して一気に把握するみたいなことが、こういったエディタは(とくにCotEditorは)やりやすい。

#CotEditorの検索機能については小飼弾さんも書いていた。
http://blog.livedoor.jp/dankogai/archives/50819304.html

Wordをプレインテキストにできない

これはVimが駄目ということではなく、Jeditが偉い、という話なんだけど、仕事柄どうしてもWord使用をゼロにすることはできず(というかWordにもいいところは少なからずあるし)、かつそのWordに記載されたテキストだけをとりあえず使いたい、という場合、Jeditだと、Dockのアイコンまたはすでに開かれたプレイン・テキスト形式のファイルにそのWordファイルをドロップすると、なんとプレインテキスト状態で展開される。

それ、何がいいの? とこの時点で思う人にはすみません、という感じだが、共感される人には「へえ」て感じだと思う。

で、これはMacVimでもCotEditorでもできない。(設定をなんかすれば出来るんだろうか)
Macデフォルトのテキストエディット.appだと、Dockアイコンにドロップすると近いことはできるが、開いたファイルに乗せてそのままプレインテキストとして扱う、ということはできない。(設定をなんかすれば略)
Jeditはこの点においてほんとすごい、と思うし実際そのために起動することも少なくない。

カタマリで扱える

とまあそんなわけで、それまで使っていたCotEditorやJeditというエディタに慣れた身からすると、Vimを使うためにはそれなりの障壁を超えていかなければならなかったのだけど、結果だけを見るともうVimから非Vimに戻るほうがよっぽどつらい。
ということで、以下にはVimを使う理由のほうを書いていく。

Vimのいいところはやっぱり、

文章を任意のカタマリとして扱える

ということで、言い換えると、Vimだと文字を「図」や「面」のように扱える。(と感じる)

たとえば、こんな文章があったとして、

山路を登りながら、こう考えた。
智に働けば角が立つ。情に棹させば流される。意地を通せば窮屈だ。とかくに人の世は住みにくい。

この2行目をカットしたいなーと思ったら、ノーマルモードで「智に働けば〜」の行のどこかにカーソルを置いて、「d」を2回叩けばいい。
で、そのカットした文を1行目に持っていきたいと思ったら、1行目にカーソルを置いて「シフト+p」すればいい。(あるいは1行目をddしてそのままp)

Vimには「テキストオブジェクト」という概念(というか)があるけど、まさに文章をモノ(オブジェクト)のように扱う感覚があって、それが非常に直感的というか触覚的というか、まるで手足を大きく動かして彫刻を作っていくかのように文章を作っていけるのが面白いし、いろいろ理に適っているような気もする。

移動が速い

Vimエディタ上でカーソルを動かすとき、矢印キーもマウス(orトラックパッド)も使わずに、つまりキーボードから手を動かさずに、思うところへ移動することができる。

キーボードから手を離さないで作業できるのでそれだけでもスピードは上がるし、おかげで手も体もラクである。

たとえばスクリーン一面にエディタのウィンドウを広げていたとして、それいっぱいに文字が埋まっていたとする。
ここでマウスを使えば、その中の「何行目のここら辺にカーソルを置きたい」という意志を、ほぼそのまま、厳密に実現することができるが、それにはけっこうな負荷というか、ストレスというか、神経を費やすことになる。
一回一回の作業における負荷は小さくても、これを一生続けていくと考えると結構おぞましい。

同じことをVimでやろうとすると、「大体このぐらいの行の、大体このぐらい右側まで」というふうに、まるでゴルフで徐々にカップに近づいていくように近似をとりながら目標に近づいていくことになるけれど、しかしその、まさにゴルフボールが中空を経由して打点から着地点へ飛んでいくように(グリーンをひたすら転がっていくようにではなく)移動することに、Vimの本質的な良さがある。

別の喩えで言うならば、北海道のAさんと沖縄のBさんが話をするために、どちらかが(あるいは双方が)相手に会うために実際に移動してしまうのではなく、電話で話すことで一瞬にして、かつそれぞれの地元にいながら用が済むみたいな、そういう「瞬間移動感」がVimにはある。

これはマウスの重量を軽くするとか(あるいは持ちやすくするとか)、矢印キーの移動速度を上げるとか、そういう風に到達できる速さやラクさとは次元が違う。
それらは順列滑走型の、いわば全力で走るブルドーザー、あるいは滑降するスキーヤーのようなもので、そのときVimはピョンピョンと飛び跳ねながら目的地を回遊するソニック・ザ・ヘッジホッグである。(よく知らないが)

もしスクリーン上で絵を描くとかであれば、マウスの機能はVimのそれよりずっと有効だろうけど、タテとヨコの移動しかないテキスト・ライティング(コーディング)においては、こうした瞬間移動的挙動のほうが圧倒的に有利という感じがする。

よく使うTIPS

概念的・抽象的な話だけでもわかりづらいので具体的な話も少しすると、よく使うのは、ノーマルモードだと

  • 「シフト+g」で最下段 / 「gg」で最上段に移動。
  • 「o」でカーソルが置かれた下に空行追加&インサートモード / 「シフト+o」で上に同。
  • 「シフト+v」でカーソルがある行全体を選択。
  • 「dd」で行ごと消す(+コピー(yank))。
  • 「p」または「シフト+p」でそれをペースト(put)。
  • で画面半分ぶん下へ移動 / で上方向に同。
  • で画面一つぶん下へ移動 / で上方向に同。
  • で文章全体を1行下へ送る / で上方向に同。
  • 不要な語句を選択して「s」でその語を消しながらインサートモードに。
  • (矩形ヴィジュアルモード)を使って数十行全部の行頭にインデント(字下げ)またはナカグロを一気に挿入。
  • 「シフト+a」でその行の最後尾、「シフト+i」で行頭にインサートモードで入る。
  • gm」でその行の真ん中に飛ぶ
  • 「シフト+m」で画面全体の真ん中の行(50行あれば25行地点)に飛ぶ。
  • 「u」でアンドゥ / でリドゥ

とか。他にもいろいろあるけれど、パッと浮かぶだけでもこれだけあって、かつexコマンドやインサートモードでもいろんな便利なことができるの本当に多彩だし、何しろこれらをやっている間、矢印キーもマウスも一切触っていない。

触覚的なノーマルモード

ふたたび、やや抽象的な話をすると、Vimで編集をしていると文字に直接触っているような感覚を覚える。
とくに、ノーマルモードで文字列を選択してカットや移動しているときって、手で掴んで動かしているような気になっている。

以前に『実践Vim』の感想を書いたとき、本ではインサートモード時の移動についてほとんど書かれてなかったな、みたいなことを書いたら、KoRoNさんから、「インサートモードでは移動とかしない。書くことに絞る」のようなことを教えて頂き、それからというもの、書いていない時には大抵ノーマルモードにしているけど、たぶんそれもあってこの「手で掴んで一気に動かす」感覚の恩恵を受けている。

同時に、今後メインエディタを非Vimには出来ないんじゃないか、と思うのはこれが一番大きいかもしれず、非Vimの入力欄でしょっちゅう「あ、これできないんだっけ・・」と思うのは、行ごと「シフト+v」で選択するとか、「dd」でその行をカットするとかが出来ない、矢印キー使わなきゃいけないなんてメンドイ! みたいな時だったりする。

すぐ消せる

超細かい話&Vimに限らないことだろうけど、開いてるファイルを問答無用に「:q!」で消せる、というのは案外でかいメリットだ。
たとえばCotEditorなら上述の一括検索の利便性、JeditならWordのドラッグ&ドロップによる展開など、それぞれならではの良点があって、そういう機会には躊躇なく併用しているけど、そういうのって、ひとしきり使い終わって「さあこのファイル閉じよう」ってコマンド+wすると必ず「保存しますか?」って出てくる。

いいんだよ、もうお前の役割は終わったんだからそのまま消えてくれ、と思っていても必ずそれが出てきて、しかもこのときにデフォルトで選択されているのは「保存する」の方で、ここから「保存しない」を選択するためにはタブキーとかでは切り替えられず、結局マウスを使ってそこにカーソルをあわせてクリックしなければいけない事が多く、これって凶悪で最悪だと思う。

その点、Vimだとそういう使い捨てのテキストファイルを閉じようと思ったらコマンドラインに(つまりノーマルモードで)「:q!」と打てばいい。「保存しますか?」なんて聞かれない。

目を動かさなくて済む(ことが多い)

上記のTIPS「で文章全体を1行下へ送る / で上方向に同」は大変素晴らしく、この素晴らしさに通底する性質がVimにはある(Emacsとかは知らないのでそういう比較ではない)。

の何がいいかというと、カーソル位置は文章上の同じ場所にキープされたまま文章全体がずり上がっていくことであり、で1行ずつずり下がっていくのも大変ありがたい。
これをどうしてそんなに重用するのかというと、これによって「目を動かさず、代わりに文章を動かす」ことができるからで、目を動かさないからいろいろラクに感じる。

通常の文字編集ではカーソルの位置=書いている/読んでいる部分がどんどん移動していき、それを目で追っていくわけだけど、そしてまた「書いている」ときにはそれでとくに不自由を感じないけど、精読しているときには、目を動かさずに文章自体が動いてくれるほうがラクに感じる。(私は)

これに似たのがKindleとWebページの違いで、Kindleは読みやすいとよく言われるが、ぼくにとってはスクロールできない電子書籍なんて読みづらくて仕方がない。スクロールしないから読んでいる場所を目で追っていかなくてはならず、始終目を動かすことになる。
スクロールができれば、目で見る先はほぼ固定したまま文章自体を上下できるのでその方が体がラクだ。
iBooksがスクロールでも読めるようにしたのは、その点をわかっていると思う。

ちなみに、カーソル位置が固定されたまま上下に動かせるのは一行ごとのだけで、でもそうあってほしいんだけどその場合はカーソル位置は元の語句の上から離れてしまう。
あるいはせめて、「5」とかしたらその後はドットを押すごとに5行ずつずり上がる、とかになってくれるといいんだけどそうならず惜しい。は便利だけど1行ずつだとちょっとまだるっこしいことがある。

検索・置換

一括検索については上記のとおり、CotEditor(あるいはJedit)の方に分があると思うけど、文章中の特定の語句を「一個ずつ」確認しながら変更処理していく、という場合にはVimのほうが良い。

大体、Vimで編集作業をしているときには毎回ほぼ必ず、ノーマルモードで「/」を打ち込んで語句の検索をしている。MacVimでは「コマンド+f」で検索窓がポンと出てくるけど、これを使うことってほとんどない。

さっきの片岡さんの例文で言えば、「/僕」と打ち込んでエンターした時点ですべての「僕」にハイライトが入り、あとは「nnnnn...」と連打することでどんどん画面上に「僕」が別のハイライト色とともに出てくる。
ここでもぼくの好きな「目をほとんど動かさずに文章の方が動いてくれる」事態が発生し、大変ありがたい。

また、置換するときにもVimは大変重宝する。
ぼくは基本、一括検索は好きだけど一括置換はやらない。見えないところで語句が変わってしまうのが怖すぎて、よっぽど問題がないときにしか使わない。
しかしそのようなときでもVimならば、たとえば「僕」を「ボク」にしようという場合、

:%s/僕/ボク/gc

としてエンター。その後、内容を確認しながら「yyyyyy...」としていくことで見る見る「僕」が「ボク」になっていく。
このときにも手で文字を触っている感覚が非常にある。

ただしこのときにちょっと困るのは、たとえば100個の「僕」があるうち、文脈の都合でその中の37個をママ(変換しない)にしなければならない、といった場合、後半でママにすべきところをうっかり変換してしまうと、すぐには戻せない。
一旦「q」で抜けだして、再び検索でその場所まで「y」なり「n」なりを使ってたどり着かなければならないのがけっこうたいへんで、実際何度かこの目にはあった。

まとめ・宣伝

まだいくつかあった気はするが、ある程度のトピックは挙げ終えたのでここで一旦まとめ。

結局のところ、ぼくが感じるVimの利点・美点というのはやっぱり

  • マウスとか矢印キーに手を伸ばさなくていい
  • 順列滑走型ではないジャンプ型移動
  • ノーマルモードにおける実感的・触覚的テキスト処理

といったところに集約されるのかなあ、という気がする。

そしてなんと、というかついに、というか冒頭にも書きました、おととい校了したばかりの以下の本(CDブック)は、テキスト編集に関わるほぼ全ての場面でMacVimを使用した、私にとって初めての制作物です。

commmons: schola vol.13 Ryuichi Sakamoto Selections: Electronic Music

commmons: schola vol.13 Ryuichi Sakamoto Selections: Electronic Music

べつにこの宣伝につなげるためにこんな長文を書いたわけではまったくなかったのだけど、結果的にそうなって良かったです。

#ちなみにそれの発売はまだ少し先で、来年1月末です。同時期にTVもやるようですから、ぜひあわせてご高覧ください。
http://tower.jp/article/news/2013/09/18/n07
http://natalie.mu/music/news/99629

#追記:トップのVimのロゴについて、KoRoNさんのVim Advent Calendar 2013の記事、関係ありそうだと思って読んでみたら、

ばっちり該当していたので、差し替えました(Wikipediaから辿って使っていた)。ご教示ありがとうございます!