vimrcを晒してみる

/web/tool

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

@hamashunに今さら捧ぐ。けっこう前に出すと言いつつ、伸ばし伸ばしになってたネタを投下してみます。あんまり弄ってないけども。


まず軽く紹介。Vimはviから派生したテキストエディタで、特にUNIX系OS(Linux、Mac)ではEmacsと並んで広く使用されているエディタです。プログラマによって開発されたプログラマのためにエディタであり、全ての操作をキーボードから行えることが特徴かな。基本的な操作方法は手前味噌ですが「Vim 基本操作まとめ」を参照のこと。

んで、「.vimrc」という設定ファイルを――ホームディレクトリなり、exeファイルのあるフォルダなりに――用意してやることによって、好きなように拡張して使っていくわけです。無ければ単純なVi互換モードとして動きます。今回はSig.の.vimrcを例にとって、設定ファイルの中身を軽く紹介してみます。サクッと行こう!

設定ファイルといっても、コマンドモードで「:set number」とか打ったことあれば、基本的に似たような決め打ちを列挙していくだけです。条件分岐とかも書けるけど、まあ十分使えます。

  1. set nocompatible
  2. set tags=~/.tags

まずは Vimの各種機能を利用する「おまじない」。2行目はタグジャンプを使う場合に、生成したタグファイルを指定する部分。無くても全く問題ない。

  1. " display
  2. " ----------------------
  3. set number
  4. set ruler
  5. set cmdheight=2
  6. set laststatus=2
  7. set statusline=%<%f\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P
  8. set title
  9. set linespace=0
  10. set wildmenu
  11. set showcmd
  12. "set textwidth=78
  13. "set columns=100
  14. "set lines=150

続いてウィンドウ幅やステータスバーの設定をば。ちなみに二重引用符でコメントです、あしからず。
上から行番号の表示、ステータス行にルーラーを表示、コマンド行やステータス行の表示調整や、ファイル名補完時のメニュー表示機能の追加など。最後の3行はウィンドウの大きさや自動改行の挿入位置ですね。78字での自動改行は、コードレイアウトのガイドラインですが、他人のソースを修正したり、HTMLやテンプレファイルを操作するには邪魔なので消してます。

  1. " syntax color
  2. " ---------------------
  3. syntax on
  4. colorscheme ron
  5. highlight LineNr ctermfg=darkgrey

シンタックスハイライト。元からある色セットにちょろっと追記してるだけです。Macだともうちょい弄ってるけど、まあ好みで。

  1. " search
  2. " ----------------------
  3. set ignorecase
  4. set smartcase
  5. set wrapscan
  6. set hlsearch

検索用。大文字小文字の無視(しかし大文字だけの文字列にはマッチ)、折り返し検索を有効にして、検索文字列をハイライトさせます。ちなみに「set incsearch」にてインクリメンタル・サーチが利用できますが、なんか好みの問題で使いません。

  1. " edit
  2. " ---------------------
  3. set autoindent
  4. set cindent
  5. set showmatch
  6. set backspace=indent,eol,start
  7. set clipboard=unnamed
  8. set pastetoggle=<F12>
  9. set guioptions+=a

文字入力まわり。インデント、対応する括弧の表示(挿入モード)、<BS>の動作を定義(挿入モード)、システムクリップボードとGUIの設定、ペーストモード切替キーの定義などです。特にペーストモードは重宝してますな。何もしないとコピペ後にインデント崩れたり、幾つかのキーバインドと干渉しちゃったりしますから。

  1. " tab
  2. " --------------------
  3. set tabstop=4
  4. set expandtab
  5. set smarttab
  6. set shiftwidth=4
  7. set shiftround
  8. set nowrap

タブ幅に関わる設定。インデントに<Tab>キーを使うことを前提に、いろいろ設定してます。1レベルが半角スペース4つ分で、<Tab>キー押したときにスペース4つ出力、とかですね。

  1. " keymap
  2. " --------------------
  3. set bioskey
  4. set timeout
  5. set timeoutlen=500
  6.  
  7. " move
  8. nnoremap <Space>h <Home>
  9. nnoremap <Space>l <End>
  10. inoremap <Space>h <Home>
  11. inoremap <Space>l <End>
  12. inoremap <C-h> <Left>
  13. inoremap <C-j> <Down>
  14. inoremap <C-k> <Up>
  15. inoremap <C-l> <Right>
  16.  
  17. " date/time
  18. inoremap <Leader>date <C-R>=strftime('%Y/%m/%d (%a)')<CR>
  19. inoremap <Leader>time <C-R>=strftime('%H:%M')<CR>
  20. inoremap <Leader>w3cd <C-R>=strftime('%Y-%m-%dT%H:%M:%S+09:00')<CR>
  21.  
  22. " text-edit
  23. inoremap <C-d> <Del>
  24. noremap <CR> i<CR><ESC>
  25.  
  26. " brackets"
  27. inoremap {} {}<LEFT>
  28. inoremap [] []<LEFT>
  29. inoremap () ()<LEFT>
  30. inoremap "" ""<LEFT>
  31. inoremap '' ''<LEFT>
  32. inoremap <> <><LEFT>
  33. inoremap []5 [% %]<LEFT><LEFT><LEFT>
  34.  
  35. " search
  36. nnoremap n nzz
  37. nnoremap N Nzz
  38. nnoremap * *zz
  39. nnoremap # #zz
  40. nnoremap g* g*zz
  41. nnoremap g# g#zz
  42.  
  43. " window
  44. nnoremap <silent> <C-x>1 :only<CR>
  45. nnoremap <silent> <C-x>2 :sp<CR>
  46. nnoremap <silent> <C-x>3 :vsp<CR>
  47.  
  48. " buffer
  49. nnoremap <silent> bb :b#<CR>
  50. nnoremap <silent> bp :bp<CR>
  51. nnoremap <silent> bn :bn<CR>
  52. nnoremap <silent> bd :bd<CR>
  53. nnoremap ls :ls<CR>:b
  54.  
  55. " omni
  56. "function InsertTabWrapper()
  57. " if pumvisible()
  58. " return "\<c-n>"
  59. " endif
  60. " let col = col('.') - 1
  61. " if !col || getline('.')[col - 1] !~ '\k\|<\|/'
  62. " return "\<tab>"
  63. " elseif exists('&omnifunc') && &omnifunc == ''
  64. " return "\<c-n>"
  65. " else
  66. " return "\<c-x>\<c-o>"
  67. " endif
  68. "endfunction
  69. "inoremap <tab> <c-r>=InsertTabWrapper()<cr>

キーバインドいろいろ設定。ある意味いちばん弄り甲斐のある部分ですね。バッファの切替と、ブラケット記述時の左シフトなんか重宝してるかな。あとノーマルモードからも改行できるようにしてます。最後の部分はオムニ補完。最初こそ物珍しくて使ってたけど、なんだか邪魔に感じて消してます。

  1. " backup
  2. " --------------------
  3. set backup
  4. set backupdir=~/vim_backup
  5. set swapfile
  6. set directory=~/vim_swap

バックアップやスワップファイルの保存先を指定してます。ここで明示的に指定しとくと色々やりやすくなりますね。主に某エラー画面対策でスワップの削除とか。

  1. " ------------------------------------------------
  2. " encoding
  3. " > http://www.kawaz.jp/pukiwiki/?vim#cb691f26
  4. " ------------------------------------------------
  5. "
  6. if &encoding !=# 'utf-8'
  7. set encoding=japan
  8. set fileencoding=japan
  9. endif
  10.  
  11. if has('iconv')
  12. let s:enc_euc = 'euc-jp'
  13. let s:enc_jis = 'iso-2022-jp'
  14. " iconvがeucJP-msに対応しているかをチェック
  15. if iconv("\x87\x64\x87\x6a", 'cp932', 'eucjp-ms') ==# "\xad\xc5\xad\xcb"
  16. let s:enc_euc = 'eucjp-ms'
  17. let s:enc_jis = 'iso-2022-jp-3'
  18. " iconvがJISX0213に対応しているかをチェック
  19. elseif iconv("\x87\x64\x87\x6a", 'cp932', 'euc-jisx0213') ==#
  20. "\xad\xc5\xad\xcb"
  21. let s:enc_euc = 'euc-jisx0213'
  22. let s:enc_jis = 'iso-2022-jp-3'
  23. endif
  24. " fileencodingsを構築
  25. if &encoding ==# 'utf-8'
  26. let s:fileencodings_default = &fileencodings
  27. let &fileencodings = s:enc_jis .','. s:enc_euc .',cp932'
  28. let &fileencodings = &fileencodings .','. s:fileencodings_default
  29. unlet s:fileencodings_default
  30. else
  31. let &fileencodings = &fileencodings .','. s:enc_jis
  32. set fileencodings+=utf-8,ucs-2le,ucs-2
  33. if &encoding =~# '^\(euc-jp\|euc-jisx0213\|eucjp-ms\)$'
  34. set fileencodings+=cp932
  35. set fileencodings-=euc-jp
  36. set fileencodings-=euc-jisx0213
  37. set fileencodings-=eucjp-ms
  38. let &encoding = s:enc_euc
  39. let &fileencoding = s:enc_euc
  40. else
  41. let &fileencodings = &fileencodings .','. s:enc_euc
  42. endif
  43. endif
  44. " 定数を処分
  45. unlet s:enc_euc
  46. unlet s:enc_jis
  47. endif
  48.  
  49. " 日本語を含まない場合は fileencoding に encoding を使うようにする
  50. if has('autocmd')
  51. function! AU_ReCheck_FENC()
  52. if &fileencoding =~# 'iso-2022-jp' && search("[^\x01-\x7e]", 'n') == 0
  53. let &fileencoding=&encoding
  54. endif
  55. endfunction
  56. autocmd BufReadPost * call AU_ReCheck_FENC()
  57. endif
  58.  
  59. " 改行コードの自動認識
  60. set fileformats=unix,dos,mac
  61. " □とか○の文字があってもカーソル位置がずれないようにする
  62. if exists('&ambiwidth')
  63. set ambiwidth=double
  64. endif

ファイル開くときの文字コード判定部分。ある意味Vimで一番めんどくさい。ここまでやってもたまに間違えるんですよね~。まあ携帯サイトとか、半角カナとか普通なんで半ば諦めてますが。

残り

あとは幾つかプラグイン用の指定があるくらいなので、.vimrcとしてはこんなもんですな。

.vimrcは公開するのが文化的なものがあるのか、ちょちょいとググれば山のように見つかりますね。この記事もいっぱいある中の一例くらいに捉えていただければ貴方のVimライフが広がるかと!

» Sig.の.vimrc

ちなみなプラグイン

これくらいかな。入れてるのって。しょーじきたまにNERD_treeが凄い便利! ...て以外はあんま使うこと無い。surround.vimとか、評判良いのは耳にしますけどねー。なんか探し始めたら一日余裕で潰しそうで自重してますw

参考

memo: Vimpiという便利サービスもあるみたい。e-luckさん多謝(´≧ω≦)b

試してみたいもの(2009.04.15 追記)

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。