如何正确设置Vim以便在UTF-8中进行编辑

22

我遇到过几次问题,因为vim的默认编码设置为latin1,我没有注意到并假定它使用utf-8。现在我想设置vim,使其在所有明显的情况下都可以正确地处理,并默认使用utf-8。

我想避免的问题:

  • 强制以其他编码保存的文件(在我的更改之前是正常的)以utf-8格式打开,导致乱码。
  • 强制不支持多字节字符(例如Windows XP终端)的终端尝试显示它们,导致乱码。
  • 干扰其他程序读取或编辑这些文件的能力(我有一种(也许是不合理的)不愿意默认使用BOM的厌恶,因为我不清楚这是否容易搞砸其他程序)。
  • 其他我无法猜测的问题(但希望您知道!)

到目前为止我所得到的:

if has("multi_byte")
  if &termencoding == ""
    let &termencoding = &encoding
  endif
  set encoding=utf-8                     " better default than latin1
  setglobal fileencoding=utf-8           " change default file encoding when writing new files
  "setglobal bomb                        " use a BOM when writing new files
  set fileencodings=ucs-bom,utf-8,latin1 " order to check for encodings when reading files
endif

这是从vim维基获取并稍作修改的内容。我将bombsetglobal fileencoding移到了自己的语句中,因为否则它实际上不起作用。我还注释掉了那一行,因为我不确定BOMs是否有问题。

我正在寻找:

  • 可能需要避免的风险
  • 现有代码的问题
  • 任何已经讨论/设置的链接

最终,我希望这能够成为一个无需思考的复制/粘贴片段,可在各种平台上设置vim的默认编码为utf-8。

编辑:目前我已将自己的答案标记为接受,据我所知它运行良好并涵盖了所有可以合理涵盖的方面。但这并非铁板钉钉;如果您有任何新信息,请随时回答!


嘿,Nick,你是从这里得到的吗?它有一些不错的位解释。 - tchrist
是的,我做到了,正如我所希望的那样清楚明了。代码块下面的第一句话链接到它,并说“这是从vim wiki中取出并稍作修改的”。 - Nick Knowlson
2个回答

25

回答sehe的问题,我将尝试回答我的问题!我删除了对原始问题所做的更新,并将它们移到了这个答案中。这可能是更好的方法。

答案:

if has("multi_byte")
  if &termencoding == ""
    let &termencoding = &encoding
  endif
  set encoding=utf-8                     " better default than latin1
  setglobal fileencoding=utf-8           " change default file encoding when writing new files
endif

根据BOM维基页面,我删除了bomb行,因为在使用utf-8时不需要它,事实上会破坏ASCII向后兼容性。只要在fileencodings中首先使用ucs-bom,vim 就能检测和处理带有BOM的现有文件,因此也不需要它。

我删除了fileencodings行,因为在这种情况下它是不必要的。来自Vim文档的说明如下:当'encoding'设置为Unicode编码且尚未设置'fileencodings'时,默认值会更改。

我使用setglobal filencoding(而不是set fileencoding),因为: 当读取文件时,fileencoding将根据fileencodings自动设置。因此,它仅对新文件有影响。再次根据文档

对于新文件,使用全局的'fileencoding'值。


1
这段代码片段将直接添加到我的rc文件中。这是我反对Latin-1的十分重要的一步。非常感谢您提供这个。 - jollyroger
没问题!很高兴能帮忙。 - Nick Knowlson
1
太好了。我现在也成为WinXP的受害者,所以我重新找到了这些信息... :) Stack Overflow也像一个公共笔记本一样! - sehe
你用哪个终端使它工作的?这是 gVim 还是控制台 Vim? - doubleDown
我通常使用MacVim或gVim,但这些设置应该适用于所有控制台和图形界面。在我编写这篇文章时,我可能已经在Ubuntu的默认终端、Win7终端和iTerm 2上尝试过它们。 - Nick Knowlson
“fileencodings”的默认值已更改”- 嗯,不太确定我是否真正理解了。 - john c. j.

2

我认为只需要拥有一个基础的vimrc文件和编码为utf-8即可。

其他功能应该已经能够完美地开箱即用了。

我只会在使用微软工具的Windows平台上使用BOM(尽管其中一些甚至无法始终编写BOM;但这是记事本Unicode保存、.NET XmlWriter和其他MS平台工具的默认设置)。


知道在Windows平台上的BOM是很好的,谢谢!不幸的是,只在我的.vimrc文件中设置fenc=utf-8并不能完全解决问题。用这种方式打开我的测试文件会出现以下情况:should have a BOM and be in utf-8 '‒' - Nick Knowlson
在哪个平台上?在我的Linux系统上,默认情况下fileencodings=ucs-bom,utf-8,default,latin1,所以它应该可以工作。这是在Ubuntu Maverick、vim 7.2(补丁1-330)和(vimrc或debian.vim的全局)没有编码相关标志的情况下。 - sehe
1
在Windows XP上,使用vim 7.3。这实际上非常有趣。我认为不同的平台之间会有一些差异,但有一个具体的例子来说明这个问题是很好的。 - Nick Knowlson
WinXP/7.3的fencs的默认值是什么? - sehe
好的,你现在的回答不行。如果你更新它并包含这些评论中的信息,那么我就可以接受了! - Nick Knowlson
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接