Vim の使い方について

Vim で何をしているか

コードを書いている時間が生活の中で最も長い。必然とプラグインや設定もコードを書くときの生産性を高めるようなものになっている。

次にメモをよく書く。メモにもいろいろあって、ブログの下書きをたまに Vim で書くことがある、そのときはだいたいはてな記法を使う。Markdown もたまに書く。

ミーティングなどの議事録みたいなものをとることもある、これもはてな記法。ブログの下書きなどに近い。はてなグループで編集が衝突することを避けるため。

アイデアは Taskpaper 形式で Dropbox 以下にためている。Taskpaper というのは名前から想像できるとおり、プレーンテキストで To-Do 管理をする同名のアプリケーションが採用しているごく簡単なアノテーション

To-Do 管理をきちんとやろうと思うと Taskpaper.app だけではさすがに厳しかったのでもう使っていないけど、Taskpaper のフォーマットはアウトラインとしてとてもシンプルで使い勝手がよいので、これでアイデアなどをアウトラインにまとめている。

そこから実際にとりかかるべきタスクを抽出して他のタスク管理ツールに投げる、というのが効率的になっている。

よく使うもの

unite.vim

統一されたインターフェースで選んでなにかをするプラグイン。

source の作り方はけっこう簡単 (配列を作ることができたらほぼ完成みたいなかんじ) で便利。

よく使うソース:

  • file, file/new
  • line
    • デフォルトの検索マッピングを置き換えている
  • outline
    • ctags とはまた違った用途

ファイルを開く source は複数選択してまとめて開いたりできてたいへん便利。

line source はバッファのすべての行を unite のインターフェースで絞り込んでジャンプできる。デフォルトの / などのマッピングを上書きしている。

outline は ctags などのように関数の定義などが一覧できてジャンプできる。
outline は開いているバッファの中のみにしかジャンプできないが、デフォルトで複数の filetype の複数の outline として抽出されるべき構造が定義されている。

たとえば Ruby では alias なども関数定義と同等だろう、という思想のもとに outline が列挙する。

ctrlp

fuzzy な絞り込みを行ってファイルを開けるプラグイン。

unite-file と目的が被っているところがあるけれども、使い勝手が違うので併用している。

使い勝手というのは、主に絞り込みの感覚で、unite-file はディレクトリ構造に強く依存していることなどから fuzzy な検索を得意としていない。
そのかわりに必然とディレクトリ構造によって絞り込まれるので、fuzzy な検索ではあまりにノイズが多い場合には unite-file のほうが便利。
あと、PerlJava など階層が深くなりがちなプロジェクトでは、やはり unite-file のほうが便利だと思う。
ctrlp はフィルタをカスタマイズできた気がするから、ctrlp でもなんとかできるかもしれない。
けどインターフェースは unite のほうが好みなので、ctrlp でなんとか頑張ろうという気持ちはない。

vim-powerline

比較的、凝り性であるという自覚があるので、ステータスラインのカスタマイズなどは本当に無限に時間を失ってしまう。

だいたい出てほしい情報をいいかんじに出してくれるので、少なくとも Vim のステータスラインをいじろうという気持ちは一切なくなった。

あと、リッチにかつよいかんじに見せようとするとマジカルな記述が増えて、マジカルなものを見ると「これってなんだっけ?」と気になって調べてフルスクラッチで書き直して「わかったわかった」と理解できることを求めてしまうのもよくない。

なんにせよ、このプラグインを入れればそれで済む、というところに安心感がある。

ところで雑談なのだけれども、tmux-powerline は入れていない。tmux-powerline は普段使っている zsh のほかに bash の新しいバージョンを入れることを求めてくる。

また tmux-powerline で表示できる情報は雑談っぽくて、少し便利かもしれないけれど、少し便利というだけでいろいろ入れたりしたらきりがない。

neobundle.vim

プラグインの細やかな管理をするのに重宝している。もっとシンプルにやるならば pathogen とか unbundle とかのほうがよいと思う。

neobundle.vim の気に入っているところがいくつかあるので書いてみる。

  • git-submodule を使わずに管理できる
  • 特定のバージョン (リビジョン) を指定してインストールできる
  • インストール後に必要なコンパイルも自動化できる
  • runtimepath を指定できる

Git の submodule を使ってプラグインの管理をすると二度手間になるので好きではない。
開発が活発なプラグインを入れていると頻繁に更新されて submodule も更新しなければいけない。
あと submodule は削除がとてもめんどうなのも好きではない。

特定のバージョンを指定できるというのも重要で、開発が活発なプラグインだとたまに最新版が壊れていることがある。
報告等をするにせよ、とにかく使用に難があったりするときに最後に安定していたバージョンへ巻き戻すことができる、というのも重要。

vimproc はビルドが必要なのだけれども、これを自動化できるというのはとても便利。

runtimepath を指定できるというのもとても便利で、たまにリポジトリの root から適切なディレクトリが掘られていないプラグインがあったりする。
これらを適切に管理できるので便利。

あと NeoBundleLazy も便利で、Vim の起動時には読み込まずに、必要になったタイミングで NeoBundleSource して読み込むということができる。
unbundle の ftbundle のような機能がコアでサポートされてほしい気持ちはあるけれども、責任の範囲が少々広がりすぎてしまうかなあ、と思っている。
一応、それらしい実装は自分の .vimrc に存在しているのだけれど、そういった理由で Pull Request はしていない。

textobj-user

Vim というエディタを使っている最大の理由は text object が便利だから。デフォルトのキーマッピングはどうせ変更されるのだからどうでもいいと思う。

textobj-user はユーザが text object を定義・拡張できるようにするためのプラグインで、これを利用したプラグインはたくさんある。

たとえば textobj-wiw は CamelCase や snake_case などの複雑な区切りの語間を移動することができる。たいへん便利。

https://github.com/tpope/vim-surround + surround_custom_mapping

surround も text object の拡張のひとつ。ルールを拡張することができて、たとえば <C-g>s=<%= %> に展開できる。

zencoding-vim

HTML のマークアップはこれなしではやっていられない。

smartchr

同じ文字を連続で入力した回数によって挿入される文字列を変えられたりする。

= を1度入力すると = のように空白を含んで挿入するようなルールを定義できる。

indent-guides

soft tab によるインデントを可視化するプラグイン。これで soft tab に渋々ながらも移行できた。

思想

エディタを使う上で、とにかくなにかを書くときのパフォーマンスを高めることだけを考えている。

エディタはエディタであって、それ以上の責任を持つべきではないと思っている。

追記 (2013-01-02)