mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-27 10:54:40 +00:00
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'.
This commit is contained in:
parent
17ab0d10e1
commit
326ffcce5f
@ -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.
|
||||
|
||||
|
5
etc/NEWS
5
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'.
|
||||
|
||||
|
@ -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.
|
||||
|
15
src/syntax.c
15
src/syntax.c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user