vim在Locale为非UTF-8环境下的字符编码解决方案
非UTF-8环境,最常见的还是Windows了。
?
首先我们遇到的问题在这儿:
Vim探测汉字编码时使用fencs变量,这个变量推荐把utf-8编码放在前面,因为这样探测成功的概率较高。
非UTF-8环境(以gbk为例)下,我们新建一个文件通常希望以gbk作为fenc变量(文件编码)来保存。
但是默认会以fencs的第一个编码值来作为fenc(当然就是前面设置的utf-8),然后保存文件。
?
要说明一点的是,所谓新建一个文件,常见的有两种做法,一是用资源管理器的新建功能(或其他方式)建立一个空文件,然后用vim打开它编辑,我称之为方式甲;一种是直接在vim里用new foo.txt之类的命令创建新文件,我称之为方式乙。
两种方式的区别:
方式甲:打开的过程会执行编码探测,空文档嘛,所以打开完成后fenc变量自然就是utf-8了。
方式乙:在vim内部新建一个空文档,建立之后fenc变量为空,保存后,据我测试,用了windows的默认编码gbk,并将其设为fenc。
看来上面的困境主要发生在方式甲。
?
当然你可以在打开一个建立好了的空文档后自己去改fenc,为set fenc=gbk。
但是我受不鸟这种容易忘掉的机械劳动。
?
于是我的vimrc里关于文件编码的部分多了这么一段:
set fencs=utf-8,gbkfunction SaveEmptyFile() if &l:modifiable && nextnonblank(1)==0 set fenc=gbk endifendfunctionautocmd BufNewFile,BufReadPost * call SaveEmptyFile()
?通俗理解就是加了个事件响应函数,在方式甲的文件打开后,和方式乙的空文档建立后,自动检测文档是否为空,如果为空就设置编码为gbk。虽然方式乙其实用不着处理。
?