1 min read

Vim 文件格式

因为经常要在 Windows XP 上用 Vim 编辑从 Apache 服务器上下载的文件,于是行末就会经常出现 “^M” 这样的非正常行结束符。

首先,Vim 能够识别三个操作系统下的文件格式,包括 Unix,Dos 与 Mac。在创建文件或写入时,这三种文件格式分别决定了行末要添加什么特殊字符,而在读入文件时,又分别决定了要从行末移去什么特殊字符。

这样,就可以列出下面一个表格:

Vim File Format
Unix Dos Mac OS X
写入 +LF +CRLF +LF
读取 -LF -CRLF -LF

注:

CR is carriage return (return cursor to left margin), which is Ctrl-M or ^M or hex 0D.

LF is linefeed (move cursor down), which is Ctrl-J or ^J or hex 0A. Sometimes, LF is written as NL (newline).

新建文件

从 Vim 新建的文件,文件的 file format 值是由 Vim fileformats 这个选项值决定。fileformats 是全局选项,决定了操作系统新建或打开文件时应用到文件上的 file format 值。

比如我现在所用系统为 Windows XP,在 Vim 命令模式下使用 :set ffs? 可以查看到,fileformats 值是 “dos,unix”。则我从 Vim 中新建并保存的一个 ffs.txt 文件,用 :set ff? 查看的话,其显示值为 “fileformat=dos”。

根据上面表格说明,则 Vim 在保存过程中,在行末添加了 “^M^J” 字符,只是在打开时又移除了,所以我们看不见。

特殊字符

用 Vim 打开上面那个 fileformat 值为 dos 的 ffs.txt 文件,然后在命令模式下键入 :e ++ff=unix,这个命令用于将当前文件的 fileformat 值更改为 unix,根据上表,这样就需要从行末移除 “LF”,即 “^J” 字符,因为 fileformat=dos 时在行末添加的是 “^M^J”,而 fileformat=unix 仅仅移除了 “^J”,于是 “^M” 这个特殊字符就可见了。

从 unix 转 dos

新建一个 ffunix.txt 文件,保存时将它的 fileformat 设置为 unix,这样就会在行末加入 “^J” 字符,那么再用 :e ++ff=dos 转换文件格式为 dos。在 Vim 下方显示文件名称的右侧会出现 [CR missing] 的提示。Vim 试图从 “^J” 中移除 “^M^J”,于是就出现上面的错误提示了。

清空 ^M

今天试图从 ftp上 直接打开 php 文件,Vim 显示两个 “^M” 字符,真够让人傻眼的。上面介绍的转换文件格式的方法显然不能用,则另有个办法,用 Vim 下的替换功能,将特殊字符 “^M^M” 替换为空。

在 Vim 的命令模式下键入 :%s/\r//g,就可以清空无关的 “^M” 字符。

参考资料

  1. file format
报告问题 修订

如果你有自建 https 代理的需求,欢迎尝试 Phantom,一键搭建,方便快捷。查看 demo