属性にスペースと全角丸カッコを入れると ii や jj に変換される
June 22, 2009category: Vim
Vim で HTML を編集していて、タグの属性に「半角スペース + 全角丸カッコ」を入れたら ii や jj に変換されてしまう。
<img alt=" (" />
と入力したのに
<img alt=" ii" />
となる…。どのプラグインが原因なのだろう。
追記
半角スペースではなくとも、「全角開き丸カッコ + 半角英数字二文字」でもアウト。謎。
追記
詳しくはコメント欄。
原因
$VIMRUNTIME\autoload\htmlcomplete.vim が、マルチバイト対応していないため。
解決策
htmlcomplete.vim をマルチバイト対応されたものに差し替える。

comments
私の環境でも試してみたら、やはり同様の現象が起こったので
調べて(:verbose imap)みたところ、私のところではautoclose.vimが原因でした。
もしautoclose.vimをお使いでしたら、犯人は奴です。
Posted by: ampmmn : June 22, 2009 01:59 PM
と思ったら、早とちりでした!これは恥ずかしい。
どうもすいません。
Posted by: ampmmn : June 22, 2009 02:07 PM
たびたびすいません。
消去法で消していったところ、autocomplpop.vimでした(自分の環境では)
:AutoComplPopDisableでautocomplpopを無効にすると発生しなくなります。
Posted by: ampmmn : June 22, 2009 02:20 PM
こんにちは。コメント有り難うございます。
:AutoComplPopDisable してみたら発生しなくなりました。
ctrl-x ctrl-o の普通のオムニ補完では発生しないところを見ると、
原因は autocomplpop.vim なんですかねぇ…。
今ソースを読んでいますが、すぐにわかりそうなものでも無さそうです…。
ちなみに半角スペース + 任意の全角文字で、高確率で文字が入れ替わりました("あ"でも発生)。
Posted by: tanabe : June 22, 2009 04:13 PM
autocomplpop.vim の 365 行目の
repeat という値を 0 にしたら直りました。
['repeat']:
It automatically repeats a completion if non-zero is set.
とのことなので、何かしら便利な機能のことだと思いますが、
オフにしても問題無さそうです。
Posted by: tanabe : June 22, 2009 04:21 PM
こちらでもいろいろ追ってみたのですが、どうもHTMLの標準のオムニ補完関数
($VIMRUNTIME\autoload\htmlcomplete.vim内のhtmlcomplete#CompleteTags関数)
が原因みたいです。
HTMLのオムニ補完関数がおかしいせいで、
それを呼び出しているautocomplpopの結果もおかしくなっている、と。
どうも補完関数が呼ばれる時に、関数の戻り値で
補完開始位置や補完候補などを返しているようなのですが、
補完開始位置を返す際に、マルチバイトのことを考慮した処理になっていなくて、
その結果、全角文字が含まれている時に正しい位置を返せていないようです。
(そのため内部エンコーディングがUTF-8の環境ではこの問題は起こらないはず..)
ただ、この補完関数の中で何をやっているのか、完全に把握できていないので
どこを修正すればいいのか、特定できていません..
Posted by: ampmmn : June 22, 2009 04:58 PM
htmlcomplete.vimを修正してみました。もしよかったらお試しください。
(動かなかったらすいません)
http://atlantisno.nazo.cc/htmlcomplete.zip
ところで、このhtmlの補完関数の作者は
他にも、JavaScript,CSS,XML,PHPあたりの補完関数も作られているようですが、
このあたりも軒並み、全角の扱いに問題があるようです..
Posted by: ampmmn : June 22, 2009 08:57 PM
なるほど、内部エンコーディングの問題なんですね…。
htmlcomplete.vim を差し替えてみたところ、上手く動きました。
有り難うございました!
diff を取ってみましたが、
search_pos 関数が上手いこと動いているくらいしかわかりません…。
ampmmn さんは VimScript をバリバリ書けるんですね。恐れ入ります。
これを機に vim.org にコミット(?) してみるとか…。
Posted by: tanabe : June 22, 2009 09:48 PM
後から見直したところ、どうも場当たり的な修正で
今回の問題はこれで回避できるけど、これをもってマルチバイト対応というにはちょっと微妙かも・・という感じです。
わかりにくいのは、どう見ても(私の)コードが下手だからです。本当にありがとうございました。
Posted by: ampmmn : June 23, 2009 08:17 PM