【问题标题】:Emacs indentation with sequential parenthesis in C++在 C++ 中带有顺序括号的 Emacs 缩进
【发布时间】:2019-11-13 20:11:02
【问题描述】:

顺序括号上的 Emacs 自动缩进不能正常工作:

int main() {
    something(int i)(
        "test", "something"
                    );
}

如何将此缩进修复为像正常缩进一样:

int main() {
  something(int i)(
      "test", "something"
  );
}

主要模式信息:

  • major-mode 是在“C 源代码”中定义的变量。
  • 其值为‘c++-mode’

解决方案

谢谢@pickle rick 和@0x5453,

(c-add-style "cc-style"
         '("linux"  ;; it can be google or k&r or other c-style.
           (c-basic-offset . 2)
           (c-offsets-alist
        (arglist-close . c-lineup-close-paren))))
(add-hook 'c++-mode-hook
      (lambda()
        (c-set-style "cc-style")))

【问题讨论】:

  • @phils major-mode 是在“C 源代码”中定义的变量。其值为‘c++-mode’ 原始值为 basic-mode
  • 检查c-offsets-alist'arglist-close的值。我的设置为+cc-lineup-arglist-close,这似乎与您正在寻找的行为相匹配。 (虽然根据该函数的描述,它似乎应该表现得像你的第一个例子,所以可能会有更多的事情发生。)
  • @0x5453 请告诉我如何获取这些变量的值?
  • @0x5453 它显示:c-offsets-alist is a variable defined in ‘cc-vars.el’. Its value is nil.
  • @mortezaipo 您可以使用C-h v c-offsets-alist,然后手动搜索arglist-close。或者M-S-z (assq 'arglist-close c-offsets-alist)直接获取值。请注意,c-offsets-alist 是缓冲区本地的,并且仅在您处于基于 C 的模式之一时设置,因此在您的情况下,您必须从当前位于 c++-mode 的缓冲区中检查它。

标签: c++ emacs indentation


【解决方案1】:

cc-mode 能够根据缓冲区中的缩进智能猜测您想要的c-offsets-alist 的设置。为此,请根据需要对齐缓冲区中的代码,然后计算 M-xc-guess

缩进缓冲区,假设它看起来没问题,你可以用 M-xc-guess-view 看到猜测的设置。然后,您可以将整个样式复制到您的 init 中的某个位置,或者挑选相关设置。

此外,您可以通过运行 M-xc-show-syntactic-information 并将点定位在那里来了解哪些规则适用于给定行。但是请注意,这不会提供所有相关信息,因为其他规则/样式会相互影响,但会告诉您将 arglist-close 识别为示例中的相关规则。

【讨论】:

  • 谢谢,当我启用c-guess 时它工作正常,但是当我将c-guess-view 结果复制到emacs 配置中时,在下次重新启动时它不再工作。如何在 Emacs 启动中运行 c-guess?这也是个好主意吗?
  • 不,不要在你的 init 中调用 c-guess -- 给样式命名并在你的 c++-mode-hook 中调用 (c-set-style "your-style")
  • @mortezaipo 如果你只定义arglist-close,你也可以考虑在你的钩子中使用(c-set-offset 'arglist-close 'c-lineup-close-paren)
  • 现在,一切正常,但我的 google 编码风格不能正常工作:D 你知道我怎样才能只覆盖这个属性吗?
  • 我找到了:D,我应该把“linux”改成“google”。现在,它完美运行!
猜你喜欢
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多