【问题标题】:What does Visual Studio mean by normalize inconsistent line endings?Visual Studio 规范化不一致的行尾是什么意思?
【发布时间】:2010-10-07 21:38:23
【问题描述】:

Visual Studio 偶尔会告诉我:

以下文件中的行尾不一致。你想规范化行尾吗?

然后它会给我一个带有不同标准或其他东西的下拉列表,例如 Windows、Mac、Unix 和几个 Unicode 标准。

这是什么意思,如果我点击Yes会发生什么?

【问题讨论】:

  • Visual Studio 向我显示了同样的消息,但它所指的“文件”实际上是一个文件夹!这是什么意思?!
  • 我做了一个小实用程序来对整个目录执行此操作,或者通过一组目录递归地执行特定扩展名的所有文件(如 *.c 或 *.h),尽管我使用 Delphi,该实用程序适用于任何 Windows 源代码文件。源代码包括加二进制(exe)。它将报告哪些行有额外的换行符(即缺少回车符)或额外的回车符(即缺少换行符)。 docs.google.com/file/d/0B07SrKpE8ErmbHZ1SWkxT3RLczA/…
  • 可能是由git 引起的。另见:stackoverflow.com/questions/170961/…
  • 他们应该在下拉菜单中有一个选项,上面写着“从文件/项目的其余部分中选择最常用的行尾类型”。

标签: visual-studio line-endings


【解决方案1】:

这通常意味着您的行结尾不是回车/换行对。当您从网页复制并粘贴到代码编辑器中时,通常会发生这种情况。

规范化行尾只是确保所有行尾字符一致。它可以防止一行以\r\n 结尾,而另一行以\r\n 结尾;第一个是 Windows 行尾对,而其他通常用于 Mac 或 Linux 文件。

由于您是在 Visual Studio 中进行开发的,因此您显然希望从下拉列表中选择“Windows”。 :-)

【讨论】:

  • 没有回车怎么行结束...?
  • 那么为什么翻转 Visual Studio 会关心线条如何结束,它显然可以识别所有不同的类型,它应该只是高兴并闭嘴。
  • 啊,但是如果你只是使用 VS 来修复一些不适合 Windows 的东西呢?快速修复 Linux 实用程序或直接 C/C++ 的东西,并且您不想添加 CRLF?等等——现在你想让 MS 读懂你的想法并知道使用哪个? 无论哪种方式,VS 团队都是错误的,不是吗?嘘!
  • Oh snap Ken,你说得对,如果我碰巧正在编辑一些我打算在 Linux 中编译的文件,我知道如果编译器没有确切的行,它就会窒息而死它需要的结局然后我会很高兴 VS 让我选择......谢谢!
  • 问题不在于 VS 不能处理 Unix 行尾——它可以。警告告诉您行尾是inconsistent - 即文件中的一些行是CRLF,一些是LF。 VS 会处理这个问题,但你的工具链中的其他应用程序可能不会,因此它会警告你。如果您不关心这一点,请关闭警告:选项 -> 环境 -> 文档 -> '检查加载时是否一致的行尾'。如果您正在跨多个平台开发产品,此警告可能非常有用。
【解决方案2】:

有些行以\n结尾。

其他一些行以\r\n结尾。

Visual Studio 建议您使所有行都以相同的结尾。

【讨论】:

    【解决方案3】:

    如果您使用的是 Visual Studio 2012:

    转到菜单 文件高级保存选项 → 选择 行尾 类型为 Windows (CR LF) .

    【讨论】:

    • 我的 Visual Studio 2010 Ultimate 版本 10.0.40219.1 SP1Rel 的文件菜单上没有显示该选项。
    • @DOK,在我的 Visual Studio 2010 高级版的文件菜单上它可以!
    • 如果您看不到该选项,您可以通过转到工具->自定义,转到命令选项卡并添加命令来自定义文件菜单。
    • 是否有一个通用设置会同时影响所有文件?对解决方案下的所有来源执行此操作很痛苦。
    【解决方案4】:

    要打开/关闭该选项,请从 菜单 栏中执行以下步骤:

    工具选项环境文档在加载时检查一致的行尾

    【讨论】:

      【解决方案5】:

      您正在编辑的文件已使用其他不使用相同行尾的编辑器进行编辑,导致文件具有混合行尾。

      用于行尾的 ASCII 字符是:

      CR,回车
      LF,换行

      Windows = CRLF
      Mac OS 9 或更早版本 = CR
      Unix = LF

      【讨论】:

        【解决方案6】:

        维基百科newline article 可能会帮助您。摘录如下:

        不同的换行约定经常导致文本文件在 不同类型的系统显示不正确。例如,源自于 Unix 或 Apple Macintosh 系统在某些运行在 微软Windows。相反,当查看源自 Windows 计算机的文件时, Unix 系统中,额外的 CR 可能显示为 ^M 或在每行的末尾或显示为 第二个换行符。

        【讨论】:

          【解决方案7】:

          这意味着,例如,您的某些文本行带有 <Carriage Return><Linefeed>(Windows 标准),而有些则仅以 <Linefeed>(Unix 标准)结尾。

          如果您单击“是”,源文件中的这些行尾将被转换为具有所有相同的格式。

          这不会对编译器产生任何影响(因为行尾仅算作空格),但它可能会对其他工具产生一些影响(例如版本控制系统上的“差异”)。

          【讨论】:

            【解决方案8】:

            当您从网络复制粘贴某些内容时,您可能会得到不一致的行尾。
            为了解决这个问题,您可以使用 Visual Studio 扩展“行尾统一器”,它可以在保存文件时自动使行尾一致。

            【讨论】:

            • 仅供参考,这是 VS 2019 的已弃用插件。
            【解决方案9】:

            不仅仅是 Visual Studio...它是任何读取文件、编译器、链接器等的工具,必须能够处理它。

            通常(对于软件开发)我们接受多平台行尾问题,但让版本控制软件处理它。

            【讨论】:

            • 我同意。最好让你的单片机系统来做。如果您使用的是 svn,另请参阅 stackoverflow.com/questions/15687/…
            • 完全同意。如果我正在处理一个项目并且我在 Windows 上,而我的队友正在使用 Mac,会发生什么情况。我们将不断地将 CR 更改为 CRLF 并再次更改。最好让 SCM 将其抽象出来。大多数答案只是假设人们是在自己工作,或者每个编写代码的人都在使用 Windows。
            【解决方案10】:

            换行符也称为换行符换行符(EOL)换行符是一个控制字符或字符编码规范(例如 ASCII 或 EBCDIC)中的控制字符序列,用于表示一行文本的结束和新行的开始。当您按下 Enter 键 时,一些文本编辑器会设置/实现此特殊字符。

            回车换行字符是行尾的 ASCII 表示 (EOL)。他们将结束一个字符串的当前行,并开始一个新的。

            但是,在操作系统级别,它们的处理方式不同:

            • 回车(“CR”)字符(ASCII 13\0x0D,\r):将光标移动到行首而不前进到下一行。该字符在 Commodore 和早期 Macintosh 操作系统(Mac OS 9 及更早版本)中用作换行符。

            • 换行(“LF”)字符(ASCII 10\0x0A,\n):将光标向下移动到下一行,而不返回到行首。此字符在基于 Unix 的系统(Linux、macOS X、Android 等)中用作换行符。

            • 回车换行(“CRLF”)字符(0x0D0A,\r\n):这实际上是两个 ASCII 字符,是 CR 和 LF 字符的组合。它将光标向下移动到下一行和该行的开头。此字符在大多数其他非 Unix 操作系统(包括 Microsoft Windows 和 Symbian OS)中用作换行符。

            在 Visual Studio 中标准化不一致的行尾意味着选择一种字符类型用于所有文件。可能是:

            • 回车换行符(“CRLF”)
            • 换行(“LF”)字符
            • 回车(“CR”)字符

            但是,您可以使用根目录中的 .gitattributes 文件以更好的方式进行设置,以避免将文件从一个操作系统移动到另一个操作系统时发生冲突。

            只需在应用程序的根目录中创建一个名为 .gitattributes 的新文件:

            touch .gitattributes
            

            并在其中添加以下内容:

            # Enforce Unix newlines
            * text=auto eol=lf
            

            这会强制 Unix 换行行结束字符。

            注意:如果这是一个已经存在的项目,只需运行此命令即可使用 .gitattributes 中指定的新定义的行结尾更新应用程序的文件。

            git rm --cached -r .
            git reset --hard
            

            就是这样。

            我希望这会有所帮助

            【讨论】:

              【解决方案11】:

              Visual Studio 2008 有一个插件,可以在保存文件时转换行尾格式。你可以在这里下载:http://grebulon.com/software/stripem.php

              【讨论】:

              • 当您从 svn 收到“行尾不一致”错误时,这会有所帮助。
              【解决方案12】:

              我在 VS 2019 中遇到了这个问题,并通过在为 Unix 设置之前为 Windows 设置 LineBreak 配置来解决它。

              Tools > Options > Format on Save > Settings > LineBreak: Windows

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-12-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-08
                • 1970-01-01
                相关资源
                最近更新 更多