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


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

<img alt=" (" />

と入力したのに

<img alt=" ii" />

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

追記

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

追記

詳しくはコメント欄。

原因

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

解決策

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

カテゴリー: Vim   パーマリンク

属性にスペースと全角丸カッコを入れると ii や jj に変換される への9件のコメント

  1. ampmmn より:

    私の環境でも試してみたら、やはり同様の現象が起こったので
    調べて(:verbose imap)みたところ、私のところではautoclose.vimが原因でした。
    もしautoclose.vimをお使いでしたら、犯人は奴です。

  2. ampmmn より:

    と思ったら、早とちりでした!これは恥ずかしい。
    どうもすいません。

  3. ampmmn より:

    たびたびすいません。
    消去法で消していったところ、autocomplpop.vimでした(自分の環境では)
    :AutoComplPopDisableでautocomplpopを無効にすると発生しなくなります。

  4. tanabe より:

    こんにちは。コメント有り難うございます。
    :AutoComplPopDisable してみたら発生しなくなりました。
    ctrl-x ctrl-o の普通のオムニ補完では発生しないところを見ると、
    原因は autocomplpop.vim なんですかねぇ…。
    今ソースを読んでいますが、すぐにわかりそうなものでも無さそうです…。
    ちなみに半角スペース + 任意の全角文字で、高確率で文字が入れ替わりました(“あ”でも発生)。

  5. tanabe より:

    autocomplpop.vim の 365 行目の
    repeat という値を 0 にしたら直りました。
    ['repeat']:
    It automatically repeats a completion if non-zero is set.
    とのことなので、何かしら便利な機能のことだと思いますが、
    オフにしても問題無さそうです。

  6. ampmmn より:

    こちらでもいろいろ追ってみたのですが、どうもHTMLの標準のオムニ補完関数
    ($VIMRUNTIME\autoload\htmlcomplete.vim内のhtmlcomplete#CompleteTags関数)
    が原因みたいです。
    HTMLのオムニ補完関数がおかしいせいで、
    それを呼び出しているautocomplpopの結果もおかしくなっている、と。
    どうも補完関数が呼ばれる時に、関数の戻り値で
    補完開始位置や補完候補などを返しているようなのですが、
    補完開始位置を返す際に、マルチバイトのことを考慮した処理になっていなくて、
    その結果、全角文字が含まれている時に正しい位置を返せていないようです。
    (そのため内部エンコーディングがUTF-8の環境ではこの問題は起こらないはず..)
    ただ、この補完関数の中で何をやっているのか、完全に把握できていないので
    どこを修正すればいいのか、特定できていません..

  7. ampmmn より:

    htmlcomplete.vimを修正してみました。もしよかったらお試しください。
    (動かなかったらすいません)
    http://atlantisno.nazo.cc/htmlcomplete.zip
    ところで、このhtmlの補完関数の作者は
    他にも、JavaScript,CSS,XML,PHPあたりの補完関数も作られているようですが、
    このあたりも軒並み、全角の扱いに問題があるようです..

  8. tanabe より:

    なるほど、内部エンコーディングの問題なんですね…。
    htmlcomplete.vim を差し替えてみたところ、上手く動きました。
    有り難うございました!
    diff を取ってみましたが、
    search_pos 関数が上手いこと動いているくらいしかわかりません…。
    ampmmn さんは VimScript をバリバリ書けるんですね。恐れ入ります。
    これを機に vim.org にコミット(?) してみるとか…。

  9. ampmmn より:

    後から見直したところ、どうも場当たり的な修正で
    今回の問題はこれで回避できるけど、これをもってマルチバイト対応というにはちょっと微妙かも・・という感じです。
    わかりにくいのは、どう見ても(私の)コードが下手だからです。本当にありがとうございました。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>