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: 421