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

Vimらしい操作性について

Vim

12時を11分30秒ほど過ぎました所でこんばんは。
この記事はVim Advent Calendar 2012の5日目の記事です。
なおこの記事はAnthyiPod toucheskk.vimによって書きました。


今回色々書きたいネタはあったのですが、とりあえず迫りくる締切から逃れるために一番書きやすそうなネタを選びました。(余裕できたら2周目に書くんだ...)
という訳で今年は「Vimらしい操作性」について書いてみようと思います。
また、Vimの操作性については前も書いてるので、そちらもよければ参照してください。


表題のことを考えたきっかけは、Sublime Textのmultiple cursorsという機能について、Twitter上でのある人(晒しっぽくなってしまうのが嫌なので仮にAさんとしておきます)とKoRoNさんの会話でした。

え、vim使い的にはmultiカーソルって一括置換と同じ意味しか無いの・・・逆に頭堅いのでは……

ソレ以外にどんな用途があるのか逆に教えてほしいなぁ。一括置換で不十分なケースでは:global使って全体に繰り返し操作(.)すればだいたい事足りそう。 https://twitter.com/...

@kaoriya 3行おきにきまった文字列入れたいとか、検索で見付けた行の次の次の行をセンタリングしたいとか括弧の位置を合わせたいとかです。複雑な検索式考えれば何とかなるかも知れないですけど考えなくてもなんとかできるのが一番の利点だと思います

@xxx Vimをちゃんと使えるようになるというのは、そういう検索式を複雑だと感じなくなることと等価です。

僕にはKoRoNさんの言いたいこともAさんが言いたいこともよく分かったのですが、KoRoNさんが言ってることをVimのことをよく知らない人が聞けばBoRoN暴論だと思うだろうなぁと考えてやりとりを見ていました。
Aさんは対話性に主眼を置いた話をしているのだと思いますが、極論を言うとVimに対話性はほとんどないと思われます。
ここで僕が言う「対話性」とはどのような定義かをうまく説明してくれた文章をFirefoxアドオン開発者であるPiroさんの記事から引用します。

そういう最初のアクションを無意識レベルで起こした結果、機能がサジェストされたり視覚的なフィードバックがあったりして、そこからさらに「そういえば自分はこういうことをしたいんだった」と次の行動が喚起される。(もっと言うと、その時の既定の挙動が一番利用頻度の高い物になっている。)という風な誘導がウザくないレベルで働くようなUIが、僕にとっての「良いUI」なんでしょうね。

Latest topics > Firefoxアドオンの開発を通じて考えるようになったインタラクションデザイン - outsider reflex

「無意識レベルで起こした」「自分のアクション」に対し「何かがサジェストされる」、このような要素を持ったUIをこの記事では「対話性がある」と言うことにします。
こういった要素は少なくともVimの前身であるviにはなく、またviの「複数の小さいけれど強力なツールまたは操作の結果を組み合わせる」思想的にもなかった操作であると自分は考えています。

この「無意識」というのがとても重要なキーワードです。
なぜなら、Vimはユーザが「意識的に」行なった操作を忠実にこなしてくれますが、このような「ユーザに介入してくる」タイプの機能は、プラグインを入れなければ全く付いていないのです。


こういった「ユーザに介入してくる」タイプの機能は邪魔にもなりえます。
例えば、自動補完機能は便利ですが、最初からやりたいことが明確である場合、余計なお節介機能はレスポンスの低下を招きます。
具体例としては

  • 間違った候補を出してしまう
  • 候補の取得に時間がかかってしまう

などです。

Vimは「最初からやりたいことが明確である場合」には強力な道具が揃っていますが、何も考えずにサジェストしてくれるような機能は、デフォルトで一切付いていません。(プラグインを入れれば別ですが)

viにはありませんでしたが、Vimでは補完機能などが*1追加されました。
しかしそれも補完するキーを手動で「意識的に」押さないと発動しません。
neocomplcacheなどの自動補完プラグインを入れれば別ですが、IDEのように自動的にメソッドをずらーっと表示してくれるなどの機能は全くもって存在しません。

つまりシェルスクリプトのパイプのように、道具の組み合わせ方を自分で考えて「こういった結果を達成するためには、あれとこれを組み合わせればできそうだ」といった考え方が自然にできる人でないとVimをデフォルトのままで使いこなすのは難しいということです。
冒頭のKoRoNさんも「:global使って全体に繰り返し操作(.)すればだいたい事足りそう」と言っているように最終的なアウトプットに着目し、どのように達成するかを自然と頭の中で考えていることが分かります。

考えなくても使えること、なんてのはVimには相容れない視点なんだよね。基本的な操作を組み合わせて複雑な操作を実現するのが真骨頂だから、考えない人はウマミを全く引き出せない。Vimはそういうエディタ。 https://twitter.com/...

インタラクティブな操作で〜とか考えずに〜が重視される(=単に目の前の作業を片付けたいだけ)なら、Vimなんか使ってないでそういうツールやエディタ探してきたほうが遥かに良い。そうではなく作業工程そのものをなんらかの資産として残したいなら、Vimは良い選択肢の1つになる。

ここで言う「作業工程そのものをなんらかの資産として残したい」とは、「こういった結果を達成するためには、あれとこれを組み合わせればできそうだ」という思考を身に付けられる、ということだったのです。Vimニンジャの如く。

ただ「できそうだ」と言ってる通り、ここでは最終的な結果を明確に思い描く必要はありません。Vimには多段undo機能があるのですからいくらでも試行錯誤できます。
とはいえVimのベースとなったviでは一段(一回)までしかundoできず、やはり元々の思想からすれば対話性は皆無だったことが伺えます。

前にmattnさんが言ってたことだけど、少なくとも素のVimは「やりたいことが明確である場合にはすごく有用なツール」なんですよ。対話的な操作よりもコマンド/マクロでバッファに対して副作用を与えながらテキストを組み立てていく、sed/awkよりは対話的な操作に向いたツール

https://twitter.com/tyru/status/267323989330890752

ここで自分が言いたいのは「Vimは対話性を目的としたツールではない」ということが言いたいのではありません。(エディタが対話性を捨ててしまったらsedを使った方がマシです)
自分はむしろ対話性の無さは、ed,viから受け継がれてしまった弱点として捉えています。

ただし、行きすぎた対話性、つまり「ユーザーに介入する操作」を標準装備してしまうと、Vimの良さ*2も失われてしまうと考えています。

でもそんな感じでストイックなツールとして使うよりも、最近は「楽しさ」から来るモチベーションってすげーなと思って逆の方向に行ったりもしてる。マッピングとかゴリゴリ作って1文字タイプ減らしたとかよりも、プラグインで視覚的に目的を達成する方が楽しい、みたいな。

https://twitter.com/tyru/status/267326178216525825

インタラクションにおける視覚的なフィードバックを楽しむか、どのように最終的なアウトプットを得るかの工程を最適化することを楽しむか、どちらも様々でしょう。
実際Vimにはコードゴルフならぬvimgolfといったサービスがあります。

視覚的なフィードバックが足りないという方は、ある人が視覚的なプラグインを沢山作ってくれているので様々なプラグインを導入するといいかと思います。
自分はどちらのVimも好きですが。*3

あとがき

勢いで書いてしまい、あまりボリュームも多くなくてすみません。
今回KoRoNさんのTwitter上の発言を元に「Vimらしい操作とはどんなものか」を書いてみました。
Vimの操作はなぜこうなっているのか、またどのように使うのが一番Vimの力を引き出せて効率が上がるのか、仕事ではEclipse秀丸を使いながら、そういったことをぼんやり考えていたりします(仕事はしてます)。


次回のAdvent Calendar 6日目は@sue445さんです。お楽しみに!

*1:KoRoNさんによって

*2:ここで言うVimの良さとは、マクロ機能などの「自動化可能である」操作の強力さです

*3:どちらのVimも攻略してデレモードに入ると様々な顔を見せてくれるので大変捗り(?)ます