]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow line comments ending with escaped NL to be continued to the next line.
authorAlan Mackenzie <acm@muc.de>
Mon, 28 Dec 2015 16:01:05 +0000 (16:01 +0000)
committerAlan Mackenzie <acm@muc.de>
Mon, 28 Dec 2015 16:01:05 +0000 (16:01 +0000)
Use this in C, C++, and Objective C Modes.  Fixes bug#22246

* src/syntax.c (comment-end-can-be-escaped): New buffer local variable.
(forw-comment, back-comment): On encountering an end of comment character,
test whether it is escaped when `comment-end-can-be-escaped' is non-nil.

* doc/lispref/syntax.texi (Control Parsing): Describe
`comment-end-can-be-escaped'.

* etc/NEWS (Lisp Changes): Describe `comment-end-can-be-escaped'.

* lisp/progmodes/cc-langs.el: New c-lang-setvar `comment-end-can-be-escaped'.

doc/lispref/syntax.texi
etc/NEWS
lisp/progmodes/cc-langs.el
src/syntax.c

index 7a984e3d87b4d88f55d5f279f138ef94b21b339a..831ebd12f55f93e2f5eb6870e8411a0d958fe147 100644 (file)
@@ -945,6 +945,14 @@ whitespace by the functions in this section and by @code{forward-sexp},
 The behavior of @code{parse-partial-sexp} is also affected by
 @code{parse-sexp-lookup-properties} (@pxref{Syntax Properties}).
 
+@defvar comment-end-can-be-escaped
+If this buffer local variable is non-@code{nil}, a single character
+which usually terminates a comment doesn't do so when that character
+is escaped.  This is used in C and C++ Modes, where line comments
+starting with @samp{//} can be continued onto the next line by
+escaping the newline with @samp{\}.
+@end defvar
+
 You can use @code{forward-comment} to move forward or backward over
 one comment or several comments.
 
index 1aeab35f221f48962952b545073db520b22ebff4..3b86a88197ac92d3b5077d8b598bcf6ac8e48ea7 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1267,6 +1267,11 @@ Area.  The output is still logged to the *Messages* buffer.
 ** A new text property `inhibit-read-only' can be used in read-only
 buffers to allow certain parts of the text to be writable.
 
++++
+** A new variable `comment-end-can-be-escaped' is useful in languages
+   such as C and C++ where line comments with escaped newlines are
+   continued to the next line.
+
 +++
 ** New macro `define-advice'.
 
index 5b670833d45bc8bf1f133d079dcd99eba6ec4aad..1a07c4cd699597dd4bee2983d16d307f2579370f 100644 (file)
@@ -1433,6 +1433,14 @@ properly."
            "\\)\\s *"))
 (c-lang-setvar comment-start-skip (c-lang-const comment-start-skip))
 
+(c-lang-defconst comment-end-can-be-escaped
+  "When non-nil, escaped EOLs inside comments are valid.
+This works in Emacs >= 25.1."
+  t nil
+  (c c++ objc) t)
+(c-lang-setvar comment-end-can-be-escaped
+              (c-lang-const comment-end-can-be-escaped))
+
 (c-lang-defconst c-syntactic-ws-start
   ;; Regexp matching any sequence that can start syntactic whitespace.
   ;; The only uncertain case is '#' when there are cpp directives.
index 5b0ec6d071b1e8bd78293774281013743aab96a4..2acbd4138581de960a327712c40b2ca07e8af4ee 100644 (file)
@@ -790,8 +790,10 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
                   || SYNTAX_FLAGS_COMMENT_NESTED (syntax) != comnested))
        continue;
 
-      /* Ignore escaped characters, except comment-enders.  */
-      if (code != Sendcomment && char_quoted (from, from_byte))
+      /* Ignore escaped characters, except comment-enders which cannot
+         be escaped.  */
+      if ((Vcomment_end_can_be_escaped || code != Sendcomment)
+          && char_quoted (from, from_byte))
        continue;
 
       switch (code)
@@ -2346,7 +2348,8 @@ forw_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
       if (code == Sendcomment
          && SYNTAX_FLAGS_COMMENT_STYLE (syntax, 0) == style
          && (SYNTAX_FLAGS_COMMENT_NESTED (syntax) ?
-             (nesting > 0 && --nesting == 0) : nesting < 0))
+             (nesting > 0 && --nesting == 0) : nesting < 0)
+          && !(Vcomment_end_can_be_escaped && char_quoted (from, from_byte)))
        /* We have encountered a comment end of the same style
           as the comment sequence which began this comment
           section.  */
@@ -3702,6 +3705,12 @@ character of that word.
 In both cases, LIMIT bounds the search. */);
   Vfind_word_boundary_function_table = Fmake_char_table (Qnil, Qnil);
 
+  DEFVAR_BOOL ("comment-end-can-be-escaped", Vcomment_end_can_be_escaped,
+               doc: /* Non-nil means an escaped ender inside a comment doesn'tend the comment.  */);
+  Vcomment_end_can_be_escaped = 0;
+  DEFSYM (Qcomment_end_can_be_escaped, "comment-end-can-be-escaped");
+  Fmake_variable_buffer_local (Qcomment_end_can_be_escaped);
+
   defsubr (&Ssyntax_table_p);
   defsubr (&Ssyntax_table);
   defsubr (&Sstandard_syntax_table);