読者です 読者をやめる 読者になる 読者になる

Vim プラグインのヘルプを書く人がするべき設定

Vim の help は通常 modeline などによって閲覧に最適なようにオプションが設定される。しかし編集したい時には困ることがある。というわけで全ての Vim プラグイン作者*1は以下のような設定を入れるといいと思うよ!

" after/ftplugin/help.vim
if &l:buftype !=# 'help'
  setlocal list tabstop=8 shiftwidth=8 softtabstop=8 noexpandtab textwidth=78
  if exists('+colorcolumn')
    setlocal colorcolumn=+1
  endif
  if has('conceal')
    setlocal conceallevel=0
  endif
endif

以前もちらっと書いたのだけど、'buftype' の値を見て編集中なのか :help で閲覧中なのか判断する。
普段 :help で見るヘルプファイルを直接編集する場合、一度でも :help で開いていたら 'buftype' が設定されてしまう点に注意。私の場合はそもそも普段使う用と開発用で別の場所にプラグインを置いているので問題にならない。
ちなみに 'colorcolumn' 重要。個人的にはこれは確実に設定して欲しい。設定したら今まで書いた help 見直してみるべし。


ついでに、これまた以前名前だけちらっと出した私が使ってる目次生成コマンドも晒しておく。これも 'buftype' が 'help' のときだけ定義してます。:GenerateContents で目次を生成/更新。

command! -buffer -bar GenerateContents call s:generate_contents()
function! s:generate_contents()
  let cursor = getpos('.')

  let plug_name = expand('%:t:r')
  let ja = expand('%:e') ==? 'jax'
  1

  if search(plug_name . '-contents\*$', 'W')
    silent .+1;/^=\{78}$/-1 delete _
    .-1
    put =''
  else
    /^License:/+1
    let header = printf('%s%s*%s-contents*', (ja ? "目次\t" : 'CONTENTS'),
    \            repeat("\t", 5), plug_name)
    silent put =['', repeat('=', 78), header]
    .+1
  endif

  let contents_pos = getpos('.')

  let lines = []
  while search('^\([=-]\)\1\{77}$', 'W')
    let head = getline('.') =~ '=' ? '' : '  '
    .+1
    let caption = matchlist(getline('.'), '^\([^\t]*\)\t\+\*\(\S*\)\*$')
    if !empty(caption)
      let [title, tag] = caption[1 : 2]
      call add(lines, printf("%s%s\t%s|%s|", head, title, head, tag))
    endif
  endwhile

  call setpos('.', contents_pos)

  silent put =lines + ['', '']
  call setpos('.', contents_pos)
  let len = len(lines)
  setlocal expandtab tabstop=32
  execute '.,.+' . len . 'retab'
  setlocal noexpandtab tabstop=8
  execute '.,.+' . len . 'retab!'

  call setpos('.', cursor)
endfunction

完全に個人向けなのでプラグインとかにする予定はないよ。

*1:全ての Vim プラグイン作者は help を書くという前提に基いています