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 问题流的秘诀。
所以……这似乎是这里发生的事情:
- 您正在混合使用以不同方式解释 EOL 的工具,
- 您对其中一种解释的理解有误,
- 然后你根据这种误解采取行动,结果令人困惑。
让我们解决这些问题 one-by-one。
嗯,我们都这样做¯\_(ツ)_/¯
。
在现代 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
但它似乎并不特别关心其他两种情况。
因为您在 GUI 编辑器中看到文件末尾的空行,这并不意味着 a) 该行实际存在并且 b) 您必须添加一个在 Vim 或任何其他编辑器中的文件末尾。
正确的做法是:
- 让 Vim 开箱即用,在最后写入带有 EOL 的文件,因为这是您的工具链(包括 Norminette)所期望的,
- 设置你的 GUI 编辑器来做同样的事情(即使它们仍然显示那条假想的线),
- 去掉你的一个项目中可能有的任何多余的空行,
- 切勿在文件末尾添加无关的空行,因为它往好里说没用,往坏里说是禁止的。
为什么 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 问题流的秘诀。
所以……这似乎是这里发生的事情:
- 您正在混合使用以不同方式解释 EOL 的工具,
- 您对其中一种解释的理解有误,
- 然后你根据这种误解采取行动,结果令人困惑。
让我们解决这些问题 one-by-one。
嗯,我们都这样做
¯\_(ツ)_/¯
。在现代 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
但它似乎并不特别关心其他两种情况。
- 最后一个
因为您在 GUI 编辑器中看到文件末尾的空行,这并不意味着 a) 该行实际存在并且 b) 您必须添加一个在 Vim 或任何其他编辑器中的文件末尾。
正确的做法是:
- 让 Vim 开箱即用,在最后写入带有 EOL 的文件,因为这是您的工具链(包括 Norminette)所期望的,
- 设置你的 GUI 编辑器来做同样的事情(即使它们仍然显示那条假想的线),
- 去掉你的一个项目中可能有的任何多余的空行,
- 切勿在文件末尾添加无关的空行,因为它往好里说没用,往坏里说是禁止的。