Wednesday, May 17, 2006

はてな技術勉強会 .vimrc 説明補足 [vim]

前回に引き続き,はてなの技術勉強会は vim ネタで,今回は .vimrc の説明会だった模様.
secondlife/.vimrc

というわけで,前回に続いて,今回も少しコメントしてみようと思う.

まず勉強会ページで公開されている .vimrc に

" タブ幅の設定
set expandtab
set tabstop=2
set softtabstop=2
set shiftwidth=2
とあったけど,vim のタブ設定は複雑なので少し補足.

expandtab というのはタブをスペースに置き換える設定で,インデントに関する設定は残りの tabstop, softtabstop, shiftwidth となる.で,これらに関しては以前,2ちゃんねるの vim スレ に KoRoN さんが分かりやすい説明をしていたので,それをそのまま引用してしまいましょう.

2ch Vim6 Part3 94 より:

インデントには'tabstop'、'shiftwidth'、'softtabstop'の3つのオプションが関わっています。これらのうち'softtabstop'はvimオリジナルのオプションになります。cindentやautoindent時に挿入されるタブの幅は'shiftwidth'で決定されます。少々ややこしいですが各オプションの意味は下記のとおりなので、ちょっとがんばって理解しておけば柔軟に設定できるようになるでしょう。

'tabstop' (短縮名'ts')
ファイル中の<Tab>文字(キャラクターコード9)を、画面上の見た目で何文字分に展開するかを指定する。既にあるファイルをどのように表示するのか指定したい時に便利。

'shiftwidth' (短縮名 'sw')
vimが挿入するインデント('cindent')やシフトオペレータ(>>や<<)で挿入/削除されるインデントの幅を、画面上の見た目で何文字分であるか指定します。自動的に挿入される量、と覚えておくと良いです。

'softtabstop' (短縮名'sts')
キーボードで<Tab>キーを押した時に挿入される空白の量。'softtabstop'が0以外の時には、例え'ts'を4に設定していても、<Tab>を1度押しても'softtabstop'分だけ空白が挿入されます。逆に'softtabstop'が0の場合には挿入されるのは'ts'で指定した量になります。

vimが自動的に挿入したか<Tab>キーによって挿入された空白は、'ts'に設定された幅でTab文字へと自動的に置き換えられます(ただし'expandtab'が設定されていない場合)。これは十分に賢い機能なので特に意識しなくても良いでしょう。

で以上のことと、一般のエディタがTabを4文字か8文字で表示することを踏まえると
:set ts=4 sw=4 sts=0

:set ts=8 sw=4 sts=4
という設定が必要になります。



あとは私の vim 設定ファイルからいくつか tips 紹介.


カーソル位置の highlight グループを取得する.

command! -nargs=0 GetHighlightingGroup echo 'hi<' . synIDattr(synID(line('.'),col('.'),1),'name') . '> trans<' . synIDattr(synID(line('.'),col('.'),0),'name') . '> lo<' . synIDattr(synIDtrans(synID(line('.'),col('.'),1)),'name') . '>'
自分で colorscheme とかを構築する場合などに便利.


runtimepath/macro 以下の plugin を読み込む.
command! -nargs=0 Macros :call <sid>Macros()
function! s:Macros()
  let bakz  = @z
  let baksb = &sb
  let @z=globpath(&rtp, 'macros/*.vim')
  set   splitbelow
  new
  exec "normal! i\<c-r>=@z\<Enter>\<Esc>gg"
  let @z=bakz
  if baksb==0
    set nosb
  endif
  setlocal   buftype=nofile
  setlocal nobuflisted
  setlocal   bufhidden=delete
  setlocal nomodifiable
  nnoremap <buffer> <silent> <cr>  :let f=getline('.')<bar>close<bar>exec 'source ' . f<cr>
  nnoremap <buffer> <silent> <esc> :close<cr>
endfunction
Plugin をたくさん入れていると起動などの動作が遅くなるので,定常状態で読み込む必要のない plugin は $HOME/.vim/macros あたりに入れておいて必要な時にだけ :Macros で選択する.


カーソルがある行をハイライトする.
nnoremap <silent> ,ha :HighlightCurrentLine Search<cr>
nnoremap <silent> ,hb :HighlightCurrentLine DiffAdd<cr>
nnoremap <silent> ,hc :HighlightCurrentLine Error<cr>
command! -nargs=1 HighlightCurrentLine execute 'match <args> /<bslash>%'.line('.').'l/'

nnoremap <silent> ,H :UnHighlightCurrentLine<cr>
command! -nargs=0 UnHighlightCurrentLine match
コードレビューをしていたり,プロジェクタでテキストを表示しながらなにか話している時に「ここの部分が…」と示す時に使える.


またなにか思いついたら投稿します.


0 comments: