春なのでemacsからvimに乗り換えてみました

20090407vim
春です。
何か新しいことがしたくなるこの季節。
ついにemacsからvimに乗り換えてみました。

というわけで、ここ一週間ほどゲームもtwitterもろくにせず、ひたすら.vimrcをカスタマイズしまくっていました。
正しくはカスタマイズすべくググりまくっていたんですけど‥‥。

その甲斐あってかなり満足するものが出来たので、思い切って晒してみます。

まず最初に私がインストールしたvimですが、いくつか試して最終的に以下のCocoa版に落ち着きました。

PrivatePortfile/Vim72 - MacPortsWiki-JP

最初はMacVimなどを使っていたのですが、他のはiminsert=0が使えませんでした。

それでは、.vimrcをぺたりんこ。


.vimrcにあるウィンドウ周りの設定が効いていなかったので.gvimrcに移動しました。
あと、vcscommandプラグインを使い始めたのでruntimepathに追加しました。

TEXT:
  1. "-------------------------------------------------------------------------------
  2. set nocompatible       " vimですよ
  3.  
  4. "-------------------------------------------------------------------------------
  5. " ステータスライン
  6. set laststatus=2 " 常にステータスラインを表示
  7. set statusline=%<%F\ %r%h%w%y%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%4v(ASCII=%03.3b,HEX=%02.2B)\ %l/%L(%P)%m
  8.  
  9.  
  10. "-------------------------------------------------------------------------------
  11. " 基本設定
  12. let mapleader = ","            " キーマップリーダー
  13. set scrolloff=5                " スクロール時の余白確保
  14. set textwidth=0                " 一行に長い文章を書いていても自動折り返しをしない
  15. set nobackup                   " バックアップ取らない
  16. set autoread                   " 他で書き換えられたら自動で読み直す
  17. set noswapfile                 " スワップファイル作らない
  18. set hidden                     " 編集中でも他のファイルを開けるようにする
  19. set backspace=indent,eol,start " バックスペースでなんでも消せるように
  20. set formatoptions=lmoq         " テキスト整形オプション,マルチバイト系を追加
  21. set vb t_vb=                   " ビープをならさない
  22. set browsedir=buffer           " Exploreの初期ディレクトリ
  23. set whichwrap=b,s,h,l,<,>,[,]  " カーソルを行頭、行末で止まらないようにする
  24. set showcmd                    " コマンドをステータス行に表示
  25.  
  26. filetype indent off            " ファイルタイプによるインデント
  27. filetype plugin off            " ファイルタイプごとのプラグイン
  28.  
  29. "-------------------------------------------------------------------------------
  30. " 表示
  31. set showmatch         " 括弧の対応をハイライト
  32. set showcmd           " 入力中のコマンドを表示
  33. set number            " 行番号表示
  34. set list              " 不可視文字表示
  35. set listchars=tab:>.,trail:_,extends:>,precedes:<" 不可視文字の表示形式
  36. set display=uhex      " 印字不可能文字を16進数で表示
  37.  
  38. " 全角スペースをハイライト
  39. if has("syntax")
  40.     syntax on
  41.     function! ActivateInvisibleIndicator()
  42.         syntax match InvisibleJISX0208Space " " display containedin=ALL
  43.         highlight InvisibleJISX0208Space term=underline ctermbg=Cyan guibg=Cyan
  44. "        syntax match InvisibleTrailedSpace "[ \t]\+$" display containedin=ALL
  45. "        highlight InvisibleTrailedSpace term=underline ctermbg=Red guibg=Red
  46. "        syntax match InvisibleTab "\t" display containedin=ALL
  47. "        highlight InvisibleTab term=underline ctermbg=Cyan guibg=Cyan
  48.     endf
  49.     augroup invisible
  50.         autocmd! invisible
  51.         autocmd BufNew,BufRead * call ActivateInvisibleIndicator()
  52.     augroup END
  53. endif
  54.  
  55. " カレントウィンドウにのみ罫線を引く
  56. augroup cch
  57.   autocmd! cch
  58.   autocmd WinLeave * set nocursorline
  59.   autocmd WinEnter,BufRead * set cursorline
  60. augroup END
  61.  
  62.  
  63. "-------------------------------------------------------------------------------
  64. " インデント
  65. set autoindent
  66. set smartindent
  67. set cindent
  68. " softtabstopはTabキー押し下げ時の挿入される空白の量,0の場合はtabstopと同じ,BSにも影響する
  69. set tabstop=4 shiftwidth=4 softtabstop=0
  70. set noexpandtab " タブをスペースに展開しない
  71.  
  72.  
  73. "-------------------------------------------------------------------------------
  74. " 補完・履歴
  75. set wildmenu           " コマンド補完を強化
  76. set wildchar=<tab>     " コマンド補完を開始するキー
  77. set wildmode=list:full " リスト表示,最長マッチ
  78. set history=1000       " コマンド・検索パターンの履歴数
  79. set complete+=k        " 補完に辞書ファイル追加
  80.  
  81.  
  82. "-------------------------------------------------------------------------------
  83. " 検索設定
  84. set wrapscan   " 最後まで検索したら先頭へ戻る
  85. set ignorecase " 大文字小文字無視
  86. set smartcase  " 大文字ではじめたら大文字小文字無視しない
  87. set incsearch  " インクリメンタルサーチ
  88. set hlsearch   " 検索文字をハイライト
  89.  
  90. "選択した文字列を検索
  91. vnoremap <silent> // y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR>
  92. "選択した文字列を置換
  93. vnoremap /r "xy:%s/<C-R>=escape(@x, '\\/.*$^~[]')<CR>//gc<Left><Left><Left>
  94.  
  95.  
  96. "-------------------------------------------------------------------------------
  97. " エンコーディング関連
  98.  
  99. " 改行文字
  100. set ffs=unix,dos,mac
  101.  
  102. " デフォルトエンコーディング
  103. set   encoding=utf-8
  104.  
  105. if has('win32') && has('kaoriya')
  106.   set   ambiwidth=auto
  107. else
  108.   set   ambiwidth=double
  109. endif
  110.  
  111. if has('iconv')
  112.   let s:enc_euc = 'euc-jp'
  113.   let s:enc_jis = 'iso-2022-jp'
  114.  
  115.   if iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==# "\xad\xc5\xad\xcb"
  116.     let s:enc_euc = 'euc-jisx0213,euc-jp'
  117.     let s:enc_jis = 'iso-2022-jp-3'
  118.   endif
  119.  
  120.   set   fileencodings&
  121.   let &fileencodings = &fileencodings.','.s:enc_jis.',cp932,'.s:enc_euc
  122.  
  123.   unlet s:enc_euc
  124.   unlet s:enc_jis
  125. endif
  126.  
  127. if has('win32unix')
  128.   set   termencoding=cp932
  129. elseif !has('macunix')
  130.   set   termencoding=euc-jp
  131. endif
  132.  
  133.  
  134. "-------------------------------------------------------------------------------
  135. " キーバインド関係
  136.  
  137. " 行単位で移動(1行が長い場合に便利)
  138. nnoremap j gj
  139. nnoremap k gk
  140.  
  141. " バッファ周り
  142. nmap <silent> <C-l> :bnext<CR>
  143. nmap <silent> <C-h> :bprevious<CR>
  144. nmap <silent> ,l    :BufExplorer<CR>
  145.  
  146. " 検索などで飛んだらそこを真ん中に
  147. nmap n nzz
  148. nmap N Nzz
  149. nmap * *zz
  150. nmap # #zz
  151. nmap g* g*zz
  152. nmap g# g#zz
  153. nmap G Gzz
  154.  
  155. "usキーボードで使いやすく
  156. nmap ; :
  157.  
  158.  
  159. "-------------------------------------------------------------------------------
  160. " プラグインごとの設定
  161.  
  162. " migemo.vim
  163. if has('migemo')
  164.   set migemo
  165.   set migemodict=/opt/local/share/migemo/utf-8/migemo-dict
  166. endif
  167.  
  168. " YankRing.vim
  169. nmap ,y :YRShow<CR>
  170.  
  171. " qfixhowm.vim
  172. set runtimepath+=~/.vim/plugin/qfixapp
  173. let QFixHowm_Key                   = ','
  174. let howm_dir                       = '~/Documents/howm-vim/'
  175. let howm_filename                  = '%Y/%m/%Y-%m-%d-%H%M%S.howm'
  176. let howm_keywordfile               = '~/Documents/howm-vim/.howm-keys'
  177. let howm_fileencoding              = 'utf-8'
  178. let howm_fileformat                = 'unix'
  179. let mygrepprg                      = 'grep'
  180. let MyGrep_ShellEncoding           = 'utf-8'
  181. let QFixHowm_RecentDays            = 10
  182. let QFixHowm_SaveTime              = 2
  183. let QFixHowm_RecentMode            = 2
  184. let QFixHowm_Replace_Title_Pattern = '^=\s*\(\[[:a-zA-Z0-9 ]*\]\s*\)\=$'
  185. let QFixHowm_Replace_Title_Len     = 64
  186. let QFixHowm_MruFile               = '~/Documents/howm-vim/.howm-mru'
  187. let QFixHowm_MruFileMax            = 20
  188. let QFixHowm_ShowTodoOnMenu        = 1
  189. let QFixHowm_ShowSchedule          = 10
  190. let QFixHowm_ShowScheduleTodo      = 10
  191. let QFix_CloseOnJump               = 1
  192. let QFix_Height                    = 25
  193. let QFix_SearchPathEnable          = 1
  194. let QFix_SearchPath                = '~/Documents/howm-vim/'
  195. "if has('mac')
  196. "  let MyOpenURI_cmd = "call system('/usr/bin/browser %s &')"
  197. "endif
  198.  
  199. " vcscommand.vim
  200. set runtimepath+=~/.vim/plugin/vcscommand
  201.  
  202.  
  203. "-------------------------------------------------------------------------------
  204. " ユーティリティ
  205.  
  206. " 現在開いているファイルのある場所に常にcdする
  207. au   BufEnter *      exec ":lcd " . expand("%:p:h")

次に.gvimrc。完全にOSX用です。
タブを便利に使えないか、いろいろと試行中です。

TEXT:
  1. "-------------------------------------------------------------------------------
  2. " デザイン
  3. colorscheme desert         " カラースキーム
  4. set guifont=Osaka-Mono:h14 " フォント
  5. set antialias              " アンチエイリアシング
  6. set transparency=230       " 半透明
  7. set guioptions-=T          " ツールバー削除
  8.  
  9. highlight CursorLine ctermbg=black guibg=gray10  " カーソル行の色
  10.  
  11. " 挿入モード・検索モードでのデフォルトのIME状態設定
  12. set iminsert=0 imsearch=0
  13.  
  14. "日本語入力中のカーソルの色
  15. "highlight Cursor guifg=NONE guibg=Green
  16. highlight CursorIM guifg=NONE guibg=Red
  17.  
  18. " メニューを英語に戻す
  19. source $VIMRUNTIME/delmenu.vim
  20. set langmenu=none
  21. source $VIMRUNTIME/menu.vim
  22.  
  23. " 様々な箇所を英語に戻す
  24. lang en_gb
  25.  
  26.  
  27. "-------------------------------------------------------------------------------
  28. " ウィンドウ
  29. set sessionoptions+=resize " 行・列を設定する
  30. set lines=48               " 行数
  31. set columns=160            " 横幅
  32. set cmdheight=1            " コマンドラインの高さ
  33. set previewheight=5        " プレビューウィンドウの高さ
  34.  
  35. set splitbelow             " 横分割したら新しいウィンドウは下に
  36. set splitright             " 縦分割したら新しいウィンドウは右に
  37.  
  38.  
  39. "-------------------------------------------------------------------------------
  40. " タブを使う
  41. "nnoremap <C-h>  gT
  42. "nnoremap <C-l>  gt
  43. "nnoremap <Leader>1 1gt
  44. "nnoremap <Leader>2 2gt
  45. "nnoremap <Leader>3 3gt
  46. "nnoremap <Leader>4 4gt
  47. "nnoremap <Leader>5 5gt
  48. "nnoremap <Leader>6 6gt
  49. "nnoremap <Leader>7 7gt
  50. "nnoremap <Leader>8 8gt
  51. "nnoremap <Leader>9 9gt

入れてるプラグインは以下の通り。

  • Align
  • migemo
  • qfixhowm
  • changed
  • grep
  • mru
  • surround
  • project
  • yankring
  • incbufswitch
  • commentout
  • bufexplorer
  • vcscommand

Alignとsurroundとcommentoutはマジで最強というか、無いと死にます。
使い始めて4日で死ぬとか大げさかもしれませんが、マジで死にます。超便利。

emacsからの移行で一番悩んだのがhowmなんですが、QFixHowmのおかげで完全移行出来ました。
QFixHowm - vim用howmプラグイン ?(fudist)?

ただ3点ほど悩んだことがあって、一つ目はメニューページの文字化けです。
こちらはvimrcで日本語のエンコード判定処理をちゃんとしたものを入れたら直りました。

二つ目はautocmdを使って開いているファイルの場所を常にcdするようにしているのですが、その設定との相性の悪さです。
QFixHowmはファイルを開くときに絶対パス指定していないので、適当にcdをされるとファイルが開けなくなるようです。

仕方ないのでmyqfix.vim925行目あたりを以下のようにしました。

TEXT:
  1. if g:QFix_FileOpenMode == 0
  2.       CloseQFixWin
  3.       " 絶対パスにする
  4.       exec 'edit ' . expand(g:howm_dir) . a:fname
  5.       silent! wincmd o
  6.       OpenQFixWin
  7.       silent! wincmd p

三つ目はminibufexpl.vimとの相性の悪さです。
いずれもウィンドウを分割して情報表示するので、一緒に使うとウィンドウがめちゃくちゃになります。
結局minibufexpl.vimを使うのをやめ、bufexplorer.vimの方にしました。
結果的にこちらの方が性に合っているようで、かえって良かったです。

emacsからの乗り換えは完全に「なんとなく」ってだけなんですが、CTRLキー押しまくりで左の小指が痛くなることが無くなったのが思いの外大きな収穫でした。
こんなことならもっと早く乗り換えておくべきだったかな?

最後になりましたが、あちこちで.vimrcを晒してくださった方々、プラグインを公開してくださった方々、vim本体やパッチを公開してくださった方々、そして私がvimに触れるきっかけとなったVimperatorの作者とその界隈の方々、本当にありがとうございます。
そしてこれからもよろしくお願いいたします!


関連記事