[comp.emacs] c++ mode bugs & quibbles

gjditchfield@rose.UUCP (05/27/87)

I am mostly pleased with the C++ mode that was posted here recently, but I
did have a few problems. (If it matters, we use gnu version 17.64.)

Creating a new buffer and typing
if ( c ) {
    switch ( i ) {
        case 1:
produced a "search failed: ":[^:]"" message when the ":" was typed.
Apparently a re-search-forward call was failing when it hit the end of the
buffer.

Typing ESC-; on a line like
	something = something_else;	// some comment
did not reposition the comment at the comment column like C mode
does; it always moved the comment one column right.

C++-mode outdents "public", "private", and "protected" labels and the "case"
arms of switch statements by (- c-indent-level) columns, instead of using
c-label-offset. I like to have them indented just like branch labels, and
in my case, c-label-offset != - c-indent-level. I altered the lisp code
accordingly. The "old" style can be imitated (except for the difference
between "private" and branch labels) by
	(setq c-label-offset (- c-indent-level)).

"friend class" declarations are also outdented by (- c-indent-level) in C++
mode. I like them indented just like members. I decided to add a constant
to control friend class indentation. It's default value gives the same
behavior as the "old" C++ mode.

Here's the output of "diff old-version new-version".
------- cut here. (check for a .signature too) --------
57a58,59
> (defconst c++-friend-offset -4
>   "*Offset of C++ friend class declarations relative to member declarations.")
144c146
<   (let ((cur-col (current-column)))
---
>   (let (cur-col)
146,147c148,150
<       (forward-line -1)
<       (end-of-line 1)
---
>       (skip-chars-backward " \t")
>       (setq cur-col (current-column))
>       (end-of-line 0)
151d153
< 	  (progn (match-beginning 0)
153,158c155,157
< 		     (max (1+ cur-col) (current-column))))
< 	  ; Else indent at comment column, except leave at least one space.
< 	  (forward-line 1)
< 	  (end-of-line 1)
< 	  (skip-chars-backward " \t")
< 	  (max (1+ cur-col) comment-column)))))
---
> 		   (max (1+ cur-col) (current-column)))
> 	; Else indent at comment column, except leave at least one space.
> 	(max (1+ cur-col) comment-column)))))
256,257c255,258
< 		  (setq indent (- indent c-indent-level)))
< 		 ((and (looking-at "[A-Za-z]")
---
> 		;  (setq indent (- indent c-indent-level)))
> 		  (setq indent (+ indent c-label-offset)))
> 		 ((or (looking-at "case\\b")
> 		      (and (looking-at "[A-Za-z]")
260c261
< 			 (looking-at ":[^:]")))
---
> 			 (looking-at ":[^:]"))))
262,263c263,264
< 		 ((looking-at "case\\b")
< 		  (setq indent (- indent c-indent-level)))
---
> ;		 ((looking-at "case\\b")
> ;		  (setq indent (- indent c-indent-level)))
269c270,271
< 		  (setq indent (- indent c-indent-level)))
---
> 		  (setq indent (+ indent c++-friend-offset)))
> ;		  (setq indent (- indent c-indent-level)))
371c373
< 			    (re-search-forward ":[^:]"))))
---
> 			    (re-search-forward ":[^:]" nil 'move))))
-- 
Glen Ditchfield                      {watmath,utzoo,ihnp4}!watrose!gjditchfield
Dept of Computer Science, U of Waterloo         (519) 885-1211 x6658
Waterloo, Ontario, Canada			   Office: MC 2006
If you grab the bull by the horns, you at least confuse him -- R.A.Heinlein