您的位置:首页 > 其它

vim-在windows下安装gvim乱码问题

2018-01-15 00:00 316 查看
貌似之前就有遇到过在windows系统下vim出现中文乱码的情况,只是用得较少而且也懒得去捣鼓它/// 这问题直到昨晚因为试用了个Caspatant同学介绍的一款用于实现twitter客户端功能Vim插件---TwitVim的时候查看消息的时候出现的根本都是乱码。。。所以决定搞定关于Vim编辑器编码方式导致中文乱码的问题///

上网了解了下才知道原来Vim有四个跟字符编码方式有关的选项,分别是:encoding、fileencoding、fileencodings、 termencoding (这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names),它们各自的意义:
* encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在 .vimrc 中改变它的值才有意义。
* fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
* fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式,并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面,将拉丁语系编码方式 latin1 放到最后面。
* termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效,而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页,并且通常我们不需要改变它。
由于 Unicode 能够包含几乎所有的语言的字符,Unicode的 UTF-8 编码方式又是非常具有性价比的编码方式,因此encoding 的值设置为utf-8。同时将encoding设置为utf-8时,Vim自动探测文件的编码方式会更准确。在中文 Windows里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为GB2312/GBK比较合适,因此fileencoding建议设置为 chinese (chinese 是个别名,在Unix里表示gb2312,在Windows里表示cp936,也就是GBK的代码页)。
最终对于文件中显示乱码、菜单乱码、右键菜单乱码以及Conlse输出乱码问题的解决方案,修改Vim编辑器所对应的配置文件_vimrc,添加如下配置:

"处理文本中显示乱码
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif

"处理菜单及右键菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

"处理consle输出乱码
language messages zh_CN.utf-8

关于Vim的支持多字符编码方式工作的运作原理是:
首先、Vim 启动,根据_vimrc配置文件中设置的encoding的值来设置buffer、菜单文本、消息文的字符编码方式。
紧接、读取要编辑的文件,根据fileencodings中列出的字符编码方式逐一探测该文件编码方式。并设置fileencoding 为探测到的字符编码方式。
然后、对比fileencoding和encoding的值,若不同则调用iconv将文件内容转换为encoding所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的buffer里,完成后就可以开始编辑这个文件。
最后、编辑完成后保存文件时,再次对比fileencoding和encoding的值。若不同再次调用iconv将即将保存的buffer中的文本转换为fileencoding所描述的字符编码方式,并保存到指定的文件中。
注:需要调用外部的iconv.dll,需要保证这个文件存在于$VIMRUNTIME或者其他列在PATH环境变量中的目录里。

最后贴一下我自己的文件:

source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction

set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_CN.utf-8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GVim