help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: C++ Indentation and access-labels


From: Alan Mackenzie
Subject: Re: C++ Indentation and access-labels
Date: Fri, 18 Sep 2009 22:12:18 +0000
User-agent: Mutt/1.5.9i

Hi, Marc!

On Mon, Sep 14, 2009 at 04:27:11PM +0200, Marc Dürner wrote:
> Hello,

> I am trying to set up semantic indentation for C++ and can't find a way
> to configure the following indentation rule:

> class A
> {
>     friend class X;

>     int x;

>     public:
>         A();    <===========
>         ~A();   <===========
> };

> I want to have class members and friend declarations indented by one level
> if no access-label is present. If an acces-label is present it should be
> indented and the class members that follow that access-label should be
> indented further. It seems the is no way to handle class memers differently
> if they are following an access-label. In the example above 'x' and 'A();'
> are both classified as inclass/topmost-intro.

> Is there a way to configure this?

No.  There should be, though.  The first member after "public:" ought to
get a special syntactical symbol, say "protection-clause-intro", somewhat
analagous to "statement-block-intro", the first statement inside a
compound statement (brace block).  Maybe I'll fix this sometime.

(If the previous paragraph doesn't make sense, either ignore it or look
it all up on page "Syntactic Symbols" in the CC Mode manual.)

However, CC Mode is flexible enough for workarounds to be possible.  So,
for the meantime, here's a workaround.  Put the file below somewhere
convenient (I've called it ~/duerner.el; you probably want to byte
compile it), and add this line to your .emacs:

   (eval-after-load "cc-mode" '(load-file "~/duerner.el))
[ or ................................................elc)) ]

# File ~/duerner.el:
#########################################################################
(defsubst md-at-inclass/topmost-intro (sintax)
  (and
   (eq (caar sintax) 'inclass)
   (eq (car (cadr sintax)) 'topmost-intro)))

(defun md-ind-prot-class ()
  "Give an extra level of indentation to class thingies under an access
specifier, e.g.:

    public
        A();        <========== extra level of indentation.

This should really be properly implemented in CC Mode, but it's not."
  (and
   (md-at-inclass/topmost-intro c-syntactic-context)
   (let (m-type)
     (when
         (save-excursion
           (back-to-indentation)
           ;; Go back one "statement" at a time till we reach a label or 
something
           ;; which isn't an inclass/topmost-intro
           (while
               (and (eq (setq m-type (c-beginning-of-statement-1)) 'previous)
                    (md-at-inclass/topmost-intro (c-guess-basic-syntax))))
           ;; Have we found "private:", "public": or "protected"?
           (and (eq m-type 'label)
                (looking-at
                 (eval-when-compile
                  (c-make-keywords-re nil (c-lang-const c-protection-kwds 
c++))))))
       (save-excursion
        (back-to-indentation)
        (c-shift-line-indentation c-basic-offset))))))

(defun md-add-hook ()
  (add-hook 'c-special-indent-hook 'md-ind-prot-class))
(add-hook 'c++-mode-hook 'md-add-hook)
#########################################################################

The above is a fairly rough and ready hack.  If it does something silly,
please get back to me with a description of the failure.


> regards,
> Marc

Sincerely,

-- 
Alan Mackenzie (Nürnberg).




reply via email to

[Prev in Thread] Current Thread [Next in Thread]