当你启动 Vim 时,它会检查环境变量从而找出你所使用的语言。大多数情况下这就够
了。你会看到你所用语言的消息 (如果有的话)。要查看当前语言,使用命令:
:language
如果你得到 "C" 的输出,表示 Vim 在使用缺省的语言 -- 英语。
备注
:
只有当多种语言支持被编译进 Vim 时,你才可能用它来编辑各种不同的语言。
要找出 Vim 是否支持多语种,看一下 ":version" 命令的输出中有没有
"+gettext" 和 "+multi_lang"。如果有的话,表示应该没问题了。如果你看到
"-gettext" 或者 "-multi_lang" 的话你得重找一个 Vim。
如果你想要 Vim 的输出消息也用另外一种语言呢?有几种可能的办法。你应该使用哪一
种取决于你所使用的系统。
第一种办法是在启动 Vim 前设置环境变量。以 Unix 为例:
env LANG=de_DE.ISO_8859-1 vim
只有你的系统支持该语言的时候这才有效。这个办法的好处是所有的 GUI 消息和运行库
里的消息都会使用正确的语言。缺点是你必须在启动 Vim 前设定所要用的语言。如果你
想在运行 Vim 当中改变所用的语言,你就得使用第二种办法:
:language fr_FR.ISO_8859-1
这样你可以尝试使用几种不同的语种名。当你所指定的语言系统不支持时你会得到一个错
误消息。而当所指定语言的消息文件不存在时,你不会被警告
。Vim 只会悄悄的使用缺省
的英语。
要找到系统支持的语言,先要找到列出这些语言的目录。在我的系统上,这个目录是
"/usr/share/locale"。有些系统上是 "/usr/lib/locale"。"setlocale" 的手册页应该
告诉你该目录在你使用系统的什么地方。
在键入那些语种名的时候要当心,大小写是有区别的,而且 '-' 和 '_' 字符也很容
易被混淆。
你也可以分别为消息,编辑文本和时间等设定所使用的语言。参阅 :language 。
自 己 动 手 翻 译 消 息
如果翻译的消息没有包括你的语言,你也可以自己写。你得先拿到 Vim 的源代码和 GNU
gettext 软件包。在解压缩了源代码后,先读一下 src/po/README.txt。那里有详细的指
导。
翻译本身不是很难的,你不一定要是一个程序员。当然,你必须懂英语和你要翻译成
的语言。
当你对你的翻译满意的时候,可以考虑和其它人共享。上载到 vim-online
(http://vim.sf.net) 或者 e-mail 给 Vim 的维护者 Vim <maintainer@vim.org>。
或者两者都做。
缺省情况下菜单是英语的。要使用你自己的语言,首先它们得被翻译过。通常情况下菜单
使用的语言会自动被设置成你所用的语言,就像消息一样。你什么也不用做。但是如果
Vim 不包括你所用语言的菜单的翻译就不行了。
假设你在德国,使用的语言被设为德语。但你更愿意在菜单中看到 "File" 而非
"Datei"。你可以这样将菜单语言换回英语:
:set langmenu=none
也可以指定某一语言:
:set langmenu=nl_NL.ISO_8859-1
和上面一样 "-" 和 "_" 是有区别的。然而,大小写在这里可以不分。
'langmenu' 选项必须在菜单被加载前设置才有效。一旦菜单已经被显示了,再改变其
值就不会直接生效了。因此,你需要把设置 'langmenu' 的命令放在 vimrc 文件里。
如果你实在想在 Vim 运行当中改变菜单所用的语言,你可以这样做:
:source $VIMRUNTIME/delmenu.vim
:set langmenu=de_DE.ISO_8859-1
:source $VIMRUNTIME/menu.vim
这样有一个缺陷: 所有你自己定义的菜单都不见了。你还得必须重新定义它们。
自 己 动 手 翻 译 菜 单
在下面这个目录可以找到那些已有的菜单翻译:
$VIMRUNTIME/lang
翻译文件被称为 menu_{language}
.vim。如果找不到你想使用的语言的翻译,你可以自行
翻译。最简单的办法就是拷贝现存的语言文件并在其基础上做改动。
先用 ":language" 命令找出你现在使用的语言的名称。就用这个名称,但名字的所有
字母要小写。将这个文件拷贝到你自己的运行时目录。例如,在 Unix 系统上你应该:
:!cp $VIMRUNTIME/lang/menu_ko_kr.euckr.vim ~/.vim/lang/menu_nl_be.iso_8859-1.vim
你会在 "$VIMRUNTIME/lang/README.txt" 文件中找到与翻译相关的更多提示。
Vim 猜你所要编辑的文件编码和你所用的语言相一致。对于许多欧洲语言而言,编码是
"latin1"。那么每个字节是一个字符。一共可能有 256 个不同的字符。而对于亚洲语言
这就远远不够了。这些语言大多使用双字节编码,从而提供超过一万个可能的字符。即使
如此,如果一篇文本中包括数种语言的文字,这样还是不够。Unicode 就是来解决这个问
题的。其设计允许它包括多种语言中全部的常用字符。它被称为 "替代所有其它编码的超
级编码格式"。但它的使用还不很广泛。
幸运的是,Vim 对这三种编码方式都支持,并且有条件的支持使用与系统环境语言不
一致的文本编码。
当你的系统语言与你所编辑文件用的编码一致时,缺省设定应该没有问题。所以你什
么也不用担心。下面的叙述只是当你想编辑不同的语言时才有关系。
在 GUI 上 使 用 UNICODE
Unicode 一个很方便的特性就是它可以与其它编码格式相会转换而不丢失信息。当你使
Vim 在内部使用 Unicode,你将可以用任何编码编辑文件。
不过,支持 Unicode 的系统还是比较有限的。因此可能你的语言不使用 Unicode。你
得告诉 Vim 你希望使用 Unicode,然后在解决与系统其它部分交互的问题。
我们来启动 GUI 版本的 Vim,这样我们就可以显示 Unicode 字符。这样就行了:
:set encoding=utf-8
:set guifont=-misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1
'encoding' 选项告诉 Vim 你所用的字符的编码。该选项适用于缓冲区的文本 (你正在编
辑的文件),寄存器,Vim 脚本文件等等。你可以把 'encoding' 选项当作是对 Vim 内部
运行机制的设定。
上例假设你的系统安装了指定的字体。例子中的字体名是用于 X-Window 系统的。这
种字体是包括在一个用于增强 xterm 的软件包中的。如果你没有这种字体,你可以在这
里找到:
http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
对于 MS-Windows,一些字体包含了一些有限的 Unicode 字符。试一下 "Courier New"
字体。你可以通过 Edit/Select Font... 菜单来选择几种字体试试。但是你只能使用定
宽的字体。例如:
:set guifont=courier_new:h12
如果不行的话,试着找个字体包。你可以在下面这个地址找到,如果 Microsoft 没把它
移走的话 (译者注
: 已经不能用了):
http://www.microsoft.com/typography/fonts/default.aspx
现在你已经通知了 Vim 在内部使用 Unicode 并用一种 Unicode 字体显示文本。然而,
Vim 接收到的输入字符依然来自原来语言的编码字符。这些字符必须被转换成 Unicode。
你可以通过 'termencoding' 选项值来通知 Vim 要转换的语言。像这样:
:let &termencoding = &encoding
:set encoding=utf-8
这样就在 'encoding' 赋值为 utf-8 之前把 'encoding' 的旧值赋给 'termencoding'。
你得自己试试这个办法在你的系统上行不行得通。当你使用一个为亚洲语言专门设计的输
入法,同时又想编辑 Unicode 文本,这个办法应该工作的很好。
在 UNICODE 终 端 内 使 用 UNICODE
也有直接支持 Unicode 的终端。XFree86 自带的标准 xterm 就是其中之一。我们就用它
作为例子。
首先,Unicode 支持要被编译进 xterm。参阅 UTF8-xterm 。
用 "-u8" 参数启动 xterm。你可能还需要指定一个字体。例如:
xterm -u8 -fn -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1
现在你就可以在终端内运行 Vim 了。像前面一样将 'encoding' 设定为 "utf-8"。这样
就行了。
在 普 通 终 端 里 使 用 UNICODE
假定你希望编辑 Unicode 文件,但是手头又没有一个支持 Unicode 的终端。你还是可以
用 Vim 这样做,但是那些终端不支持的字符就不能被正确的显示了。文本的编排格式会
被保留。
:let &termencoding = &encoding
:set encoding=utf-8
这和 GUI 的那个例子一样。但内部工作机制不同: Vim 会把显示的字符转换后再送给终
端程序。这样屏幕就不会显示一堆毫无意义的字符。
这需要 'termencoding' 和 'encoding' 之间的转换。Vim 会自己处理 latin1 和
Unicode 之间的转化。其它的转换需要编译进来 +iconv 特性。
试着编辑一个含有 Unicode 的文件。你会注意
到 Vim 会在那些无法显示的字符处显
示问号 (或下划线或者其它什么)。将光标移动到问号的地方并使用下面的命令:
ga
Vim 会显示该字符的代码。这样你就会知道那个字符大概是什么。你可以去查 Unicode
表。如果你有很多很多时间的话,你甚至可以这样来阅读一个文件的内容。
备注
:
因为 Vim 对所有的文本都使用 'encoding' 选项。改变该选项的值会使所有的
非 ASCII 码字符无效。你在使用寄存器和 'viminfo' 文件 (例如,一个被存储
的查找模式) 时就会注意
到了。建议在 vimrc 文件里设置 'encoding' 选项,
然后就别再碰它。
45.4 编辑其它编码的文件
假定你已经配置 Vim 使用 Unicode 了,你现在想编辑一个 16 位 Unicode 的文件。听
起来很简单,是吗?事实上,Vim 在内部使用 utf-8 编码,所以 16 为的编码必须被转
换。因为存在一个字符集 (Unicode) 和编码格式 (utf-8 或 16 位) 的差别。
Vim 会试着用 'fileencodings' 选项中的编码名称检测你在编辑哪种文件。当使用
Unicode 时,缺省的选项值是: "ucs-bom,utf-8,latin1"。也就是说 Vim 会检查编辑的
文件看看是下面的编码之一:
ucs-bom 文件必须以 Byte Order Mark (BOM) 开始。可以检测 16
位,32 位和 utf-8 Unicode 编码。
utf-8 utf-8 Unicode。如果有在 utf-8 中非法的字节序列,此设定
将被拒绝。
latin1 保证有效的经典 8 位编码。
当你开始编辑一个 16 位的 Unicode 编码,而该文件有 BOM 时,Vim 会检测到这些并在
读取文件时将其转换为 utf-8 编码。'fileencoding' 选项 (后面没有 s) 被设为检测到
的值,在本情况下是 "utf-16le"。表示是 Unicode,双字节以及 little-endian (高位
字节在后) 的编码。这样的文件格式在 MS-Windows 上很常用 (例如,注册表文件)。
当写入文件时,Vim 会比较 'fileencoding' 和 'encoding' 的值。如果它们的值不
同,文本会被转换。
如果 'fileencoding' 的值是空的,意味着不作任何转换。这样文本就会被以
'encoding' 的值来编码。
如果缺省的 'fileencodings' 值不行的话,你可以将其设成你希望 Vim 尝试使用的编
码。只有当一个值无效时下一个才会被使用。将 "latin1" 放到第一位是不行的,因为它
永远都不会是无效的。举个例子,要在文件没有 BOM 也不是 utf-8 编码的时候缺省设为
简体中文编码 (Unix 和 Windows 上都可以用 chinese 作为编码名):
:set fileencodings=ucs-bom,utf-8,chinese
encoding-values 有建议值。其它的值也可能有效。这取决于系统提供的转换功能。
强 制 编 码
如果编码的自动检测对你不起作用的话,你就得告诉 Vim 你要编辑的文件是什么编码。
例如:
:edit ++enc=koi8-r russian.txt
"++enc" 部分指定编辑该文件时应该使用的编码。Vim 会把指定的编码 (在这是俄语) 转
换为 'encoding'。'fileencoding' 也会被设为指定的编码,这样当写入文件时就会发生
编码的反转换。
在写入文件时也可以用到一样的参数。这样你事实上可以用 Vim 来转换一个文件。例
如:
:write ++enc=utf-8 russian.txt
备注
:
转换可能导致字符丢失。在 Unicode 和其他编码之间的相互转换基本上不会有
这个麻烦,除非你有非法字符。当文件包括多于一种语言的字符时,从 Unicode
转换为其它编码很可能会丢失信息。
计算机键盘只有那么多键。有些语言包括几千个字符。Unicode 有超过十万。那你怎么才
能输入这些字符呢?
首先,如果你不需要很多的特殊字符,你可以用二合字母。这已经在 24.9 讲述过
了。
当你使用一种有很多字符的语言,你的键盘应付不了,你就得使用一种输入法 (IM)。
这需要学习如何把输入的键变成要输入的字符。你所用的系统很可能已经提供了输入法。
Vim 应该可以很好地与其合作。更多的细节请参阅 mbyte-XIM (X-Windows) 和
mbyte-IME (MS-Windows)。
键 盘 映 射 表
对于某些语言来说字符集可能不同但是可用的字符数目和拉丁字符集差不多。这样就有可
能在字符和键盘之间定义一个一对一的对应。Vim 用键盘映射表来解决这个问题。
假定你想输入希伯来语,你可以这样载入希伯来语的键盘映射表:
:set keymap=hebrew
Vim 会为你找到一个键盘映射表文件。这取决于 'encoding' 选项的值。如果找不到相应
的文件,你会得到一个错误信息。
现在你就可以在插入方式下输入希伯来语了。普通模式下,当你键入 ":",Vim 会自动切
换到英语。你也可以用下面这个命令来在希伯来语和英语之间切换:
CTRL-^
它只在插入模式和命令行模式下才有效。在普通模式下会产生完全不同的效果 (跳转到轮
换文件)。
如果你打开 'showmode' 选项的话,键盘映射表的使用情况会在状态信息里指出。在
GUI 上,Vim 会使用不同的光标颜色来指明映射表的使用情况。
你可以用 'iminsert' 和 'imsearch' 选项来改变键盘映射表的用法。
要查看键映射的列表,用这个命令:
:lmap
要查看系统有哪些键盘映射表文件,在 GUI 上你可以用 Edit/Keymap 菜单。否则你可以
用:
:echo globpath(&rtp, "keymap/*.vim")
(译者注
: 中文用户可以试试 pinyin 映射表,可用来输入带四声的韵母。)
自 定 义 键 盘 映 射 表
你也可以创建你自己的键盘映射表。不是很难。从一个和你要使用语言类似的映射表开
始。将其拷贝到你的运行时目录里的 "keymap" 子目录。例如,在 Unix 上,你可以用
"~/.vim/keymap" 目录。
键盘映射表的文件名必须遵守下面的规则:
keymap/{name}
.vim
或
keymap/{name}
_{encoding}
.vim
{name}
是键盘映射表的名字。选择一个容易识别,又和系统中其它映射表不同的名字
(除非你希望替换一个现存的映射表)。名字不能包括下划线。使用的编码名是可选的。例
如:
keymap/hebrew.vim
keymap/hebrew_utf-8.vim
文件的内容应该很容易理解。看看随 Vim 一起发布的几个键盘映射表就行了。更详细
的,请参阅 mbyte-keymap 。
最 后 的 办 法
如果其它的方法都行不通,你可以用 CTRL-V
来输入任何字符:
编码 键入 范围
8-bit CTRL-V
123 十进制 0-255
8-bit CTRL-V
x a1 十六进制 00-ff
16-bit CTRL-V
u 013b 十六进制 0000-ffff
31-bit CTRL-V
U 001303a4 十六进制 00000000-7fffffff
注意
不要输入空格。更详细的,参阅 i_CTRL-V_digit 。