From efc9d4fe3ef256e6c546c1690bf7dd968f1fdac8 Mon Sep 17 00:00:00 2001 From: Alan Mackenzie Date: Sun, 16 Feb 2020 17:46:02 +0000 Subject: Amend c-backward-sws better to handle multiline block comments 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 | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/lisp/progmodes/cc-engine.el b/lisp/progmodes/cc-engine.el index 0964c04b899..0c338fa3868 100644 --- a/lisp/progmodes/cc-engine.el +++ b/lisp/progmodes/cc-engine.el @@ -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 -- cgit v1.2.1