vim7ユーザ定義補完関数を使ってみる

vim7の売りのシンタックスハイライティングはホーリーにいろいろ助けてもらって


autocmd FileType php  :set omnifunc=phpcomplete#CompletePHP
autocmd FileType html,javascript :set omnifunc=javascriptcomplete#CompleteJS
autocmd Filetype *
        \\   if &omnifunc == "" |
        \\       setlocal omnifunc=syntaxcomplete#Complete |
        \\   endif
endif

と書いておけばいいのがわかったので、もうひとつ?の売りであるユーザ定義の補完関数をいじってみた。
補完のルールを自分でかけるので、日頃からテスト用のコードを書くために <html といれてタブを入れると <html ….</body> まで補完してくれるとか、 <meta とタブで <meta http-equiv=”content-type” content=”text/html; charset=utf-8″ /> と入るとか、へんなスクリプトをたくさん用意していたのを全部きれいに書き直せるかと思って。(sdnとタブで style=”display: none;” に展開するのようにしているのがちょっとすき)
foo.vimを参考にベタベタに書いていたので、これをユーザ定義の補完を使ってかたづけられるとうれしい。

ドキュメントの *complete-functions* を参考にして vim script はまったく知らないけど見よう見まねで、
vimスクリプトを書くExpression evaluationを参考にいじってみた。
オプションでshowmatchを設定していると、<> の対応を表示してくれちゃってクソ遅くなるので一時的に外したの以外は vim script の文法を知っていればさくっとできるんでしょうけど知らないのでちょっと大変でした。


fun! UserdefinedCompletionFunc(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    let bk = &showmatch
    set noshowmatch

    let res = []
    let ar = [
\ "html>  \\n\\n\\n\\n",
\ "script type='text/javascript'>\\n",
\ 'meta http-equiv="content-type" content="text/html; charset=utf-8" />',
\ 'style="display: none;"'
\ ]
    for m in ar
      if m =~ '^' . a:base
    call add(res, m)
      endif
    endfor
    let showmatch = bk

    return res
  endif
endfun

これで ht とか html とか入れて C-X C-U で html….</body> が補完されるようになりました。
が、どうしても改行を入れることができません。ダブルクオートの中に \n と書けば改行が入ると書いてあるけれど、\x00が入ってしまって改行されません。\<Enter>と書いてみてもダメだしもうお手上げ。
誰か助けて!


About this entry