Emacs - 覆盖缩进

27

我有一个多层嵌套的命名空间:

namespace first {namespace second {namespace third {
              // emacs indents three times
    // I want to intend here
} } }

Emacs默认缩进到第三个位置。但是我只想要一个单独的缩进。
有没有简单的方法可以实现这个效果?

6个回答

27

在命名空间内使用绝对缩进列:

(defconst my-cc-style
  '("gnu"
    (c-offsets-alist . ((innamespace . [4])))))

(c-add-style "my-cc-style" my-cc-style)

然后使用c-set-style使用自己的样式。

请注意,这仅在c++-mode中有效,c-mode不知道'innamespace'。


它在c++-mode中可以工作,但在从Emacs29出现的c++-ts-mode中无法工作。是否有c++-mode的c-set-style对应项? - hao li

20

在 Emacs 23 中的 c++-mode 下,我需要这样做:

(defun my-c-setup ()
   (c-set-offset 'innamespace [4]))
(add-hook 'c++-mode-hook 'my-c-setup)

要完全禁用命名空间中的缩进,请将[4]更改为0。


这个方法适用于我的Emacs 24.5.1版本(使用innamespace [0]),而被接受的答案却不行。 - AlwaysLearning
2
比被接受的解决方案要好得多,因为它不需要你去搞乱你正在使用的实际样式(并且没有告诉你如何操作)。被接受的答案对我没用,但这个可以。 - GreenAsJade

4

好的,至少在Emacs 21和22中似乎都可以工作:

(defun followed-by (cases)
  (cond ((null cases) nil)
        ((assq (car cases) 
               (cdr (memq c-syntactic-element c-syntactic-context))) t)
        (t (followed-by (cdr cases)))))

(c-add-style  "foo"      
              `(( other . personalizations )
        (c-offsets-alist
         ( more . stuff )
         (innamespace
          . (lambda (x) 
          (if (followed-by 
               '(innamespace namespace-close)) 0 '+))))))

第一种解决方案不支持像

构造这样的东西
namespace X { namespace Y {
    class A;
    namespace Z {
        class B;
    }
}}

)


1

这对我有用,继承自cc-mode并将命名空间缩进替换为0,即禁用它的缩进。

(defconst my-cc-style
  '("cc-mode"
    (c-offsets-alist . ((innamespace . [0])))))

(c-add-style "my-cc-mode" my-cc-style)

几个问题:您如何确保 my-cc-mode 基于您之前选择的 C 风格,并如何激活它? - GreenAsJade
1
通过以下钩子激活它:(add-hook 'c++-mode-hook (lambda () (c-set-style "my-cc-style") )) - Jiejing Zhang
有没有一种方法可以以现有的样式为基础创建一个新样式?我希望我的样式像BSD一样,但不带命名空间缩进。 - Joseph Garvin

1
如果你只想输入一个字面上的制表符,而不是改变emacs的缩进方案,C-q TAB 应该可以起作用。

1

很遗憾,我认为emacs没有单独为嵌套命名空间设置样式。如果您进入内部行并执行C-c、C-o,您可以更改最顶层的intro样式,如果您运行customize-variable c-offsets-alist,您可以编辑emacs具有的所有不同缩进选项,但是不存在适用于您特定用例的选项。您需要在elisp中手动编写它。


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