Norminette 空行或不在末尾

Norminette empty line or not at end

为什么 VStudio 上有 norminette 高亮的人在末尾放了一个空行。 当他们在 iTerm 中做 norminette 时,它​​是有效的

当您使用 Vim 并在末尾放置一个空行时,norminette 会说错误额外行。

这发生在昨天和今天,我的 Vstdio 在末尾要求一行,当我在 iTerm 中执行 norminette 时,它​​说错误额外的行。我返回 vim,删除该行,norminette 再次说错以删除多余的行。我需要重新打开文件,添加行,然后删除并保存以使 norminette 正常工作。所以现在有时 moulinette 在服务器上说 KO 但我这边好。当我在 vstdio

上工作时,我每次都需要 add/remove 最后一行 vim

因此,如果有人知道这个问题,我希望有一个更好的解决方案,而不是在接下来的 3 周甚至 3 年内仔细检查 vim,谢谢大家!

这个话题已经讨论到死了。

无论您使用什么系统,文本文件中的行通常以一两个不可见字符结尾。在某些系统上,它是一个“回车符 return”CR 后跟一个“换行符”LF,在其他系统上它只是一个 CR,在其他系统上它只是一个LF,这仅适用于最不具有异国情调的人。那个字符或一对字符有几个口语化的名字:“换行符”、“EOL”等,以后我就用“EOL”了。

现在,EOL 有两种语义解释。在某些情况下,EOL 被认为是“行终止符”,这意味着不对它后面的内容做出任何假设,而在其他一些情况下,EOL 被认为是“行分隔符”,这意味着总是有一个在它后面一行。

然后是文本流应该如何结束的相关问题。对于第一种解释,流的最后一行应该以 EOL 结尾,如果只是为了能够在两个流之间建立边界的话。根据上面的第二种解释,流的最后一行不应该以 EOL 结尾,因为这意味着……最后一行并不是真正的最后一行。

所以,基本上,这段文字:

foo
bar
baz

可以编码为(第一种解释):

foo<EOL>
bar<EOL>
baz<EOL>

或如(第二种解释):

foo<EOL>
bar<EOL>
baz

大多数 Unix-like 工具几十年来一直采用第一种解释,并且通常期望 EOL 在最后一行,但更多现代工具采用第二种解释,这导致在 GUI 之间游刃有余的新一代人中产生了很多混淆编辑器和 CLI 工具。

将一些带有最终 EOL 的文本提供给将其解释为“行分隔符”的工具,您会在文件末尾显示一条假想行:

1 foo
2 bar
3 baz
4

将一些没有最终 EOL 的文本提供给将其解释为“行终止符”的工具,您可以获得从合理显示(如下)到大声抱怨(git)的任何内容:

1 foo
2 bar
3 baz

再加上像“换行符”这样令人困惑的名称,您就有了 never-ending 问题流的秘诀。

所以……这似乎是这里发生的事情:

  1. 您正在混合使用以不同方式解释 EOL 的工具,
  2. 您对其中一种解释的理解有误,
  3. 然后你根据这种误解采取行动,结果令人困惑。

让我们解决这些问题 one-by-one。

  1. 嗯,我们都这样做¯\_(ツ)_/¯

  2. 在现代 GUI 编辑器中,文件底部看起来像额外的一行不太可能是额外的一行。它更有可能是第二种解释的产物。假设您在某种 Unix-like 系统上并且预期的 EOL 是 LF,您可以 $ xxd filename 以十六进制形式检查其内容:

    • 最后一个 a0 表示您的文件以 EOL 结尾,
    • 最后一个a0a0表示你的文件多了一个空行,
    • 末尾没有a0说明是坚定坚持第二种解释的编辑写的

    第二种情况会让你的 linter 生气:

    Error: EMPTY_LINE_EOF       (line:   7, col:   1):   Empty line at end of file
    

    但它似乎并不特别关心其他两种情况。

  3. 因为您在 GUI 编辑器中看到文件末尾的空行,这并不意味着 a) 该行实际存在并且 b) 您必须添加一个在 Vim 或任何其他编辑器中的文件末尾。

    正确的做法是:

    • 让 Vim 开箱即用,在最后写入带有 EOL 的文件,因为这是您的工具链(包括 Norminette)所期望的,
    • 设置你的 GUI 编辑器来做同样的事情(即使它们仍然显示那条假想的线),
    • 去掉你的一个项目中可能有的任何多余的空行,
    • 切勿在文件末尾添加无关的空行,因为它往好里说没用,往坏里说是禁止的。