メタ構文変数とか呼ばれてるらしい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とかにマッピングさせるように書いた方が良さそう……な気もするけど、自分で使う分には良いか。