Vimでメタ構文変数を簡単入力

メタ構文変数とか呼ばれてるらしいfooとかbarとかのアレがまったく覚えられない。のでVimに一般的なメタ構文変数のリストを覚えさせておいて、fooの上で<C-a>するとbarに、barの上で<C-a>するとbuzに、と順に次の(<C-x>だと前の)を選択してくれるように関数とマッピングを書いて使うことにした。

" Cycle metasyntactic variables
function! s:CycleMetasyntacticVariables(num)
  if type(a:num) != type(0)
    return
  endif

  let vars = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge', 'grault', 'garply', 'waldo', 'fred', 'plugh', 'xyzzy', 'thud']
  let i = index(vars, expand('<cword>'))

  if (i == -1)
    if (a:num > 0)
      execute "normal! \<C-a>"
    else
      execute "normal! \<C-x>"
    endif

    return
  endif

  let i += a:num

  if (i == -1)
    let i = len(vars) - 1
  elseif (i == len(vars))
    let i = 0
  endif

  let @w = vars[i]
  execute "normal! viw\"wp"
endfunction

nnoremap <C-a> :call <SID>CycleMetasyntacticVariables(1)<Enter>
nnoremap <C-x> :call <SID>CycleMetasyntacticVariables(-1)<Enter>

レジスターを使ってることに注意。<C-a><C-x>にマッピングする前提で書いたので、数字の上とかだとデフォルトと同じようにインクリメント・デクリメントする。あんまり行儀よくない気もするのでフォールバックさせるのやめて、<Leader>aとかにマッピングさせるように書いた方が良さそう……な気もするけど、自分で使う分には良いか。