1

最简单的:

最初的问题归结为:

许多(如果不是大多数)emacs c 缩进样式自己在一行上进行注释,例如

// ...

缩进以匹配周围的代码。

我想让看起来像 //+ 或 //- 的注释比周围的代码缩进一个或多个缩进设置。

我通常认为相同缩进级别的注释适用于下一行代码,而额外缩进级别的注释适用于前面的代码行。但这只是风格。

简短的:

是否有(合理的标准)emacs 设置来获得 C/C++ 注释的不同缩进,这取决于注释是否与下一行相关联(在这种情况下,我希望它为语法适当缩进)或注释是否与上一行(在这种情况下,我希望它缩进一个额外的级别)?

例如

int
foo() 
{
     // this comment is for the variable bazz below
     int bazz;
         //- this comment is for the variable bazz,on the line above.
         //- I want it indented an extra level, which I will do by hand here.

     // this comment is for the next variable, biff
     int biff;

     int example; /* comment
               * on multiple lines
               * but this can be too much indented
               */

     int example_of_a_really_long_name_that_can_produce_excessive_indentation; /* comment
                                            * on multiple lines
                                            * but this can be too much indented
                                            */

}

以//和//-开头的评论几乎是我想要的。// 与周围的代码一起缩进。这就是emacs给我的。

我希望 //- 缩进一个额外的缩进级别。或者 //+,或者其他,如果有约定的话。听起来像是一个正则表达式的工作。

我提供了我知道如何处理 // 和 / 的示例。/注释分散在多行中,但可以过度缩进。

细节:

我现在正在安装 emacs 24.1 - 或者至少我希望我正在安装它,工作中的系统有非常老旧的发行版。但是,如果某些东西适用于较旧的 emacs,例如 21.4.1,我会更高兴 - 避免必须在许多不同系统上安装 emacs 的麻烦。

=================================

顺便说一句,我已经知道 c-indent-comment-syntactically 和 cc-mode.el 的大部分内容。

特别是,c-indent-comment-syntactically 给了我:

int
foo()
{
  // this comment is for the variable bazz below
  int bazz;
  //- this comment is for the variable bazz,on the line above.
  //- I want it indented an extra level, which I will do by hand here.

  // this comment is for the next variable, biff
  int biff;

  int example; /* comment
            * on multiple lines
            * but this can be too much indented
            */

  int example_of_a_really_long_name_that_can_produce_excessive_indentation; /* comment
                                             * on multiple lines
                                             * but this can be too much indented
                                             */

  if( foo )
    // comment
    bar();

  if( foo ) {
    // comment
    bar();
  }

}

这不是我想要的。我希望 //- 注释行缩进一个额外的缩进级别。

哎呀,为什么不喜欢elisp:

/// <-- 从第 0 列开始

// 语法缩进(与下一行代码有关)

或者可能是 //^(^ 表示“以上”。

//- 或 //^ - 缩进一个额外的缩进级别(与前一行代码有关。

4

2 回答 2

2

嗯,你试过设置这个吗?

— 用户选项:c-indent-comments-syntactically-p

通常,当这个样式变量为 nil 时,M-;将根据 c-indent-comment-alist 缩进仅注释行,就像其他代码在注释之前的行一样。但是,如果您希望它像只用于注释的行一样,您可以通过将 c-indent-comments-syntactically-p 设置为非零来实现。

如果 c-indent-comments-syntactically-p 不为零,则根本不会咨询 c-indent-comment-alist 以获取仅注释行。

于 2012-07-13T19:32:43.720 回答
2

因此,如果我了解您想要什么,您只需要能够基于某个标记添加一层额外的缩进。这完全可以通过使用您自己的阵容功能来实现,您可以在“CC 模式”手册中找到更多信息- 具体请查看以下部分:

(ccmode) 阵容功能

这是自定义阵容功能,它检查注释是否以您的特殊序列开头(我使用//+),如果是这样,它会添加一个额外的级别(返回加号)。否则,我们忽略它并将其视为注释通常是缩进的(返回 nil)。正如您可能想象的那样,使用阵容功能,我们可以随心所欲地变得棘手 - 例如多个令牌或嵌套级别。

(defun brian-comment-offset (langelem)
  (save-excursion
    (back-to-indentation)
    (cond 
      ((re-search-forward (regexp-quote "//+") (point-at-eol) t)
       '+)
      (t
       nil))))

要使用它,您需要设置偏移别名变量comment-intro来运行该函数。我通过创建自己的 c 样式来做到这一点,如下所示。我建议你复制你当前的风格,只修改/添加评论介绍列表。

(c-add-style 
 "briancpp" '((c-basic-offset . 2)
        (c-comment-only-line-offset . 0)
        (c-offsets-alist
         (comment-intro . brian-comment-offset)  ; Here's our workhorse
         (defun-open . 0)
         (defun-close . 0)
         (statement-block-intro . +)
         (substatement-open . 0)
         (substatement-label . 0)
         (label . 0)
         (statement-cont . +)
         (inline-open . 0)
         (inline-close . 0)
         (innamespace . 0))))

(add-hook 'c++-mode-hook (lambda () 
               (c-set-style "briancpp")))

下面是它在行动中的样子:

CC 模式额外缩进截图

于 2012-07-14T13:10:04.160 回答