簡體   English   中英

Emacs 中正確的 C++ 縮進:類和結構

[英]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
    };
}

在兩個標簽publicprivate之后的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM