如何正确设置 vim 以在 utf-8 中进行编辑

Posted

技术标签:

【中文标题】如何正确设置 vim 以在 utf-8 中进行编辑【英文标题】:How to setup vim properly for editing in utf-8 【发布时间】:2011-03-29 19:02:35 【问题描述】:

我遇到了几次问题,因为 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 wiki 中提取并稍作修改的。我将bombsetglobal fileencoding 移到了它自己的语句中,否则它实际上不起作用。由于我对 BOM 的不确定性,我还注释掉了该行。

我在寻找什么:

我错过的可能避免的陷阱 现有代码存在问题 链接到已讨论/已列出的任何地方

最终,我希望这会产生一个无需考虑的复制/粘贴 sn-p,它将默认为 utf-8 设置 vim,跨平台工作。

编辑:我已经将我自己的答案标记为目前已接受,据我所知,它可以正常工作并考虑到它可以合理解释的所有事情。但这不是一成不变的。如果您有任何新信息,请随时回答!

【问题讨论】:

嘿尼克,你是从here 那里得到的吗?它对这些位有一些体面的解释。 是的,我希望我说清楚了。代码块正下方的第一句话链接到它,并说“这是从vim wiki中获取并稍作修改的”。 【参考方案1】:

作为对 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

我删除了bomb 行,因为根据BOM Wikipedia page,使用utf-8 时不需要它,实际上破坏了ASCII 向后兼容性。只要ucs-bomfileencodings 中排在第一位,vim 就能够检测和处理带有 BOM 的现有文件,因此也不需要这样做。

我删除了fileencodings 行,因为在这种情况下不需要它。来自Vim docs:When 'encoding' is set to a Unicode encoding, and 'fileencodings' was not set yet, the default for 'fileencodings' is changed.

我使用setglobal filencoding(而不是set fileencoding)是因为: 读取文件时,会根据fileencodings自动设置fileencoding。所以它只对新文件很重要。并再次根据docs:

对于一个新文件的全局值 使用了“文件编码”。

【讨论】:

这个 sn-p 直接进入我的 rc 文件。在我对拉丁语 1 的讨伐中迈出了非常重要的一步。非常感谢你。 没问题!很高兴能帮上忙。 太棒了。我重新找到了这些信息,因为我现在自己是 WinXP 的受害者...... :) SO 也是这样的公共笔记本! 您使用哪个终端来完成这项工作?这是 gVim 还是控制台 Vim? 我通常使用 MacVim 或 gVim,但这些设置应该适用于所有控制台和图形界面。当我写这篇文章时,我可能在任何 Ubuntu 的默认终端、Win7 终端和 iTerm 2 上尝试过。【参考方案2】:

我认为有一个 vanilla vimrc + fenc=utf-8 就足够了

其余的应该是相当不错的开箱即用

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

【讨论】:

很高兴了解Windows平台上的BOM,谢谢!不幸的是,在我的 .vimrc 中打开一个只有 fenc=utf-8 的 utf-8 文件并不能完全消除它。用它打开我的测试文件会给我以下信息:should have a BOM and be in utf-8 '‒' 那是在什么平台上?在我的 linux 机器上,默认情况下是 fileencodings=ucs-bom,utf-8,default,latin1,所以它可以工作。这是在 Ubuntu Maverick、vim 7.2(补丁 1-330)上,并且在(全局)vimrc 或 debian.vim 中没有与编码相关的标志 在 Windows XP 上,vim 7.3。这实际上很有趣。我认为平台之间会有一些差异,但很高兴有一个关于这个问题的具体例子。 WinXP/7.3上的fencs默认值是多少? 貌似是fileencodings=ucs-bom

以上是关于如何正确设置 vim 以在 utf-8 中进行编辑的主要内容,如果未能解决你的问题,请参考以下文章

如何正确设置 Vim 自动缩进以编辑 Python 文件?

如何设置正确的 Ruby 版本以在 Aptana 3 中与我的 Rails 5 项目一起使用?

如何在vim中编辑多列中的文本

linux vim三种模式如何切换

如何正确设置 PHP 环境变量以在 Git Bash 中运行命令

vim字符编码设置