我想避免的:
>强制保存一些其他编码保存的文件,这些编码在我的更改打开为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开始稍作修改的。我将炸弹从setglobal fileencoding移动到它自己的语句,因为否则它实际上不起作用。由于我对BOM的不确定性,我也评论了这条线。
我在找什么:
>可能的陷阱,以避免我错过
>现有代码存在问题
>链接到已经讨论过的任何地方
最终,我希望这会产生一个无需思考的复制/粘贴代码片段,它将为utf-8设置vim,默认情况下可以跨平台工作。
编辑:我已经将我自己的答案标记为现在已被接受,据我所知,它可以正常工作并且可以合理地解释所有可以解释的事情。但它并非一成不变;如果您有任何新信息,请随时回答!
答案:
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 Wikipedia page,使用utf-8时不需要它,实际上违反了ASCII向后兼容性。只要ucs-bom是fileencodings中的第一个,vim就能够检测和处理带有BOM的现有文件,因此也不需要它。
我删除了fileencodings行,因为在这种情况下不需要它。从Vim docs:当’encoding’设置为Unicode编码,并且’fileencodings’尚未设置时,’fileencodings’的默认值被更改。
我使用setglobal filencoding(而不是set fileencoding),因为:
在读取文件时,将根据fileencodings自动设置fileencoding。所以它只对新文件有用。并再次根据docs:
For a new file the global value of ‘fileencoding’ is used.