gvim中文字符显示不全问题(显示为一个字母宽度)

作者:半瓶墨水   链接:http://www.2maomao.com/blog/gvim-chinese-symbol-issue/

GVIM是我最喜欢的编辑软件,我写过许多与vim相关的文章

有一个问题困扰我很久,一直都没有解决:vim在线式中文字符的时候是按照半角显示的,所以看起来和汉字会有重叠
我试过设置fileencoding、language等等,都没用,搜索了几次都没有找到结果
由于这个问题也不是很重要,我后来就没有找了

今天不知道搜啥的时候,居然让我瞥到了解决方案,很简单:

set ambiwidth=double

其中注册会员800指出了为什么会这样:

这个问题似乎跟字体有关,set ambiwidth=double解决。
有点奇怪,网上几乎没有该问题的描述,即使用ambiwidth作keyword搜索,也只有两三篇中文文档提到了这个问题。

有兴趣知道为什么的请看源码,mbyte.c中的utf_char2cells函数。
p_ambw在option.h中定义,即ambiwidth。

网络真好,如果没有网络,这个问题估计也就一直带到老了

7 条评论 发表在“gvim中文字符显示不全问题(显示为一个字母宽度)”上

  1. RedNax说道:

    原来如此,我以前也遇到过不过没有关注(也是觉得只是小问题,说实话gvim这里那里的小问题还是不少的,我也找过两个给Bram :))。原来只要设置这个就可以解决了。中文文档中有关ambiwidth的内容:

    ‘ambiwidth’ ‘ambw’ 字符串 (缺省: “single”)
    全局
    {Vi 无此功能}
    {仅当编译时加入 |+multi_byte| 特性才有效}
    只有在 ‘encoding’ 为 “utf-8” 或别的 Unicode 编码时才有效。告诉 Vim 怎
    么处理东亚二义性宽度字符类 (East Asian Width Class Ambiguous) (例如
    欧元符号、注册记号、版权记号、希腊字母、西里尔字母等等)。

    目前有两个可能的选择:
    “single”: 使用和 US-ASCII 字符相同的宽度。多数用户希望如此。
    “double”: 使用 US-ASCII 字符两倍的宽度。

    在一些 CJK 字体里,这些字符的字形宽度完全由它们在传统的 CJK 编码里占据
    字节的数目决定。那些编码中,欧元、注册记号、希腊/西里尔字母等占据两个
    字节,因而它们在这些字体里用 “宽” 字形显示。这也包括文本文件里制表用的
    一些画线字符。因此如果 GUI Vim 使用 CJK 字体、或者在使用 CJK 字体的终
    端 (模拟器) (包括带有 “-cjkwidth” 选项的 xterm) 里运行 Vim,应把该选项
    设为 “double”,这样可以匹配这些字体里 Vim 实际看到相关字形的宽度。 CJK
    Windows 9x/ME 或 Windows 2k/XP 上,如果系统 locale 为 CJK locale,也应
    把本选项设为 “double”。见 Unicode Standard Annex #11
    (http://www.unicode.org/reports/tr11)。

  2. 晓月说道:

    嗯,非常感谢~

  3. 歪脖说道:

    偶也一直在windows用gvim,好像没觉得汉字显示有什么问题。还因为偶的ambiwidth选项设对double,结果一看也是single。
    不知道,楼主说的“汉字重叠”是什么样的问题,能不能贴个图什么的

  4. 半瓶墨水说道:

    @歪脖
    你把下面这句话复制到你的vim里面,包含符号:
    输几个☆★♢□■试试看

  5. 歪脖说道:

    啊,原来如此。偶的缺省encoding是cp936,所以ambiwidth选项不起作用。输入你给出的符号也没有啥大问题,就是那个菱形显示成问号。如果encoding改成utf8果然就看到重叠了,难为楼主一直在这样的显示效果下坚持使用gvim了。

    anyway,长了见识,谢谢了。

  6. 半瓶墨水说道:

    @歪脖 很好如果你做网页服务端开发的话,utf8选项几乎是必须的

  7. 毛毛说道:

    非常感谢你的方法,我是个新手,刚刚发现的这个问题

留下回复