VIM 是否添加了 Windows 换行符?

dot*_*hen 14 unix vim newlines

请注意以下行的结尾git diff

-   IP_ADDR: 'http://1.2.3.4:143'
+   IP_ADDR: 'http://2.4.6.8:143'^M
Run Code Online (Sandbox Code Playgroud)

我通过将光标放在1然后按下ct:然后输入新的 IP 地址来编辑这个文件。没有在文件中添加或删除完整的行。我确实注意到该文件dos在 VIM 中显示为类型。

如果我没有明确编辑文档的那部分,为什么 VIM 会更改行尾?另外,看到如何diff显示^M原始行中没有,否则 VIM 怎么会决定这是一个dos文件?

Ing*_*kat 10

Vim 将检测原始文件格式(在 中配置的文件格式中'fileformats'),并以相同的格式写入。Vim 切换(例如从 Unix 到 Windows 风格)的唯一方法是通过显式的:setlocal fileformat=dos. 你的配置中不太可能有它;:verbose setl ff?可以告诉你。

我不会太担心 Git diff ifself(只要不是所有的行都显示为更改,那么您确实可以切换行尾),而是提交的内容没问题。

请注意,使用 Git 设置autocrlf = true,Git 会在检出文件时将换行符转换为系统标准,并在提交时将换行符转换为 LF 换行符。所以一切可能都很好,只有 Git diff 输出让你感到困惑。


ben*_*her 6

这是我们都生活在矩阵中的证据。如果这真的是 21 世纪,那么我们就不会还在为不同的结局而战。

Vim 在用行结尾做正确的事情方面做得非常好。详细信息在 下说明:help 'ffs'。当然,vim 无法读懂你的想法:如果你的文件有不一致的行尾,那么 vim 可能不会做你想要的。

我建议在vim中打开文件然后

:e! ++ff=unix
Run Code Online (Sandbox Code Playgroud)

这将从磁盘重新加载文件,强制 vim 使用 unix 样式的行结尾。然后您应该确切地看到哪些行(任何行)具有 CRLF 结尾,因为它们将以原始^M字符结尾。

虽然我喜欢 git,但我并不像 vim 那样了解和信任它。我认为有些人建议为 git 的crlf设置设置“设置并忘记它”配置,这可能会导致混淆。我更喜欢避免@Ingo Karkat 在他的回答中提到的设置。我希望 git 检出已检入的同一个文件,并让我(和 vim)处理行尾。