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