和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括 UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是,和很多来自 Linux 世界的软件一样,这需要你自己动手设置。

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 控制台的代码页,并且通常我们不需要改变它。

好了,解释完了这一堆容易让新手犯糊涂的参数,我们来看看 Vim 的多字符编码方式支持是如何工作的。

  1. Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。
  2. 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的(注1)字符编码方式。
  3. 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为 encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll(注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。
  4. 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll

由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式(空间消耗比 UCS-2 小),因此建议 encoding 的值设置为 utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确(或许这个理由才是主要的 ;)。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese(chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示 cp936,也就是 GBK 的代码页)。

以下是我的 .vimrc 中关于字符编码方式设置的内容,这个设置比较有弹性,可以根据系统中的环境变量 $LANG(当然,Windows 中的写法是 %LANG%)的值来自动设置合适的字符编码方式。此时,推荐设置 %LANG% = zh_CN.UTF-8,可以通过后面的 Windows 注册表脚本文件来方便的做到。

" 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,chinese,taiwan,japan,korea,utf-8,latin1
  " CJK environment detection and corresponding setting
  if v:lang =~ "^zh_CN"
    " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
    set encoding=chinese
    set termencoding=chinese
    if &fileencoding == ''
      set fileencoding=chinese
    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

Windows 注册表脚本。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\\Environment]
"LANG"="zh_CN.UTF-8"

注1: 事实上,Vim 的探测准确度并不高,尤其是在 encoding 没有设置为 utf-8 时。因此强烈建议将 encoding 设置为 utf-8,虽然如果你想 Vim 显示中文菜单和提示消息的话这样会带来另一个小问题。参见另一篇 Win32 下 Vim 设置 enconding 为 utf-8 会在显示特定消息时崩溃。(此处提到的崩溃问题在 gVim 7.0 beta 时代就已经被解决了。)

注2: 在 GNU 的 FTP 上可以下载到 iconv 的 Win32 版,不推荐去 GnuWin32 下载 libiconv,因为那个版本旧一些,并且需要自己改名 dll 文件。

标签:, , ,

还记得几年前初次接触 GNU/Linux 时,听说 GNU/Linux 下最常用的文本编辑器叫做 vi。在 DOS/Windows 下已经生活了一两年的我,自然知道文本编辑器的重要性。于是尝试输入 vi 启动这个被众多 GNU/Linux 用户“吹捧”的著名文本编辑器。

“Oh, shit!” 这是什么怪物?作为文本编辑器它居然就给我一个没有菜单的,只显示了一些莫名其妙的 ~ 符号和它自己名字的黑屏幕。最要命的是在我按了几个字母键之后,它居然除了让机箱里的 speaker 吱吱叫几声之外没有任何反应!

当然,后来看了一些介绍后才知道 vi(其实当时我使用的并不是古董级的 vi,而是 vi 的一个非常流行的增强型变体 Vim——Vi IMproved)有几种不同的工作模式,启动之后默认是命令模式,需要使用一些特定的命令才能进入插入模式像我们习惯的文本编辑器那样输入内容。看上去这样好像很不方便,但习惯之后就会觉得非常的爽。因为使用命令模式下那些简洁的命令,绝大多数操作双手都不必离开字母区域。比如最常用到的光标的四个方向移动,Vim 使用命令模式下的 h j k l 四个键来代表←↓↑→四个方向键。同样常用的翻页功能,Vim 使用命令模式下的 Ctrl + B 和 Ctrl + F 来代表 Page Up 和 Page Down。这样移动光标时手根本不需要移动,而翻页时也只需要左手稍微倾斜一下,这种感觉实在是太爽了。

不过来自 GNU/Linux 世界的 Vim 跟大多数 GNU/Linux 下的软件一样不太适合普通用户,它们带有的“黑客色彩”太浓重了。功能太强以至于让它们本身变得很复杂,加上不够友好的用户界面、一大堆的简洁至极的命令/参数缩写,这些足以让一个普通计算机用户望而生畏。但是在经过一段时间(或许是一段较长的时间)的熟悉之后,它们会变成你手中的一件利器,那时你就会发现以前的付出得到了数倍的回报,正所谓“磨刀不误杀人功”。

Win32 版本的 Vim 我已经安装了有些时日了,只不过一直因为各种借口没有去用它(其实主要原因是我实在很不善于安排时间,以至于把大把的时间都浪费掉了……)。昨天下午因为女同胞的节日学校放假,一时心血来潮再次运行了 Vim 的教程,并且第一次仔细的完成了这个教程(当然里面有不少东西都是用过的了,毕竟断断续续的用 GNU/Linux 也有几年了)。然后又选了帮助中一些基本的,经常会用到的东西来看了一下,边看边尝试,玩了几个小时。现在用 Vim(当然在 Win32 里我是用的 GUI 版本的 gVim)来进行基本的日常文本编辑已经没有什么问题了,不过要想用它完全取代 EditPlus 还需要时间。

其实这也是我的“回到 GNU/Linux”计划的一部分。虽然以前装过多次 GNU/Linux 的一些发行版,但始终因为 Windows 下的一些习惯和应用,以及对 GNU/Linux 系统不够熟悉而无法专注于它。最近才突然想到可以用折中的办法:先在 Virtual PC 里熟悉 GNU/Linux,同时在 Windows 下熟悉一些 GNU/Linux 里常用软件的 Win32 版本,再加上 Windows 里的 GNU 环境 Cygwin,应该可以让我平滑的回到 GNU/Linux ——这个影响了我名字的自由操作系统了。

注:一部分大众传播媒体混淆地将「黑客」一词用来表示「安全破坏者」。我们作为黑客拒绝认可这个含义,并继续用这个词表示「那些喜爱编程并享受在其中变得更擅长於编程的人。」——出自 Richard Stallman 的 GNU 工程

标签:,
Page 3 of 3123