【问题标题】:VSCode removing spaces with auto format (C/C++)VSCode 使用自动格式删除空格 (C/C++)
【发布时间】:2021-12-31 23:01:17
【问题描述】:

我最近迁移到 VSCode,我真的很喜欢自动格式化,但是如何配置它不删除空格?我有一种用于配置 GPIO 引脚的矩阵,我使用空格使其更具可读性,但一旦我保存并自动格式化,它就会破坏间距!

示例:

_InitIO(GPIOA, (GPIO_IN  | GPIO_DN                               ),  //  A0    IRQ-Mag
               (GPIO_IN  | GPIO_DN                               ),  //  A1
               (GPIO_AF7           | GPIO_PP | GPIO_HIGH | GPIO_1),  //  A2
               (GPIO_IN  | GPIO_UP                               ),  //  A3    Switch

变成:

_InitIO(GPIOA, (GPIO_IN | GPIO_DN),                //  A0    IRQ-Mag
                (GPIO_IN | GPIO_DN),                       //  A1
                (GPIO_AF7 | GPIO_PP | GPIO_HIGH | GPIO_1), //  A2
                (GPIO_IN | GPIO_UP),                       //  A3    Switch

我已经浏览了设置中的所有格式选项,但似乎找不到...

【问题讨论】:

    标签: c visual-studio-code code-formatting


    【解决方案1】:

    VSCode 在工作区目录中查找名为 .clang-format 的文件。见:https://code.visualstudio.com/docs/cpp/cpp-ide#_code-formatting

    要更改自动格式化样式,您必须创建 .clang-format 文件并根据 Clang-Format Style Options 进行修改。

    您可能必须关闭自动格式化或连续保存文件而不进行格式化,通过 Command Palette 或使用 Ctrl+K Ctrl+Shift+S 组合键使用文件:保存而不格式化命令。

    编辑

    看起来你想要Disable Formatting on a Piece of Code。它适用于 VSCode。

    【讨论】:

    • 谢谢,那么是否没有 clang 选项可以忽略这一点,或者检测这样的模式并执行它们?有点像如何让 cmets 块相互对齐,只要它们之间没有没有 cmets 的线?
    • 没问题!我还没有详尽地检查 Clang-Format 文档,但我怀疑是否存在可以准确地格式化代码的功能,因为第三行中 GPIO_AF7GPIO_PP 之间的间距是一个特殊情况。
    • 我确实在这里找到了类似问题的答案:stackoverflow.com/questions/38022831/…
    • 我不知道 // clang-format off,谢谢!这对我来说就足够了,因为我没有太多不需要格式化的代码。
    • 虽然不是我想要的完全,但关闭代码块的格式就足够了,这样它就不会炸毁我的桌子,我仍然可以使用自动格式化大多数东西。我会将此标记为答案。感谢您的帮助!
    【解决方案2】:

    另类

    避免代码艺术

    有时在代码中形成一个漂亮的表格很不错,但要保持这种状态是维护。有了好的软件,维护是最昂贵的部分,所以如果代码艺术很难用基本的自动格式化来维护,它的价值就会下降。只需要一位后续维护者就没有必要的自动格式设置来搞砸事情。

    避免使用标准自动格式设置难以保持的代码艺术。

    下面呢?我怀疑它会保持与 VS 的格式并足够接近 OP 的代码艺术。

      _InitIO(GPIOA, // 
          (GPIO_IN | GPIO_DN),                       //  A0 IRQ-Mag
          (GPIO_IN | GPIO_DN),                       //  A1
          (GPIO_AF7 | GPIO_PP | GPIO_HIGH | GPIO_1), //  A2
          (GPIO_IN | GPIO_UP)                        //  A3 Switch
          )
    

    【讨论】:

    • 当你可以用二进制常量分配寄存器时,为什么还要麻烦定义呢?因为它使它更易于使用。该代码是供我自己使用的,特别是为了使它对我来说更具可读性。我并不真正关心下一个人,如果我将它传递给使用标准自动格式化的其他人,他们会得到你发布的“足够好”的结果......我不明白为什么这是一件坏事在我这边做。它对我有用并且对我有帮助,尽管当我改变它时不得不每隔一段时间将所有东西排成一行。
    • @Matt 我同意你“不明白为什么这样做对我来说是一件坏事。”。
    • 超级有帮助...“嘿,医生,我一碰膝盖就疼!” “那就别碰它!”