mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-16 17:24:23 +00:00
CC Mode. Allow fontification of "wrong" style comments with warning face.
This fixes bug #4192. * etc/NEWS: Add a new entry. * lisp/progmodes/cc-defs.el (c-font-lock-flush): New macro. * lisp/progmodes/cc-cmds.el (c-toggle-comment-style): On toggling the comment style, invoke c-font-lock-flush when c-mark-wrong-style-of-comment is non-nil, to cause that marking to be done instead on the other style of comment. * lisp/progmodes/cc-fonts.el (c-maybe-font-lock-wrong-style-comments): New function. (c-cpp-matchers): Call c-maybe-font-lock-wrong-style-comments when appropriate. * lisp/progmodes/cc-vars.el (c-mark-wrong-style-of-comment): New customizable option. * doc/misc/cc-mode.texi (top level, Indentation Commands, Guessing the Style, Custom Macros): For some opening quote marks, correct '' to ``. (Minor Modes): Add an xref to the new page "Wrong Comment Style" in a footnote. (Wrong Comment Style): New page.
This commit is contained in:
parent
6daa80d04e
commit
b293aa91bc
6 changed files with 126 additions and 9 deletions
|
|
@ -669,7 +669,7 @@ expression, to some statements, or perhaps to whole functions, the
|
|||
syntactic recognition can be wrong. @ccmode{} manages to figure it
|
||||
out correctly most of the time, though.
|
||||
|
||||
Some macros, when invoked, ''have their own semicolon''. To get the
|
||||
Some macros, when invoked, ``have their own semicolon''. To get the
|
||||
next line indented correctly, rather than as a continuation line,
|
||||
@xref{Macros with ;}.
|
||||
|
||||
|
|
@ -1149,7 +1149,9 @@ find useful while writing new code or editing old code:
|
|||
@table @asis
|
||||
@item comment style
|
||||
This specifies whether comment commands (such as @kbd{M-;}) insert
|
||||
block comments or line comments.
|
||||
block comments or line comments@footnote{You can emphasize
|
||||
non-default style comments in your code by giving their delimiters
|
||||
@code{font-lock-warning-face}. @xref{Wrong Comment Style}.}.
|
||||
@item electric mode
|
||||
When this is enabled, certain visible characters cause reformatting as
|
||||
they are typed. This is normally helpful, but can be a nuisance when
|
||||
|
|
@ -1866,6 +1868,7 @@ sections apply to the other languages.
|
|||
* Font Locking Preliminaries::
|
||||
* Faces::
|
||||
* Doc Comments::
|
||||
* Wrong Comment Style::
|
||||
* Misc Font Locking::
|
||||
* AWK Mode Font Locking::
|
||||
@end menu
|
||||
|
|
@ -2069,7 +2072,7 @@ since those aren't syntactic errors in themselves.
|
|||
|
||||
|
||||
@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
@node Doc Comments, Misc Font Locking, Faces, Font Locking
|
||||
@node Doc Comments, Wrong Comment Style, Faces, Font Locking
|
||||
@comment node-name, next, previous, up
|
||||
@section Documentation Comments
|
||||
@cindex documentation comments
|
||||
|
|
@ -2149,7 +2152,29 @@ If you add support for another doc comment style, please consider
|
|||
contributing it: send a note to @email{bug-cc-mode@@gnu.org}.
|
||||
|
||||
@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
@node Misc Font Locking, AWK Mode Font Locking, Doc Comments, Font Locking
|
||||
@node Wrong Comment Style, Misc Font Locking, Doc Comments, Font Locking
|
||||
@comment node-name, next, previous, up
|
||||
@section Marking ``Wrong'' style comments
|
||||
@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
Most languages supported by @ccmode{} have two styles of comments,
|
||||
namely block comments and line comments. Your project may have such a
|
||||
strong preference for one of them, that you wish ``wrong'' style
|
||||
comments to be clearly marked.
|
||||
|
||||
You can get @ccmode{} to do this by setting the default comment style,
|
||||
if necessary, (@pxref{Minor Modes}) and setting the customizable
|
||||
option @code{c-mark-wrong-style-of-comment} to non-@code{nil}.
|
||||
|
||||
@defvar c-mark-wrong-style-of-comment
|
||||
@vindex mark-wrong-style-of-comment (c-)
|
||||
When this customizable option is non-@code{nil}, comment delimiters
|
||||
which aren't of the default style will be fontified with
|
||||
@code{font-lock-warning-face}.
|
||||
@end defvar
|
||||
|
||||
@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
@node Misc Font Locking, AWK Mode Font Locking, Wrong Comment Style, Font Locking
|
||||
@comment node-name, next, previous, up
|
||||
@section Miscellaneous Font Locking
|
||||
@comment !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
|
@ -2885,11 +2910,11 @@ should not be changed directly; use @code{c-add-style} instead.
|
|||
|
||||
Instead of specifying a style, you can get @ccmode{} to @dfn{guess}
|
||||
your style by examining an already formatted code buffer. @ccmode{}
|
||||
then determines the ''most frequent'' offset (@pxref{c-offsets-alist})
|
||||
then determines the ``most frequent'' offset (@pxref{c-offsets-alist})
|
||||
for each of the syntactic symbols (@pxref{Indentation Engine Basics})
|
||||
encountered in the buffer, and the ''most frequent'' value of
|
||||
encountered in the buffer, and the ``most frequent'' value of
|
||||
c-basic-offset (@pxref{Customizing Indentation}), then merges the
|
||||
current style with these ''guesses'' to form a new style. This
|
||||
current style with these ``guesses'' to form a new style. This
|
||||
combined style is known as the @dfn{guessed style}.
|
||||
|
||||
To do this, call @code{c-guess} (or one of the other 5 guessing
|
||||
|
|
@ -6927,7 +6952,7 @@ is @code{nil}, all lines inside macro definitions are analyzed as
|
|||
Because a macro can expand into anything at all, near where one is
|
||||
invoked @ccmode{} can only indent and fontify code heuristically.
|
||||
Sometimes it gets it wrong. Usually you should try to design your
|
||||
macros so that they ''look like ordinary code'' when you invoke them.
|
||||
macros so that they ``look like ordinary code'' when you invoke them.
|
||||
However, two situations are so common that @ccmode{} handles them
|
||||
specially: that is when certain macros needn't (or mustn't) be
|
||||
followed by a @samp{;}, and when certain macros (or compiler
|
||||
|
|
|
|||
8
etc/NEWS
8
etc/NEWS
|
|
@ -2264,6 +2264,14 @@ file-local variable, you may need to update the value.
|
|||
*** Declare 'define-overload' and 'define-child-mode' as obsolete
|
||||
*** Rename several internal functions to use a ''mode-local-' prefix
|
||||
|
||||
** CC Mode
|
||||
|
||||
+++
|
||||
*** You can now flag "wrong style" comments with font-lock-warning-face.
|
||||
To do this, use c-toggle-comment-style, if needed, to set the desired
|
||||
default comment style (block or line); then set the option
|
||||
c-mark-wrong-style-of-comment to non-nil.
|
||||
|
||||
|
||||
* New Modes and Packages in Emacs 27.1
|
||||
|
||||
|
|
|
|||
|
|
@ -391,6 +391,16 @@ This action does nothing when the mode only has one comment style."
|
|||
(if c-block-comment-flag
|
||||
(concat " " c-block-comment-ender)
|
||||
""))
|
||||
;; If necessary, invert the sense of fontification of wrong style comments.
|
||||
(when (and c-mark-wrong-style-of-comment
|
||||
font-lock-mode
|
||||
c-block-comment-starter
|
||||
c-block-comment-ender)
|
||||
(save-excursion
|
||||
(save-restriction
|
||||
(widen)
|
||||
(goto-char (point-min))
|
||||
(c-font-lock-flush (point-min) (point-max)))))
|
||||
(c-update-modeline)
|
||||
(c-keep-region-active))
|
||||
|
||||
|
|
|
|||
|
|
@ -219,6 +219,13 @@ This variant works around bugs in `eval-when-compile' in various
|
|||
`(cl-delete-duplicates ,cl-seq ,@cl-keys)
|
||||
`(delete-duplicates ,cl-seq ,@cl-keys))))
|
||||
|
||||
(defmacro c-font-lock-flush (beg end)
|
||||
"Declare the region BEG...END's fontification as out-of-date.
|
||||
On XEmacs and older Emacsen, this refontifies that region immediately."
|
||||
(if (fboundp 'font-lock-flush)
|
||||
`(font-lock-flush ,beg ,end)
|
||||
`(font-lock-fontify-region ,beg ,end)))
|
||||
|
||||
(defmacro c-point (position &optional point)
|
||||
"Return the value of certain commonly referenced POSITIONs relative to POINT.
|
||||
The current point is used if POINT isn't specified. POSITION can be
|
||||
|
|
|
|||
|
|
@ -95,6 +95,7 @@
|
|||
;; during compilation.
|
||||
(cc-bytecomp-defvar c-preprocessor-face-name)
|
||||
(cc-bytecomp-defvar c-reference-face-name)
|
||||
(cc-bytecomp-defvar c-block-comment-flag)
|
||||
(cc-bytecomp-defun c-fontify-recorded-types-and-refs)
|
||||
(cc-bytecomp-defun c-font-lock-declarators)
|
||||
(cc-bytecomp-defun c-font-lock-objc-method)
|
||||
|
|
@ -532,7 +533,12 @@ stuff. Used on level 1 and higher."
|
|||
(sws-depth (c-lang-const c-syntactic-ws-depth))
|
||||
(nsws-depth (c-lang-const c-nonempty-syntactic-ws-depth)))
|
||||
|
||||
`(;; The stuff after #error and #warning is a message, so
|
||||
`(;; Fontify "invalid" comment delimiters
|
||||
,@(when (and (c-lang-const c-block-comment-starter)
|
||||
(c-lang-const c-line-comment-starter))
|
||||
`(c-maybe-font-lock-wrong-style-comments))
|
||||
|
||||
;; The stuff after #error and #warning is a message, so
|
||||
;; fontify it as a string.
|
||||
,@(when (c-lang-const c-cpp-message-directives)
|
||||
(let* ((re (c-make-keywords-re 'appendable ; nil
|
||||
|
|
@ -715,6 +721,59 @@ stuff. Used on level 1 and higher."
|
|||
(parse-partial-sexp end limit nil nil state 'syntax-table)))
|
||||
nil)
|
||||
|
||||
(defun c-maybe-font-lock-wrong-style-comments (limit)
|
||||
;; This function will be called from font-lock-for a region bounded by POINT
|
||||
;; and LIMIT, as though it were to identify a keyword for
|
||||
;; font-lock-keyword-face. It always returns NIL to inhibit this and
|
||||
;; prevent a repeat invocation. See elisp/lispref page "Search-based
|
||||
;; Fontification".
|
||||
;;
|
||||
;; This function fontifies "invalid" comment delimiters with
|
||||
;; `font-lock-warning-face'. A delimiter is "invalid" when
|
||||
;; `c-mark-wrong-style-of-comment' is non-nil, and the delimiter style is
|
||||
;; not the default specified by `c-block-comment-flag'.
|
||||
(when c-mark-wrong-style-of-comment
|
||||
(let* ((lit (c-semi-pp-to-literal (point)))
|
||||
(s (car lit)) ; parse-partial-sexp state.
|
||||
)
|
||||
;; First, deal with and move out of any literal we start in.
|
||||
(cond
|
||||
((null (cadr lit))) ; Not in a literal
|
||||
((eq (cadr lit) 'string)
|
||||
(setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table)))
|
||||
((and (not c-block-comment-flag) ; In an "invalid" block comment
|
||||
(eq (cadr lit) 'c))
|
||||
(setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table))
|
||||
;; Font lock the block comment ender with warning face.
|
||||
(when (not (nth 4 s))
|
||||
(c-put-font-lock-face (- (point) (length c-block-comment-ender))
|
||||
(point) font-lock-warning-face)))
|
||||
(t ; In a line comment, or a "valid" block comment
|
||||
(setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table))))
|
||||
|
||||
(while (< (point) limit)
|
||||
(setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table))
|
||||
(cond
|
||||
((or (nth 3 s) ; In a string
|
||||
(and (nth 4 s) ; In a comment
|
||||
(eq (nth 7 s) ; Comment style
|
||||
(if c-block-comment-flag
|
||||
nil ; Block comment
|
||||
1)))) ; Line comment
|
||||
;; Move over a "valid" literal.
|
||||
(setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table)))
|
||||
((nth 4 s) ; In an invalid comment
|
||||
;; Fontify the invalid comment opener.
|
||||
(c-put-font-lock-face (nth 8 s) (point) font-lock-warning-face)
|
||||
;; Move to end of comment or LIMIT.
|
||||
(setq s (parse-partial-sexp (point) limit nil nil s 'syntax-table))
|
||||
;; Fontify an invalid block comment ender, if that's what we have.
|
||||
(when (and (not c-block-comment-flag)
|
||||
(not (nth 4 s))) ; We're outside the comment
|
||||
(c-put-font-lock-face (- (point) (length c-block-comment-ender))
|
||||
(point) font-lock-warning-face)))))))
|
||||
nil)
|
||||
|
||||
(c-lang-defconst c-basic-matchers-before
|
||||
"Font lock matchers for basic keywords, labels, references and various
|
||||
other easily recognizable things that should be fontified before generic
|
||||
|
|
|
|||
|
|
@ -1751,6 +1751,14 @@ variables.")
|
|||
c-macro-names-with-semicolon: %s"
|
||||
c-macro-names-with-semicolon))))))
|
||||
|
||||
(defcustom c-mark-wrong-style-of-comment nil
|
||||
"Fontify \"invalid\" comment delims with `font-lock-warning-face' if non-nil.
|
||||
\"Invalid\" means a line comment when the default comment style (set by
|
||||
`c-toggle-comment-style') is block, or a block comment otherwise."
|
||||
:type 'boolean
|
||||
:group 'c
|
||||
:version 27.1)
|
||||
|
||||
(defvar c-file-style nil
|
||||
"Variable interface for setting style via File Local Variables.
|
||||
In a file's Local Variable section, you can set this variable to a
|
||||
|
|
|
|||
Loading…
Reference in a new issue