VIM中文显示设置

1 问题描述及解决

系统locale是zh_CN.UTF-8,用了我以前的配置文件,终端下运行VIM却出现乱码情况。互联网搜索一番,发现解决方案其实很 简单,在vimrc里面设置好encoding、fileencoding、termencoding的值即可。
我原始配置文件关于CJK支持方面的设置如下(非原创):

" Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!
if has("multi_byte")
  " When 'fileencodings' starts with 'ucs-bom', don't do this manually
  "set bomb
  set fileencodings=ucs-bom,utf-8,cp936,taiwan,japan,korea,latin1
  " CJK environment detection and corresponding setting
  if v:lang =~ "^zh_CN"
    " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
    set encoding=cp936
    set termencoding=cp936
    if &fileencoding == ''
      set fileencoding=cp936
    endif
  elseif v:lang =~ "^zh_TW"
    " Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
    set encoding=taiwan
    set termencoding=taiwan
    if &fileencoding == ''
      set fileencoding=taiwan
    endif
  elseif v:lang =~ "^ja_JP"
    " Japanese, on Unix euc-jp, on MS-Windows cp932
    set encoding=japan
    set termencoding=japan
    if &fileencoding == ''
      set fileencoding=japan
    endif
  elseif v:lang =~ "^ko"
    " Korean on Unix euc-kr, on MS-Windows cp949
    set encoding=korea
    set termencoding=korea
    if &fileencoding == ''
      set fileencoding=korea
    endif
  endif
  " Detect UTF-8 locale, and override CJK setting if needed
  if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
    set encoding=utf-8
  endif
else
  echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
endif

问题出在“Detec UTF-8 locale...”下面那三行,改为以下形式,保存,即可解决:

  if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
    set encoding=utf-8
    set termencoding=utf-8
    if &fileencoding == ''
      set fileencoding=utf-8
    endif
  endif

2 VIM相关选项说明

encoding
设置 Vim 内部使用的字符编码。它应用于缓冲区、寄存器、表达式所用的字符串、viminfo 保存的等等各种文本。该选项设置 Vim 可以工作的字符类型。通常,'encoding' 应该等同于你现有的 locale。如果 Vim 能识别环境变量的设定,这应是该选项的缺省值。如果 'encoding' 没有设为你现有的 locale,必须设定 'termencoding' 来转换输入和显示的文本。
fileencoding
设置此缓冲区所在文件的字符编码。如果 'fileencoding' 不同于 'encoding',写文件时需要进行转换。读入文件时,'fileencoding' 会根据 'fileencodings' 进行设置。
fileencodings
这是一个字符编码的列表,开始编辑已存在的文件时,参考此选项。如果文件被读入,Vim 尝试使用本列表第一个字符编码。如果检测到错误,使用列表的下一个。如果找到一个能用的编码,设置 'fileencoding' 为该值。如果全都失败,'fileencoding' 设为空字符串,这意味着使用 'encoding' 的值。
termencoding
终端使用的编码。它指定键盘产生的和显示能识别的字符编码。对 GUI 而言,这只适用于键盘 ('encoding' 用于显示)。

一般情况下,'encoding' 和当前的 locale 相同,'termencoding' 为空,这意味着键盘和显示方式以当前 locale 编码字符,Vim 内部也使用相同的字符。
你可以通过设置 'encodng' 为不同的值来使 Vim 使用另一种编码方式。但是由於键盘和显示仍用当前的 locale,这就需要编码之间的转换。这时 'termencoding' 替代了当前locale 值,而 Vim 负责在 'encoding' 和 'termencoding' 之间转换。例如:

:let &termencoding = &encoding
:set encoding=utf-8

3 参考文档

3.1 解决vim中文乱码问题(转载)

3.2 VIM帮助文档(在vim中运行:help:help 主题名

Visits: 419

此条目发表在编辑器分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

18 − 4 =