Vimで全角記号が変になる

本稿は、Ubuntu9.04上のVimについての言及です。

文中でもDebian GNU/Linuxの場合として触れられている通り、他のディストリ、あるいは、端末エミュレータの仕様により、解決しないこともあります、と言うよりも、解決しないケースのほうが多いと思われます。

逆に、端末本体を修正するという手もあるにはあるようですが? これもこれでリスクは高そうです。

なので、この件の、一番正しい解決方法は、日本語テキストを端末エミュレータ上で開かない。GUIなテキストエディタやGvimなど、代替はいくらでもあるので、そちらの方が確実でしょう。

それじゃあ、本稿の目的は何なんだと、問われるのであれば、それは、ズバリ、告知でしょう。今となっては、もはや、問題の解決ではなく、こういう問題があるんだよお、という告知に過ぎませんので、そのつもりでお読みください。

あっけなく解決(……という夢を見た)

vimがおかしい。端末エミュレータでVimを立ち上げ、日本語入力をしてる時に、途中で『○』、『△』、『□』、『…』、などなど、全角の記号を書き入れると、半角分しかスペースが割り振られず、次の文字、記号と、重なって表示されてしまったり、その後の入力がおかしくなったりする。

それで、あまりにも頭に来たので、いろいろ調べた……というか、『vim 記号 重なる』で、Google検索をかけたら、一発で出てきました。

Budenzauber > ただのメモというページによると、つまり、こういうことだそうです。

vim/gvim で全角の記号が半角幅なのはなんで?
set ambiwidth=doubleを$HOME/.vimrcにでも書いておく。もしかしたら、いわゆる『2バイト半角』でおかしくなるかも(未だに使ってる人がいるのか知らないけど)。
Budenzauber > ただのメモより引用。

ほほう、なるほど。というわけで、我が家のUbuntuでも……。

$ gedit .vimrc

上をそのまま実行すると、.vimrcが存在する場合は、それが開かれるし、存在しない場合は、新しく.vimrcが作成されます。

そして、開かれた、.vimrcに、以下。

set ambiwidth=double

これだけ書き込んで /home/username/ に保存。これで、完了です。

うちの環境では、これで、問題が解消され、新たな不具合も出てません。

思えば、ubuntu8.04辺りから、ずっと悩んでたんだけど、案外、あっさりと解消されてしまいましたな。というわけで、教訓。

調べろ!

教訓でも何でもねえwwww まあ、フォーラムなんかで聞くのも有りだとは思いますが。……何はともあれ、どうも、ありがとうございました。

おまけ〜ambiwidthって何よ〜

ちなみに、ambiwidthとは何ぞや?

冒頭の参照先にて、set ambiwidthと突然やり始められてしまっているので、すごく気になった。調べる。

Vimwiki内、‘ambiwidth’のページをぼんやりと、可能な限りで訳してみると、vimに於いて、UTF-8や、その他のUnicodeエンコードにて有効なオプションで、東アジア圏の文字キャラクターに使いますと。オプションの値は、‘single’ もしくは、‘double’ のいずれか。初期値は、‘single’。ambiguousって単語が、やたらと出てきて気になる。gooの英和辞書によると、曖昧な、広義な、多義なという意味合いだと言っている。発音は『あんびぎゅす』に近く聞こえる。

ともかく、何のこっちゃさっぱり分からんので、再び調べる。

東アジアの文字幅 : Wikipediaによれば、以下。

East_Asian_Width 特性の値は、次の 6 種類からなる。

  • F (Fullwidth; 全角) - 互換分解特性 <wide> を持つ互換文字。文字の名前に "FULLWIDTH" を含む。いわゆる全角英数など。
  • H (Halfwidth; 半角) - 互換分解特性 <narrow> を持つ互換文字。文字の名前に "HALFWIDTH" を含む。いわゆる半角カナなど。
  • W (Wide; 広) - 上記以外の文字で、従来文字コードではいわゆる全角であったもの。漢字や仮名文字、東アジアの組版にしか使われない記述記号 (たとえば句読点) など。
  • Na (Narrow; 狭) - 上記以外の文字で、従来文字コードでは対応するいわゆる全角の文字が存在したもの。いわゆる半角英数など。
  • A (Ambiguous; 曖昧) - 文脈によって文字幅が異なる文字。東アジアの組版とそれ以外の組版の両方に出現し、東アジアの従来文字コードではいわゆる全角として扱われることがある。ギリシア文字やキリル文字など。
  • N (Neutral; 中立) - 上記のいずれにも属さない文字。東アジアの組版には通常出現せず、全角でも半角でもない。アラビア文字など。
東アジアの文字幅 : Wikipediaより引用。

つまり、そうか、東アジアの文字のうち、A特性(ambiguous)な物についての文字幅を指定する……というのが、vimで言う、ambiwidthというオプションだと、そういうことか。

……だそうですよ、皆さん。

Debian GNU/Linuxの場合

Debianでも、同じ症状が出ますが、vimを端末上で動かす場合においては、上のやり方では改善しません。これは、gnome-tarminalの仕様によるものらしいです。

別のやり方で直せるそうですが、例えば、端末上で動かす他のアプリ(w3mとかいろいろ)の文字表示が乱れる可能性があるということで、僕は試さないし、やり方もしりません。おとなしくgvim(vim-gnome vim-gtk辺りのパッケージ?)を使った方がいい気がします。

そんなこんなで、同じ問題に悩む君に幸あれ。てか、もう、Gedit使おう!