属性にスペースと全角丸カッコを入れると ii や jj に変換される

June 22, 2009category: Vim 

Vim で HTML を編集していて、タグの属性に「半角スペース + 全角丸カッコ」を入れたら ii や jj に変換されてしまう。

<img alt=" (" />

と入力したのに

<img alt=" ii" />

となる…。どのプラグインが原因なのだろう。

追記

半角スペースではなくとも、「全角開き丸カッコ + 半角英数字二文字」でもアウト。謎。

追記

詳しくはコメント欄。

原因

$VIMRUNTIME\autoload\htmlcomplete.vim が、マルチバイト対応していないため。

解決策

htmlcomplete.vim をマルチバイト対応されたものに差し替える。

comments (9)このエントリーを含むはてなブックマークはてなブックマーク - 属性にスペースと全角丸カッコを入れると ii や jj に変換される

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