[英]Proper C++ indentation in Emacs: classes and structs
我一直在尋找其他答案,例如emacs: different indentation for class 和 struct ,建議的答案似乎都不適合我。 這是我的 header 文件:
// my_header
namespace foo
{
template<typename T>
class ResizablePoolAllocator
{
static_assert(sizeof(T) >= sizeof(void*)); // 'brace-list-intro
public:
inline T* Alloc() { return (T*)_alloc(); } // 'brace-list-entry
inline void Free(T* ptr) { _free(ptr); } // 'brace-list-entry
private:
void* _alloc(); // 'brace-list-entry
void _free(void* ptr); // 'brace-list-entry
};
}
在兩個標簽public
和private
之后的 function 聲明中,縮進應該用'tab-width
縮進。 這是 init 文件的相關部分:
(defun my-cpp-common-mode-hook ()
(c-set-offset 'substatement-open 0)
(c-set-offset 'inline-open 0)
(c-set-offset 'comment-intro 0)
(c-set-offset 'defun-block-intro 'tab-width)
(c-set-offset 'statement-block-intro 'tab-width)
(c-set-offset 'substatement 'tab-width)
(c-set-offset 'topmost-intro 0)
(c-set-offset 'statement-cont 'tab-width)
(c-set-offset 'func-decl-cont 0)
(c-set-offset 'brace-list-open 0)
(c-set-offset 'brace-list-intro 'tab-width)
(c-set-offset 'brace-list-entry 0)
;; EXPERIMENTAL:
;;(c-set-offset 'arglist-intro 'c-lineup-arglist-intro-after-paren)
(c-set-offset 'arglist-intro 'tab-width)
)
(add-hook 'c++-mode-hook
(lambda ()
(setq indent-tabs-mode t)
(setq tab-width 4)
(setq c-basic-offset 4)
(highlight-doxygen-mode t)
)
)
(add-hook 'c++-mode-hook 'my-cpp-common-mode-hook)
不幸的是,我不能只插入(c-set-offset 'brace-list-entry 'tab-width)
,因為這會遞歸地額外縮進所有具有此標記的行。
我想我需要這樣的東西:
;; PSEUDOCODE
(setq 'brace-list-entry (if (= previous-line brace-list_entry) 0 'tab-width)
但我不知道如何做到這一點/如果它甚至可以使用"GNU Emacs 27.1"
。 有什么建議么?
我有一個多年前一起修補過的設置,從那以后就沒有真正接觸過。 我在您的樣品上松開了它,結果如下:
namespace foo
{
template<typename T>
class ResizablePoolAllocator
{
static_assert(sizeof(T) >= sizeof(void*)); // 'brace-list-intro
public:
inline T* Alloc() { return (T*)_alloc(); } // 'brace-list-entry
inline void Free(T* ptr) { _free(ptr); } // 'brace-list-entry
private:
void* _alloc(); // 'brace-list-entry
void _free(void* ptr); // 'brace-list-entry
};
}
完整風格的機器如下所示:
(defconst my-c-style
'((c-recognize-knr-p . nil)
(c-tab-always-indent . t)
(c-basic-offset . 4)
(c-comment-only-line-offset . 0)
(c-hanging-braces-alist . ((block-close . c-snug-do-while)
(brace-entry-open)
(brace-list-close)
(brace-list-open after)
(brace-list-intro)
(class-open after)
(class-close before)
(extern-lang-open after)
(inexpr-class-open after)
(inexpr-class-close before)
(inline-open after)
(inline-close before)
(statement-cont)
(substatement-open after)))
(c-hanging-colons-alist . ((member-init-intro before)
(inher-intro)
(case-label after)
(label after)
(access-label after)))
(c-cleanup-list . (scope-operator
empty-defun-braces
defun-close-semi))
(c-offsets-alist . ((access-label . -)
(brace-list-close . 0)
(brace-list-entry . 0)
(brace-list-intro . +)
(class-close . 0)
(class-open . 0)
(defun-block-intro . +)
(defun-close . 0)
(defun-open . 0)
(inclass . +)
(label . 0)
(statement . 0)
(statement-cont . *)
(topmost-intro-cont . 0)
(arglist-close . c-lineup-arglist)
(block-open . 0)
(case-label . +)
(func-decl-cont . c-lineup-java-throws)
(inexpr-class . 0)
(inher-cont . c-lineup-java-inher)
(inline-open . 0)
(substatement-open . 0)
(innamespace . 0)
))
(c-echo-syntactic-information-p . t))
"My C Programming Style")
;; Offset customizations not in my-c-style
(setq c-offsets-alist '((member-init-intro . ++)))
;; Customizations for all modes in CC Mode.
(defun my-c-mode-common-hook ()
;; add my personal style and set it for the current buffer
(c-add-style "PERSONAL" my-c-style t)
;; other customizations
(setq tab-width 4)
;; we like auto-newline and hungry-delete
(c-toggle-auto-hungry-state 1)
;; keybindings for all supported languages. We can put these in
;; c-mode-base-map because c-mode-map, c++-mode-map, objc-mode-map,
;; java-mode-map, idl-mode-map, and pike-mode-map inherit from it.
(define-key c-mode-base-map "\C-m" 'newline-and-indent)
(define-key c-mode-base-map "\M-a" 'backward-sexp)
(define-key c-mode-base-map "\M-e" 'forward-sexp)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
(setq c++-mode-hook
'(lambda ()
(font-lock-mode 1)
))
(setq java-mode-hook
'(lambda ()
(font-lock-mode 1)
))
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.