让Emacs的访问标签缩进增加一个缩进级别

4
我在查看这个问题时,发现我有一个类似的问题,在那里没有得到充分的解答。
我想让访问说明符添加一个缩进级别。在这个页面这个页面上,我发现需要缩进的语法符号是access-label。因此,我需要使用(c-set-offset 'access-label'0)
然而,这只会缩进包含访问标签的行,而不是之后的任何内容。我得到的是这样的,
class foo {
  public:
  void someFunc(); // Doesn't take the indentation of the access label into account
  ...
  };

What I want is,

class foo {
  public:
    void someFunc();
  ...
  };

我应该如何做?我需要修改其他变量吗?
2个回答

1
如果您将大括号放在新行上,则上述解决方法并不完全正确。您必须检查第一个goto之后是否位于开放括号之前。这是我更通用的解决方法:

(defun agb/c++-mode-hook ()
  (c-set-offset 'access-label '-)
  (c-set-offset 'topmost-intro '0)
  (c-set-offset 'inclass '(lambda (arg)
                            (let ((inclass (assoc 'inclass c-syntactic-context)))
                              (save-excursion
                                (goto-char (c-langelem-pos inclass))
                                (if (looking-at "{")
                                    (goto-char (c-langelem-pos (assoc 'class-open (c-guess-basic-syntax)))))
                                (if (or (looking-at "struct")
                                        (looking-at "typedef struct"))
                                    '+
                                  '++))))))

1

您需要使用inclass来设置类中函数和成员的缩进。但是这将导致结构体中的函数和成员缩进2个制表符,而不是一个,因此我们需要有一个特殊的函数来设置正确的缩进宽度。我正在使用以下配置来实现这一点(我从互联网上某个地方获取了片段,可能来自emacswiki)...


1
很不幸的是,没有更直接的方法来完成这个任务。我想缩进访问标签应该经常出现。 - namzug
1
对于类,配置很简单,但对于结构体,我们需要做一些技巧 :-( - Alex Ott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接