Vim script で abbrev

Ruby の abbrev を移植してみた。


:echo util#abbrev(["perl", "python", "ruby"])
 ↓
{'pytho': 'python', 'r': 'ruby', 'ru': 'ruby', 'perl': 'perl', 'pe': 'perl', 'pyt': 'python', 'py':
'python', 'ruby': 'ruby', 'per': 'perl', 'pyth': 'python', 'python': 'python', 'rub': 'ruby'}
:echo util#abbrev(["こんにちは", "こんばんわ"])
 ↓
{'こんば': 'こんばんわ', 'こんばんわ': 'こんばんわ', 'こんにち': 'こんにちは', 'こんにちは': 'こんに
ちは', 'こんばん': 'こんばんわ', 'こんに': 'こんにちは'}

これを使ってこんなのを書くと、

function! s:change_filetype_i()
  let filetypes = [
        \ "css", "html", "javascript", "perl", "php", "python",
        \ "ruby", "text", "vim", "xhtml", "xxd",
        \ ]
  let ft_abbrevs = util#abbrev(filetypes)
  let filetype = input("Change filetype to: ")
  if has_key(ft_abbrevs, filetype)
    let filetype = ft_abbrevs[filetype]
  endif
  execute 'setfiletype' filetype
endfunction

nnoremap <silent> [Space]ft :<c-u>call <SID>change_filetype_i()<CR>

対話的な入力でちょっと楽ができる、かも。*1

*1:実はこの下に特定ファイルタイプ用の setfiletype hoge なキーマップがずらっと並んでいたりするので、これ自体は自分で書いといて使うかは微妙だったりw