Prefix Abbreviation

せっかく教えてもらったので、なんというかマダマダvim内部はサッパリなんだけどとりあえず書いてみた。

command! -nargs=+ PrefixAbbrev call PrefixAbbrev(<f-args>)

function! PrefixAbbrev(pfx,word,to)
    exe 'iabbrev <expr> '.a:word.' <SID>PrefixAbbrev("'.a:pfx.'","'.a:word.'","'.a:to.'")'
endfunction

function! s:PrefixAbbrev(pfx,word,to)
    let word = a:word
    " let pos = getpos('.') not needed?
    " let word_exists = search('\S\s\+'.a:word, 'bW') -- wrong
      let word_exists = search('\S\_s\+'.a:word.'\%'.col('.').'c', 'bW')
      let word_at_cur = expand('<cWORD>')
      if word_exists && word_at_cur == a:pfx
	      let word  = a:to
      endif 
    " call setpos('.',pos) not needed?
    return word
endfunction

よくわかんねぇ、、、。最初 normal "2B"とかしてたら怒られた。副作用系つかうな、とhelpにモロニ書いてあった。posはiabが良きに計らってくれてるのかな?
PrefixAbbrev()のwordは本当は引数で貰わなくてもいいんだけど、なんとなくこうした。

:PrefixAbbrev kana1 is is<space>god<space>of<space>vim.

とかして kana1 istkuro is baka. とすると

kana1 is god of vim.
tkuro is baka.

おお,,,
目的の using namespace もおkだ。最初 同時に

:PrefixAbbrev kuro is is<space>a<space>fool<space>of<space>everything.

を定義しようとしてハマッタ。 iab的には どちらも "is" のabbrevになってしまうのでダメ。なんかここまでやるなら abにこだわる必要も無いような気もしてきた。

追記:
うっかりsearchに限定line('.')を付け忘れた奴を貼付けてた。ボケまくり。修正。
しかしyen と\が入れ替わってしまうの何とかならないかな。貼付けるとき面倒。
更に追記:
なんか更にボケてた。line('.')つけるとダメ。\_sで行末も含めたら意図通りになった。難しい。
更に更に追記:
やっとなんとかなった。。。かっこわるすぎ。まだ問題あり。カーソルの上の単語の一個前に行きたいだけなんだけど、ダメだなあ自分。Emacsだったらlooking-backって感じがなかなかできない。だめだ、、、僕の今の知識ではこれが限界。とりあえずは上手く動いてるように見える。