Xeebi

home categories feeds

$ git commit だけのお付き合いのための小さな .vimrc

問題

友人に Emacs 使いがいて,彼は一応 Vim の基本操作は習得しているものの,.vimrc はない状態にある. git commit した時にエディタが立ち上がるが,そこで Emacs を立ち上げるのもなんだかなあだし, 敢えて nano を使うような人間でもなく,微妙な顔をしながら素の Vim を使っているということだ.

世の中に Vim 入門記事は色々あるものの,全体に Vim を普段のエディタとして使うことを想定したものが多い感じで, git commit 程度のお付き合いの人がサクッと幸福度を上げられる記事はあまりない,ような気がする. というわけで,この目的に絞った minimal な .vimrc + α を考えてみました.

その前に

Vim の基本操作といえば h, j, k, ld, c, x, r あたりと,insert/visual/normal モードの使い分けあたりが入ってくるのではないかと思う. 全般に :vimtutor すればよいのだけれど,この辺多少使えるようになったらもうひとつ覚えるとよいのは次のどれか(個人の感想です).

特におすすめは最初の text objects で,個人的には vim の良さのかなりの部分を占めていると思う1.たとえば | がカーソルとして

"The (quick bro|wn) fox"

ここで viwbrown, va((quick brown), vi"The (quick brown) fox が選択できるようなもの. v の代わりに d なら削除,etc. commit するだけならまあそんなに vim の操作に熟達することも必要ないだろうが, Vim Advent Calendar 2013 97日目:モモンガでもわかるテキストオブジェクトとオペレータ あたりがよくまとまっている.基本的に i は in, a は(不定冠詞の) a のつもりでいると良い.

f t とかも,例えばここから ) の直前まで削除なら dt) と,単に動くだけじゃなくて色々使いでがある.

.vimrc

ここから

without

まずこれを目指します.

with_vimrc

commit message だけなので特段自動インデントとか索周りとかそういうのも要らんだろうということで.

 1 scriptencoding utf-8 " encoding used in this script
 2 filetype plugin indent on  " ファイルタイプ毎の諸々
 3 syntax on
 4 set smarttab " indent/tab 周りを色々
 5 set spelllang=en_gb,cjk " languages for spell checking
 6 set timeout timeoutlen=1000 ttimeoutlen=100
 7 set lazyredraw " don't redraw screen while executing macros etc.
 8 
 9 set cursorline " highlight current line
10 set laststatus=2 " show statusline even when there's only one window
11 set list " \t, 行末などを可視化
12 set listchars=tab:>-,eol:$ " 可視化する文字の設定.お好みで
13 set number " show line number
14 set showmode  " tells us which mode we're in
15 set showcmd " show what command is being typed
16 set ruler " show current position
17 
18 set t_Co=256 " for terminals that support 256 colours
19 set background=dark
20 colorscheme jellybeans
21 
22 augroup GitCmd
23   autocmd!
24   autocmd filetype gitcommit setlocal spell " enable spell check for git commits
25 augroup END

ファイルはここに置きました. これを $MYVIMRC (linux 系では $HOME/.vimrc) に保存すればよい. (全部 utf-8 で揃っていて比較的平和な linux 環境でためしているので, window とかだとエンコーディング周りで問題が発生するかもしれないが,不明).

幾つか解説を入れると

augroup とかの事情についてはvimrcアンチパターン - rbtnn雑記が詳しい.

ここで color scheme はデフォルトのではないから,インストールしていただかなくてはならない. 個人的なおすすめは色々あるのだが,ひとつずつ挙げるなら黒背景の jellybeans, 白背景なら pencil がおすすめ. 例えば colors/jellybeans.vim$HOME/.vim/colors/ に保存などでインストールできる. 白背景の時にはこう書く

set background=light
colorscheme pencil

デフォルトで入ってる色の中では desert, morning あたりが評価が高いように思うが,まあ好きなのをつかうのがよい.

Plugin をつかう

上のは .vimrc だけでやるものだが,git commit に関してはすごくおすすめの plugin があるので, 制約がないならそれの使用もおすすめしたい.

その名は committia.vim3.これを併用すると,こうなる.

with_committia

右側に diff, 左上に編集枠,下に commit 状況を示した区画.めっちゃ使いやすい.

インストールは i) 何らかのプラグインマネージャを使う ii) 手動でやる のいずれか. プラグインマネージャは大仰ではあるものの,使わないとすぐ収集がつかなくなるのも事実で, git commit だけの人にどちらを奨めるかは悩ましいところがある.

plugin について

plugin 関連のファイルは基本的に $HOME/.vim に置く.構造はこういう感じ

.vim
├── autoload/  # 必要に応じて遅延読込されるファイル/ライブラリなど
├── colors/    # colorscheme. jellybeans.vim とかをここに入れる
├── doc/       # help ファイル.
├── ftdetect/  # 拡張子が .md なら markdown にしてよとかそんな話
├── plugin/    # plugin の本体.
└── syntax/    # シンタックスファイル

必要に応じて他のディレクトリも作られる.ほとんどのプラグインはこのディレクトリ構成を保って作られているので, project/autoload の中身を $HOME/.vim/autoload へ,といった形で展開すればインストールできる.

plugin managers

プラグインマネージャは,vim じたいにそういった機構が無いこともあって,様々なものがある.中でも圧倒的に有名なのは

の3つ.Pathogen は git に依存しない.Neobundle は Vundle から派生して魔改造が次々と施されているものだ. 他にも Kana神によるRuby 製のもの4Haskell 製のものもある. 使ったことはないけれどどちらも丁寧な設計がされている模様で,乗り換えの検討もアリ.

今回はこのうち neobundle を使った例を紹介してみる.理由は特に無く,ただ日本語で一番情報が豊富なため,といった程度である. 好きなのを使ってみて欲しい.

というわけで Committia 導入

Readme に従って neobundle 導入後,.vimrc

こうじゃ

filetype off

if has('vim_starting')
    set runtimepath+=expand('$HOME/.vim/bundle/neobundle.vim')
endif
call neobundle#begin(expand('$HOME/.vim/bundle'))

NeoBundleFetch 'Shougo/neobundle.vim'
NeoBundle 'rhysd/committia.vim'
call neobundle#end()

Vim を再起動するか :source $MYVIMRC して, :NeoBundleInstall でインストールされる. あるいは上述の通り,~/.vim/ 以下に直接ダウンロードしてきても良い.

Committia の設定

let g:committia_min_window_width = 100  " これ以下の幅では左右分割しない
let g:committia_hooks = {}
function! g:committia_hooks.edit_open(e)
    setlocal spell
endfunction

g:committia_hooks という global variable (本体は dict)を用意してそれを読んでもらう. edit_open を登録し,commit message 編集域についてだけ spell check を行うという形に. この場合,最初に提示した augroup の中身は不要.

ともかくこれで上記のスクリーンショットの状態になる. この状態の .vimrc は こちら

FAQ

auto-closing な parenthesis がほしい

これについては,僕が全く使わないのでなんとも言えない.閉じ括弧の処理を考えず,括弧が自動で閉じるだけなら

inoremap ( ()<Left>
inoremap { {}<Left>

といった感じでやれば良い.閉じ括弧のところで Insert mode を抜けたくない場合には, 個人的に頑張る方法もある けれど,プラグインに頼るのもよいだろうとおもう. 今なら多分 cohama/lexima.vim5 がアツい.

もうちょっと色々設定してみたいが,参考になる資料はないか.

基本的には他人の .vimrc を漁るのがよく,Vimrc 読書会 への参加は勧められる. 他には ぼくのかんがえたさいしょうのvimrc - derisの日記, 少し硬派に vimrc基礎文法最速マスター - 永遠に未完成などを読むのもいいかもしれない. また,Cohama さんの .vimrc は丁寧に作られていて,初心者のころかなりお世話になった.

tab の幅とかが気になる

vim-jp » Hack #137: タブとインデントの設定を理解する をどうぞ.

カーソルキーを使ってしまう.矯正したい

noremap  <Up>    <Nop>
noremap  <Left>  <Nop>
noremap  <Right> <Nop>
noremap  <Down>  <Nop>
noremap! <Up>    <Nop>
noremap! <Left>  <Nop>
noremap! <Right> <Nop>
noremap! <Down>  <Nop>

手ぬるいぞ!

noremap <Up> :<C-u>echoerr "Don't use that key!"<CR>

もっとだ!

noremap <Up> :<C-u>!sl<CR>

まだまだ

noremap <Up> :<C-u>!rm -r . " <CR>

所謂危険シェル芸何でもどうぞ.


というわけで,どうぞよしなに.

なお,git と vim といえば Agit.vim も超おすすめです.

  1. これは vi にはない機能で,readline とかの “vi keybind” ってやつには無く,結構不自由してしまう.

  2. 逆に set nocompatible 一本で戦う手もあるのかもしれない(?)

  3. 作者による紹介記事

  4. 作者による紹介記事

  5. 作者による VimConf での発表資料