EOL 换行符

EOL 有两种,一种是 Windows 上的 CRLF(Carriage-Return + Line-Feed),另一种是类 Unix 系统上的 LF(Line-Feed).

其中 CR 的 ASCII 对应为 13,也就是回车符 \r,而 LF 的 ASCII 码为 10,为换行符 \n

可能你也见过退格符 \b,它们的具体意思分别是:

\r 回车符,将光标移动到本行的开头。

\n 换行符,换行并将光标移到下一行开头。

\b 退格符,删除最后的字符。

CRLF 和 LF 的具体差异

在 Windows 上,当你按下 Enter 键时,输入的是两个字符,\r 以及 \n,即 CRLF(\r\n),而在类 Unix 系统上,按下 Enter 后只会输入 \n,即 LF

这两者的差异不会对一般的 coding 造成影响,因为诸如 Git 等常用工具已经考虑到这些方面并做出了适配

Windows 为什么选择 CRLF

这里引用博主 Belleve 在知乎上的回答

CR 和 LF 最初是控制电传打印机(Teletype,所以 UNIX 里面有个 tty,就是这玩意的缩写)的

CR 把打印头移动到行首,LF 把纸上卷一行,因为 CR 要的时间更长所以一般要求换行的过程里面都是 CR 在前(有些早期设备甚至还会在 CR 和 LF 之间插 NUL,确保打印头完成复位)。

DOS 从 DEC1 和 CP/M2 那里继承了这个设计,这样文本文件的字节序列可以直接控制打印机。而 Unix 的前身 Multics 里面有一个驱动程序,会自动将 LF 转换成 CR-LF(甚至 CR-NUL-LF),所以他们用了单一的 LF。

配置你在 Windows 上的 VSCode 以及 Git

在 Windows 上,所有的文本文件都是以 CRLF 作为换行符的,而且因为换行符都是不可见字符,所以有的时候在不同系统上分享文件的时候难免会出错,下面针对 VSCode 和 Git 分享一下我自己的配置(多谢 Atom)

VSCode

  1. 点击 VSCode 左下角的齿轮(Manage)

  2. 选择 Settings

  3. 再看右上角的小图标,鼠标放上去显示 Open Settings (JSON),单击打开配置文件

  4. 在文件中加入一行:

    "files.eol": "\n",
    

这样在编辑和打开文件,按下 Enter 键的时候,默认采用 LF,你可以观察 VSCode 右下角的状态栏来查看当前文件的换行符设置

Git

我们已经知道,在 git commit 时,所有的 CRLF 会被转换成 LF,但您可能不知道的是,在我们 git pull 拉取代码的时候,默认情况下,Git 会将远程仓库代码中的换行符转换成本地的换行符

也就是说,如果您的操作系统是 Windows,远程仓库的换行符是 LF,那么当你将代码拉取下来的时候,Git 会帮你把所有 LF 转换成 CRLF,想到提交时一般又会转换回去,这一步显然是没有什么必要的。同时,把 LF 转换成 CRLF 会在某些情况下造成意想不到的错误。

比如当您在 VSCode 上使用了 Eslint 这个拓展时,您会发现它对所有的 CRLF 一点都不友好(具体表现为全屏飙红)

我们需要配置 Git,让它在拉取代码的时候保持代码的原本换行符(LF)

git config --global core.autocrlf input

具体解释请看 Git 文档:Git - Git Configuration

当然,您也可以在项目中添加 .gitattributes 文件,方法有很多