]> git.eshelyaron.com Git - emacs.git/commitdiff
Amend c-backward-sws better to handle multiline block comments
authorAlan Mackenzie <acm@muc.de>
Sun, 16 Feb 2020 17:46:02 +0000 (17:46 +0000)
committerAlan Mackenzie <acm@muc.de>
Sun, 16 Feb 2020 17:46:02 +0000 (17:46 +0000)
In particular, multiline comments lacking escaped newlines.

* lisp/progmodes/cc-engine.el (c-backward-sws): Whilst searching backward for
a putative beginning of macro, move back over block comments whose innards
lack escaped newlines.

lisp/progmodes/cc-engine.el

index 0964c04b8992d69694d6703e29e5401e4ce3ee76..0c338fa38686d9dcaf56739c3bcdd2b2f2d241f3 100644 (file)
@@ -327,6 +327,8 @@ comment at the start of cc-engine.el for more info."
          (when (or (null lim)
                    (>= here lim))
            (save-match-data
+             ;; Note the similarity of the code here to some in
+             ;; `c-backward-sws'.
              (while
                  (progn
                    (while (eq (char-before (1- (point))) ?\\)
@@ -2461,17 +2463,34 @@ comment at the start of cc-engine.el for more info."
                   (/= cmt-skip-pos simple-ws-beg)
                   (c-beginning-of-macro))
              ;; Inside a cpp directive.  See if it should be skipped over.
-             (let ((cpp-beg (point)))
+             (let ((cpp-beg (point))
+                   pause pos)
 
-               ;; Move back over all line continuations in the region skipped
-               ;; over by `c-backward-comments'.  If we go past it then we
-               ;; started inside the cpp directive.
+               ;; Move back over all line continuations and block comments in
+               ;; the region skipped over by `c-backward-comments'.  If we go
+               ;; past it then we started inside the cpp directive.
                (goto-char simple-ws-beg)
                (beginning-of-line)
-               (while (and (> (point) cmt-skip-pos)
-                           (progn (backward-char)
-                                  (eq (char-before) ?\\)))
-                 (beginning-of-line))
+               ;; Note the similarity of the code here to some in
+               ;; `c-beginning-of-macro'.
+               (setq pause (point))
+               (while
+                   (progn
+                     (while (and (> (point) cmt-skip-pos)
+                                 (progn (backward-char)
+                                        (eq (char-before) ?\\)))
+                       (beginning-of-line))
+                     (setq pos (point))
+                     (when (and c-last-c-comment-end-on-line-re
+                                (re-search-forward
+                                 c-last-c-comment-end-on-line-re pause t))
+                       (goto-char (match-end 1))
+                       (if (c-backward-single-comment)
+                           (progn
+                             (beginning-of-line)
+                             (setq pause (point)))
+                         (goto-char pos)
+                         nil))))
 
                (if (< (point) cmt-skip-pos)
                    ;; Don't move past the cpp directive if we began inside