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

タオルケット体操

サツバツいんたーねっと

社内で新人教育と称してVim勉強会を行ったことのまとめ

プログラミング

社内で新人教育と称して、新人の僕が皆にVimを教える会で言ったりなんだりしたことのまとめになります。

なんで今更エディタの勉強なんか……と思われる向きもいるかと思いますので、Vim勉強会を開くに至った経緯を軽く説明します。
僕の所属する部のチームは、環境や書くプログラムのレイヤーの関係上IDEの恩恵を受けにくいところが多く、エディタ使い、それもVim使いが圧倒的多数なのです。ただ、使ってはいるもののvimrcをいじったりプラグインを入れまくっている人間は僕を含め数人しかおらず、どうせだったらちょっと教えてよ! みたいな感じで開くことになりました。

僕はVimを愛用していますが、「別にIDEで不自由しねーし」という方は別にVimつかう必要なんてないと思っています。あと新卒の方で、「エディタよくわかんないんで良さそうなの探しています」という方はとりあえずSublime Text入れていじってみるのが良いと思います。

* * *

前置きが長くなってしまいました。
そういうわけで、ある程度Vimを常用している人が対象だったので初歩的な操作よりも「Vimだってプラグイン導入でここまでリッチに出来るよ!」という感じの説明をした方がキャッチーだと考え、勉強会での説明はほぼプラグインの導入、管理の方法と代表的プラギンの紹介に終止しました。

なるべく簡単に済ませたつもりですが、恐らくめんどくさすぎて結局導入してないぜという方も多いと思うので、読んでなぞるだけで再現出来るようテキストに残します。
また、余裕があれば勉強会では説明の出来なかった操作系の説明(特にオペレーター周り)やキーマップのいじり方などを軽く説明しようかと思います。

0. はじめに

Windowsの方は、Kaoriya-vimでググってそれを導入するのがいいんじゃあないんでしょうか。

Macの方、標準状態で入っているVimは問題が多いのでmacportsとかhomebrewとか、そういうので入れたの使いましょう。

Linuxの方、現時点ではDebianの標準リポジトリVimは7.2で古いです。動かないプラグインや効かない設定などが出てくるので、困ったら別のリポジトリ追加したりとかしましょう。

最新版とかコンパイルオプションいじったりとかしたい人は自分でビルドしましょう。

1. プラグインを簡単に管理する

まず、Vimが特別扱いするファイルとディレクトリについて簡単に説明します。

  • $HOME/.vimrc

    いわゆる設定ファイルです。存在すれば、Vimが勝手に読み込んでくれます。自動で作られたりはしないので自分で作りましょう。
    Windowsでは_vimrcらしいのですが、実は.vimrcでも読み込んでくれた気がします。

  • $HOME/.vim/

    シンタックスプラグインなどを保存するためのruntimeディレクトリです。
    詳しいところが気になる方はhelpやvim-users.jpなんかの記事を参照しましょう。

neobundle.vimの導入

手動でプラグインの導入や管理をするのは大変なので、楽をします。
プラグインを管理するプラグインにはいくつか種類がありますが、ここでは一番メジャーでイケてるneobundleを紹介します。
導入は、以下のGitHubリポジトリのREADMEをみてその通りコピペしてください。

Shougo/neobundle.vim

NeoBundle 'ほにゃらら'
という部分があるかと思いますが、ほにゃららの部分でインストールするプラグインの名前を指定します。
プラグインの置き場所による、ほにゃらら部分の指定方法についてはREADMEの部分に書いてあるので割愛します。

その他、細かい挙動や各指定の意味がわからなかったら、:help neobundleなどとしてヘルプを参照すると丁寧にのっています。

2. 重要プラグインの解説

  • Shougo/vimproc

    現在のところ、Vimは標準では非同期実行をサポートしていません。それを実現するための外部ライブラリです。neocomplcacheをはじめ、これに依存するプラグインは多いので、是非導入しましょう。
    READMEに全部書いてあるので、ここでは導入についての説明はしません。各自の環境に合わせてコンパイルしてください。

    なお、複数環境で同じvimrcを使いたい(特にWindowsと共用したい)みたいな方で、vimprocのロードがうまくいかない方はg:vimproc_dll_pathなどを設定して明示的にロードしてあげると解消されたりとかするんじゃないんでしょうか。

  • Shougo/neocomplcache

    Vimの補完機能を強化するためのプラグインです。
    僕がVimを使い始める決め手になったプラグインですね。補完機能を嫌うプログラマも多いですが、VisualStudioからプログラミングを始めた僕にとって、補完のないプログラミングライフはありえません。

    語ることは多くありません。READMEに書いてある通りの設定をvimrcに書き込みましょう。そして好きなファイルを開いて編集を初めてください。素晴らしさがわかるかと思います。
    また、clang、haxeなどの賢いコード補完へのインターフェースを提供するプラグインに対するインターフェースとして動かすことも出来ます。

    追記: 今ではneocomplcacheはdeprecatedな感じで、 Shougo/neocomplete.vim · GitHub の利用が推奨されています。if_luaの有効化などが理解出来る方はneocompleteの方を使いましょう。

  • Shougo/neosnippet

    コードスニペットを提供するプラグインです。同じ作者のneocomplcacheの補完と協調して動いてくれます。

  • Shougo/unite.vim

    説明するのが難しいプラグインなのですが、とりあえず入れておきましょう。
    暇な時に、このプラグインについて説明している記事などを参照してください。そのうちに素晴らしさが理解出来るはずです。

  • kien/ctrlp.vim

    直感的にファイルを探して、開くことができるプラグインです。いちいちシェルに戻ったり、:e してパスを打ち込んだりする生活に疲れたら導入しましょう。

  • thinca/vim-quickrun

    編集中のファイルをコンパイルしたり、実行したり出来るプラグインです。VisualStudioでいうならにあたるかと思います。
    :make コマンドをもっとリッチにした感じで、vimprocを使えば非同期で実行することも出来ます。
    また、非常に柔軟な設定が可能で、quick-fixなどとの連携も出来るなど素晴らしいモノです。
    私はまだあまり使いこなせてはいないのですが、osyo-manga氏のブログには、以下の記事をはじめ、丁寧な説明と変態的な素晴らしい設定例の数々が載っているので大変参考になります。

  • scrooloose/syntastic

    僕はこのプラグイン嫌いなんですけども、一応。
    他言語対応の、シンタックスチェック&ハイライトを行ってくれるプラグインです。非同期動作に対応してくれないので、Scalaのようなコンパイルに時間のかかる言語を書いているとイライラするので使っていません。
    僕は最近はPythonばっかり書いているので、pyflakes-vimで事足りています。僕は、そのうちosyo氏のWatchdogsとvim-hierを連携させよーかなぁなどと目論んでいますが、設定が煩雑なのでこちらを紹介しました。

個人的に必須(一部除く)的なプラグインを紹介しました。
とりあえず、ここらへんを入れておいて使い方を覚えるだけで貴方のVimライフは今までと違った物になるでしょう。
素敵なプラグインでライバル達に差をつけて、今年の夏はビーチ中の注目を集めてみませんか。

3. 操作について

心構え

さて、最低限のプラグインを入れてリッチな環境を手に入れたところで、今度は自分自身のVim力を上げていきます。
複数のモードと、多彩で複雑な(Vimmerは直感的と呼ぶ)キー操作はVimの欠点であり、利点でもあります。これらを使いこなさないのであれば、Vimを使っている意味はないとも言えるでしょう。ed使ってください。

とりあえず、移動に十字キーを使っている方は

nnoremap <Up> <NOP>
nnoremap <Down> <NOP>
nnoremap <Left> <NOP>
nnoremap <Right> <NOP>

inoremap <Up> <NOP>
inoremap <Down> <NOP>
inoremap <Left> <NOP>
inoremap <Right> <NOP>

をコピペして、.vimrcに貼付けてください。
慣れてきたら、別の、時々必要になるような動作に割り振ってください。筆者は分割した画面の幅調整を行えるようにしています。

operator

ある程度Vimを使っている方であれば、例えばyyで一行コピーとかsは一文字消しつつ挿入モードへという基本的操作については学んでいるかと思うので、そこらへんは割愛します。

さて、なんとなく長い間Vimを使っているという方であっても、operatorというものを意識することは少ないのではないでしょうか。
例えば少しこみいった(例えば関数定義から、引数を消すだとか)作業をする時に、vを押してVisualModeに入って十字キーで移動、xで削除……という手順を踏んでいる方は多いかと思います。

operatorはVimの高い文章編集能力を支えている素晴らしい機能です。覚えて使いこなすことで、今までVisualModeに頼っていた作業のほとんどは、数回のコマンド操作で置き換えることが出来るでしょう。

きほん

ydのコマンドについてはご存知かと思いますが、これらの、命令の後に範囲をとるコマンドをoperatorといいます(多分)。

例えば、ywと打てば「現在のカーソル位置から、一単語分の範囲をヤンクする」となります。dGは「現在のカーソル位置から、文章の一番下までをカットする」という動作になります。
他にもfコマンドと組み合わせてyf,とすれば、「現在のカーソル位置から、カンマのある場所までをヤンクする」という意味になります。

思ったよりも単純で簡単な機能だったかと思います。しかしこれらの操作は、覚えてしまえばかなり直感的に編集作業を行うことが出来るようになります。Vimを使うのであれば絶対に覚えましょう。

text object

Vimには、text objectという素晴らしいものがあります。
特殊な範囲を表す機能であり、これをoperatorに渡すことが出来ます。

例えばi(は「()で囲まれている範囲」を表すことが出来ます。また、a[では「[]自体と、で囲まれている範囲」を表すことが出来ます。

これを使えばyi(で 「()で囲まれている範囲をヤンクする」という操作が出来ます。すごいですね。

さいごに

operatorやtext objectには、先に上げた以外にもいくつかの種類があります。:h operator で参照してみてください。

また、kana/vim-operator-userのように、自分でoperatorを拡張できるプラグインや、text objectを拡張出来るプラグインなども存在するので、標準のモノに不満が出たら色々導入してみるのも良いかと思います。

頑張って書いて疲れたので、キーマップについてはまた後日書きます。