【一人 vimrc advent calendar 2017】vimrc を拡張するコツ【25日目】

一人 vimrc advent calendar 2017 25日目の記事になります。
今日で終わりっ!! と、言うことで vimrc を拡張するコツみたいなものを。

vimrc を設定する目的

vimrc を書こう!って言っても最初はどういう風に書けばいいのかわからないと思います。
Vim はかなり特殊なエディタなのでまずは

  • Vim らしい使い方


よりも

*自分の使い勝手のよいエディタ


を目指すとよいともいます。
Vim を使い始めた人がよく『カーソルキーを封印する』みたいな事を行っている人がいると思うんですが、そういう矯正をしてストレスを溜めるよりも『ストレスがない設定』を行っているほうがよいかなーと個人的には思います。
別に自分が使いやすければカーソルキーを使ってもええんやで…。

:help を読む

まずは基本中の基本ですが :help を読みましょう。
Vim:help がかなり充実しているので、わからないオプションやコマンドなんかが出てきたらすぐに調べる癖を付けておきましょう。

まず何から設定するべきか

vimrc ではまず、オプションを使って自分が使いやすいように挙動を制御していくとよいと思います。
どんなオプションがあるのかは :help option-list に簡単にまとまっているのでざっと眺めてみるとよいでしょう。
ちなみにオプション数は約300個ぐらいあります。
オプションの次は


みたいな順で設定を拡張していくとわかりやすいかなーと思います。

Vim script を知る

vimrc を書くということはつまり Vim script を書くことになります。
もちろん :set コマンドでオプションを設定するだけでも Vim はカスタマイズすることは出来るんですが、基本的な制御構文や組み込み関数、変数の扱いなんかを覚えるとより設定の幅が広がります。
Vim script については :help vim-script-intro なんかを読んでみるとよいでしょう。

キーマッピングを行う際の注意点

これは注意点というかわたしの持論なんですが『コマンドを呼び出すようなキーマッピングは極力しない』方がいいです。
例えば、以下のようにコマンドを呼び出すようなキーマッピングを行っていることは多いと思います。

nnoremap <Space>udm :Unite directory_mru<CR>
nnoremap <Space>urm :UniteResume<CR>
nnoremap <Space>uff :Unite file file/new -hide-source-names<CR>
nnoremap <Space>uol :Unite outline -no-quit -buffer-name=outline -winheight=10<CR>
nnoremap <Space>unb :Unite neobundle<CR>
nnoremap <Space>url :Unite reanimate:default_category -default-action=reanimate_switch<CR>
nnoremap <Space>urs :Unite reanimate:default_category -default-action=reanimate_save<CR>

一見すると便利そうなんですが、この手のキーマッピングは設定しても『まず覚えきれない』ので『無駄』です。
このようなコマンドを呼び出すキーマッピングは、


というのではなくて

  • 1日1000回ぐらい呼び出すようなコマンドはキーマッピングしておく


というぐらいのほうが無駄なキーマッピングを省くことができるので便利です。
また、長いコマンドはキーマッピングではなくてユーザ定義コマンド化しておくのもよいでしょう。

command! UniteFile Unite file file/new -hide-source-names

ただし、以下のように『デフォルトの操作を変更する』ようなキーマッピングは覚える必要がないのでどんどんしていくとよいと思います。

" https://sites.google.com/site/fudist/Home/vim-nihongo-ban/tips#TOC--3
" カーソルを表示行で移動する。物理行移動は<C-n>,<C-p>
nnoremap j gj
nnoremap k gk
vnoremap j gj
vnoremap k gk

nnoremap <Down> gj
nnoremap <Up>   gk

" カーソルキーで行末/行頭の移動可能に設定。  
set whichwrap=b,s,[,],<,>
nnoremap h <Left>
nnoremap l <Right>

頻繁に使うようなコマンドは予めユーザ定義しておく

先ほどのキーマッピングの話でもあったのですが、以下のようによく使うコマンドなどはユーザ定義しておくとよいです。

" ハードタブをソフトタブに
command! TabToSoft %s/\t/    /ge
" 行末の空白文字を削除
command! RemoveLastSpace %s/\s\+$//ge

こうすることで入力する手間を省くことが出来ます。
また、コマンド化しておけば autocmd なんかでも呼び出しやすくなりますね。

他人の vimrc を読む

他人の vimrc はパンツです。
そしてパンツは見たくなるものですよね。
vimrc を公開している人は結構いるので気になる人や憧れている人のパンツ vimrc をみてみると興奮して新しい発見があって面白いです。
とはいえ、そんなに他人の vimrc を読むことはあまりないと思うのでvimrc 読書会などに参加してみるとよいと思います。
他人の便利な設定はどんどんパクっていきましょう。

定期的に vimrc を見直す

これが一番重要です。
vimrc を設定していくとどんどん肥大化していきます。
肥大化していくと管理が難しくなったり Vim の起動時間などにも影響してきます。
vimrc はどうしても『その場』で『雑に』設定を追加してしまうことが多いので、定期的に整理していく必要があります。
特に利用していないキーマッピングプラグインがあればどんどん削除してしまいましょう。
逆にユーザ定義コマンドなどはそれほど副作用が大きくないのであまり使っていなくてもそのまま残しておいてもよいと思います。

変数のスコープに注意する

vimrc を書くと言うことは Vim script を書くことになります。
ただ、Vim script は結構癖が強い言語なので注意して書く必要があります。
例えば、変数のスコープが結構特殊で変数名に prefix を付けることでそのスコープを明示化します。

" g: をつけるとグローバル変数
" どこからでもアクセスできる
let g:value = 42

" s: をつけるとスクリプトローカル変数
" そのスクリプトファイル上でのみ参照できる
let s:value = 42

上記のようにスコープごとに別々に変数を定義します。
また、prefix を付けなかった場合は『グローバル変数』として定義されるので注意する必要があります。

" g:value と同等
let value = 42

" こういう i もグローバル変数として定義される
for i in [1, 2, 3]
   " ...
endfor

特に理由がなければ vimrc ではスクリプトローカル変数(s:)として定義することで意図しない副作用を抑えることが出来ます。

プラグインは入れたほうがいい?

これは宗教上の理由もあると思いますが、個人的には『プラグインはどんどん入れていっていい』と思います。
やっぱり世の中には便利なプラグインがたくさんあるのでどんどん使っていった方が得かなーと。
欲しいと思った機能がプラグインとしてすでにあったりするのも Vim の魅力の一つですしねー。
ただし、プラグインを使う上では以下のことに注意する必要はあります。

  • プラグインを入れることでパフォーマンスに影響することは覚えておく
  • 競合したり変な設定を行っているプラグインもあるので精査する必要がある
  • 設定が難しいプラグインもあるのでそれなりに Vim script の知識が必要
  • 定期的に使わないプラグインなどは削っていく


まあプラグインを削るのは後からでもできるので、最初は時に気にしないでどんどんプラグインをいれていっていいかなーと思います。

まとめ

  • Vim の機能は全て :help にかかれているのでわからないことがあればすぐにヘルプろう
  • まずはオプションの設定から始めるとわかりやすい
  • vimrc を書く上で Vim script の知識が必要になってくるので、慣れてきたら覚えよう
  • キーマッピングは過剰に設定してもどうせ使わないのでほどほどに
  • vimrc は定期的に見なおそう
  • プラグインはどんどん入れていこう


まー最初は慣れないので書くのが難しいと思うんですが、『習うより慣れろ』って言うことでどんどん設定を書いていくのがよいかなーと個人的には思います。
何度もいいますが、オプションやキーマッピングプラグインなどはあとからいくらでも変更する事ができますしね。
冒頭にも書きましたが『Vim らしい使い方』よりも『自分の使い勝手のよいエディタ』を目指しましょう!!

一人 Advent Calendar を終えて

vimrc は4000行とかあるからネタに困らないやろーと思って始めたんですが、意外とプラグインの設定やあまり汎用性がない設定などが多かったので思ったよりも厳しかったです。
そもそも汎用的な機能は全部プラグイン化しているんやった…。
まあでもそのおかげでネタを探すために vimrc を何回も見なおしたりしていたのでどんな設定をしているのかを見直すことが出来たのはよかったかな。

本当は最初と最後で vimrc がどうなったのか比較してみようかとも思ったのですがそんなに変わってないのでやめておきました。
さっきも書いたんですが設定の殆どがプラグインなので(ry。

そんなわけで来年は『一人 Vim plugin Advent Calendar』でも書こうかなーとは思っています。
思っているだけでやると言っていませんー。
それではまた来年ー。
と、いうか冷静に考えると 1ヶ月の間に 一人 Advent Calendar を2つやりつつ、通常の Advent Calendar の記事を3つ書いて、更に LT 用のスライドを4〜5個書くなんて頭おかC