不甚完美的Windows中文解决方案

210 views
Skip to first unread message

suxpert

unread,
Nov 22, 2009, 1:35:13 AM11/22/09
to vimim
前面我已经发过相关的信息,然而或许是因为Google Group
本人还不熟练或是其他,貌似信息只是发给了VimIM兄。

VimIM兄给我回信说有一个好点儿的文档性质的东西最好,
我也这么觉得,但是本人写文档的水平可能有限,
经常会写成日记体,^_^不过个人风格也使得我写出来的基本上
都是科普性质的东西,尤其对新手而言应该能更容易接受。:D

好的结束自吹自擂,继续这个让我依然很是崩溃的话题:
Windows下Vim的中文支持问题。

这不应该是VimIM需要严格关注的问题,但是确是VimIM的基础
问题:显然,如果连中文支持都没有解决,何谈中文输入法?

在VimIM主页的【科普】章节已经介绍了许多:
http://vimim.googlecode.com/svn/vimim/vimim.html#vim
我现在要说的这些是基于本人的切身体会和摸索得到的。
由于本人目前仍然只能算是拼音用户,所以其他Feature
对我而言并没有太大的实用性,本人也没有进行相关测试。

Vim想要使用中文拼音输入法,需要设定encoding为UTF-8:
:set encoding=utf-8

但是我们知道,Windows下的默认编码是GBK,
通过自解压安装方式得到的GVim和Vim中,由于很多属性通过
系统获得,因而在简体中文系统下默认直接支持GBK简体
中文,所以encoding, fencoding, fencodings, tenc等等默认值
都是GBK,——这时候是没有问题的;同时也因为这个原因,
当我们把encoding改成UTF-8时才会出现这么多问题。
因此下面的问题就是解决因为上面这句引起的乱码问题。

1. 中文信息提示乱码。
信息提示的设定是通过language命令更改的:
:lan message zh_CN.UTF-8
这样会使得message为UTF-8编码,与encoding一致,从而
解决中文乱码问题。当然,您也可以通过设定成英文来回避
中文乱码:
:lan message en

2. GVim显示菜单乱码。
菜单的设定是通过lanmenu变量决定的:
:set lanmenu=zh_CN.UTF-8
但是,我们发现不论进不进行这项设定,菜单的乱码问题都在。
事实上GVim的菜单早在设定这个开关之前已经加载完成,所以
解决的方法是设定后重新加载菜单。(经测试即使不设定这个
变量,重新加载菜单总是能使菜单乱码消失。)
:source $VIMRUNTIME/delmenu.vim
:source $VIMRUNTIME/menu.vim
不过需要注意这会使得自定义菜单项被删除。
另外很多高手说GVim的菜单实际上没有什么帮助,所以或者
直接删掉不要也可以,或者改成英文来回避中文乱码。

3. Vim与Cmd
a. termencoding变量:

这个开关仅影响Vim而不影响图形界面的GVim。所以不使用
Windows 32 Console版本Vim的用户可以跳过。

由于Vim没有自己的显示机制,它是通过将字符传递给term
而通过term将文字显示出来,所以双方对传递的字符编码
要有一致的理解才能正常。对于Windows,这个Term一般就是
模仿DOS的那个命令提示符,Cmd.exe

Cmd的默认编码格式是GBK(而且貌似只能是GBK),因而
我们需要Vim用GBK编码向Cmd传送自己的数据,Cmd才能
把Vim想要显示的东西正常显示。这就要告诉Vim,term的
encoding是什么什么:
:set termencoding=GBK
从而能从Console版本的Vim中将UTF-8编码的各种信息转换成
GBK传递给Cmd从而显示出来。

b. Vim执行外部命令

通过上面的设置,我们的Windows版本GVim和Vim都可以
正常使用VimIM插件了,然而Vim最主要的功能并不是作为
汉字输入法。我们要通过它写程序等等,便不免要执行外部
命令,比如最常见的:make(严格说这不算”外部“,外部命令
以!开始,例如:!dir)

然而,我们原以为现在已经正常的Vim却在这儿再次出现问题。
——因为我们把encoding改掉了。

测试:开始运行cmd,输入vim回车(我们假设您安装GVim
时创建了相关的批处理文件,可以从cmd中直接执行它们)
打开Vim,然后输入:
:make
回车,你会发现很多乱码:Cmd的输出是乱码,Vim的提示
信息是乱码,——甚至连程序员赖以生存的QuickFix窗口,
也都是乱码。Oh这怎么得了?!

但问题远不止这些,即使是GVim执行外部命令,我们依然
看到到处都是乱码。

因为这个问题的原因,我几天来一直在试图解决它却没有任何
进展,所以没有将中文支持的这个Post出来。不过现在决定
把这个贴出来了,一来我发现自己应该是很难解决掉了,
需要高手支援,二来毕竟VimIM兄需要一个详细点儿的说明,
所以就先把我现在知道的这些稍加整理发过来。

向VimIM兄致歉,我远没有达到您的要求。8-P
另征求高手的解决方案,最好简单易行。:)

vimim

unread,
Nov 22, 2009, 3:01:02 AM11/22/09
to vimim
又是一篇难得多见的好文章。

首先,让我们试一试最简单的解决方案————直接用GBK.

>> Vim想要使用中文拼音输入法,需要设定encoding为UTF-8:
>> :set encoding=utf-8

国家教委是不是又有新规定啦?
VimIM 没有也不应该有这样的限制。

想一想,没有GBK encoding, VimIM 如何制造那几个屏幕截图?
GBK 内码输入 ==>
http://vimim.googlecode.com/svn/vimim/vimim.html#gbk

我特地做了个快速测试,用 Gvim.exe on 微软 Windows XP
不过,我的操作系统是纯英文的,连IME 都没有。
I don't need other fat IME because I have our sweetest VimIM. :))

我的测试全部通过。看你那里行不行?

VimIM 【最新试用版本】
http://vimim.googlecode.com/svn/vim/vimfiles/plugin/vimim.vim
VimIM 【最新主页】
http://vimim.googlecode.com/svn/vimim/vimim.html


$ cd ~/svn/vim/vimfiles/plugin
$ ls
140 vimim.vim
44 vimim.4corner.txt
1408 vimim.pinyin.txt
$ ~/svn/vim/gvim.exe vimrc
set enc=chinese
set gfn=NSimSun:h14:w7
set fencs=ucs-bom,chinese
$ ~/svn/vim/gvim.exe test_gbk.txt

vim<C-\> ==> 文本編輯器
id3<C-\> ==> 第三
id3c<C-\> ==> 第三次
m49lin2 ==> 妙龄
sh90n40 ==> 少女

Also, all these worked for me.

GBK标准内码输入器

【演示】GBK 标准内码一键输入:
   【例】 十进制:敲  49901  → 马 (GB)
   【例】十六进制:敲  uc2ed  → 马 (GB)

【示意图】GBK 标准内码动态列表:
   【例】 十进制:敲  4990u  → 马 in 菜单
   【例】十六进制:敲  c2eu  → 马 in 菜单


I also tested CLOUD, and it worked 没有乱码。

Reply all
Reply to author
Forward
0 new messages