$ git commit だけのお付き合いのための小さな .vimrc
問題
友人に Emacs 使いがいて,彼は一応 Vim の基本操作は習得しているものの,.vimrc
はない状態にある.
git commit
した時にエディタが立ち上がるが,そこで Emacs を立ち上げるのもなんだかなあだし,
敢えて nano
を使うような人間でもなく,微妙な顔をしながら素の Vim を使っているということだ.
世の中に Vim 入門記事は色々あるものの,全体に Vim を普段のエディタとして使うことを想定したものが多い感じで,
git commit
程度のお付き合いの人がサクッと幸福度を上げられる記事はあまりない,ような気がする.
というわけで,この目的に絞った minimal な .vimrc
+ α を考えてみました.
その前に
Vim の基本操作といえば h
, j
, k
, l
と d
, c
, x
, r
あたりと,insert
/visual
/normal
モードの使い分けあたりが入ってくるのではないかと思う.
全般に :vimtutor
すればよいのだけれど,この辺多少使えるようになったらもうひとつ覚えるとよいのは次のどれか(個人の感想です).
- text objects
w
/e
/b
辺りの単語 (word/WORD) 単位移動f
/t
とオペレータの組み合わせ
特におすすめは最初の text objects で,個人的には vim の良さのかなりの部分を占めていると思う1.たとえば |
がカーソルとして
"The (quick bro|wn) fox"
ここで viw
で brown
, 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
ここから
まずこれを目指します.
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 とかだとエンコーディング周りで問題が発生するかもしれないが,不明).
幾つか解説を入れると
set spelllang=en_gb,cjk
:cjk
を入れると日本語を無視してくれる.set nocompatible
は.vimrc
があれば自動的に設定される.書いてると様々なオプションがリセットされるので,書かないほうがむしろよろしい2.timeout
のあたり : ちょっと複雑な話になるのだが,timeoutlen
が map の待ち時間,ttimeoutlen
は key code の待ち時間. 前者は例えばjk
という打鍵をマップした時に2つの間に置ける待ち時間,後者は例えば矢印が<Esc>OA
とかそういうの.僕も完全に理解しているわけではないが, 短めに設定しておくと<Esc>
で待ちが入らないとか色々良いことが多いように思う.自身はttimeoutlen=10
にしているが,100位を挙げる例が多いので それに従った.set lazyredraw
: マクロを使うようになると嬉しさが判るはず.showmode
: いま insert なら insert と表示してくれる.showcmd
: こちらは例えばdiw
と打ってる途中で何が打たれてるのかを表示してくれる.augroup
:autocmd
は「** のときに ** してね」というような話.この例で言えば filetype が gitcommit の時に,スペルチェックをオンにする. これをグループごとに区切るのがaugroup
.autocmd!
は登録されたautocmd
を消す命令で,これがないと例えば:source $MYVIMRC
した時に二重に登録されることになる.
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.これを併用すると,こうなる.
右側に 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 製のもの4やHaskell 製のものもある. 使ったことはないけれどどちらも丁寧な設計がされている模様で,乗り換えの検討もアリ.
今回はこのうち 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 も超おすすめです.