Commit 326ffcce authored by Alan Mackenzie's avatar Alan Mackenzie

Allow line comments ending with escaped NL to be continued to the next line.

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'.
parent 17ab0d10
...@@ -945,6 +945,14 @@ whitespace by the functions in this section and by @code{forward-sexp}, ...@@ -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 The behavior of @code{parse-partial-sexp} is also affected by
@code{parse-sexp-lookup-properties} (@pxref{Syntax Properties}). @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 You can use @code{forward-comment} to move forward or backward over
one comment or several comments. one comment or several comments.
......
...@@ -1267,6 +1267,11 @@ Area. The output is still logged to the *Messages* buffer. ...@@ -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 ** A new text property `inhibit-read-only' can be used in read-only
buffers to allow certain parts of the text to be writable. 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'. ** New macro `define-advice'.
......
...@@ -1433,6 +1433,14 @@ properly." ...@@ -1433,6 +1433,14 @@ properly."
"\\)\\s *")) "\\)\\s *"))
(c-lang-setvar comment-start-skip (c-lang-const comment-start-skip)) (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 (c-lang-defconst c-syntactic-ws-start
;; Regexp matching any sequence that can start syntactic whitespace. ;; Regexp matching any sequence that can start syntactic whitespace.
;; The only uncertain case is '#' when there are cpp directives. ;; The only uncertain case is '#' when there are cpp directives.
......
...@@ -790,8 +790,10 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop, ...@@ -790,8 +790,10 @@ back_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
|| SYNTAX_FLAGS_COMMENT_NESTED (syntax) != comnested)) || SYNTAX_FLAGS_COMMENT_NESTED (syntax) != comnested))
continue; continue;
/* Ignore escaped characters, except comment-enders. */ /* Ignore escaped characters, except comment-enders which cannot
if (code != Sendcomment && char_quoted (from, from_byte)) be escaped. */
if ((Vcomment_end_can_be_escaped || code != Sendcomment)
&& char_quoted (from, from_byte))
continue; continue;
switch (code) switch (code)
...@@ -2346,7 +2348,8 @@ forw_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop, ...@@ -2346,7 +2348,8 @@ forw_comment (ptrdiff_t from, ptrdiff_t from_byte, ptrdiff_t stop,
if (code == Sendcomment if (code == Sendcomment
&& SYNTAX_FLAGS_COMMENT_STYLE (syntax, 0) == style && SYNTAX_FLAGS_COMMENT_STYLE (syntax, 0) == style
&& (SYNTAX_FLAGS_COMMENT_NESTED (syntax) ? && (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 /* We have encountered a comment end of the same style
as the comment sequence which began this comment as the comment sequence which began this comment
section. */ section. */
...@@ -3702,6 +3705,12 @@ character of that word. ...@@ -3702,6 +3705,12 @@ character of that word.
In both cases, LIMIT bounds the search. */); In both cases, LIMIT bounds the search. */);
Vfind_word_boundary_function_table = Fmake_char_table (Qnil, Qnil); 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_p);
defsubr (&Ssyntax_table); defsubr (&Ssyntax_table);
defsubr (&Sstandard_syntax_table); defsubr (&Sstandard_syntax_table);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment