3

I am working with the C-source code of Emacs using the built-in c-mode, and would like Emacs to automatically highlight functions and variables within comments with a different color: In the following example, how can I make pos-visible-in-window-p a different color?

/* See the doc-string for `pos-visible-in-window-p'.  */
lawlist
  • 18,826
  • 5
  • 37
  • 118
  • Here's a start: `(font-lock-add-keywords 'c-mode '(("\`\\([a-z-]+\\)'" 1 'font-lock-function-name-face prepend)))`. This does not check if `\`foo'` is in a comment, though. – Constantine Feb 06 '16 at 21:24
  • @Constantine -- my best *guess* would be that a modification of the function `c-font-lock-doc-comments` *might* be appropriate. However, the method used by `c-mode` to achieve its highlighting is quite complex. – lawlist Feb 06 '16 at 21:39
  • @lawlist are you looking for a way to find functions and variables? or, highlight anything within `' is ok? In the letter case, @Constantine 's answer is good enough, no? – Yasushi Shoji Feb 06 '16 at 22:42
  • @Yasushi Shoji -- I have grown accustomed to how the `emacs-lisp-mode` highlights functions and variables within comments, and find that I really miss that visual behavior when working in `c-mode`. The answer of @Constantine is essentially a textbook example from `font-lock` class 101. I'm most interested in a spiffy modification of the syntactic functions used by `c-mode` to achieve the desired effect. I am already familiar with the find features for functions and variables. – lawlist Feb 06 '16 at 22:51
  • @lawlist: Yes, the doc-comment machinery seems like the right place. (If we're lucky, adding one more style (in addition to `gtkdoc`, `autodoc`, and `javadoc`) would be enough -- it would be nice to leave the **logic** of `c-font-lock-doc-comments` alone). Also, I just realized that one could modify `bug-reference-mode` to achieve something similar. (That way we could easily have clickable buttons that call 'describe-function` or `describe-variable`.) – Constantine Feb 07 '16 at 00:08

1 Answers1

5

This seems to work for me:

(require 'cc-mode)

(setq yashi-font-lock-doc-comments
  (let ((symbol "[a-zA-Z0-9_-]+"))
    `((,(concat "`" symbol "'")
       0 ,c-doc-markup-face-name prepend nil))
    ))

(setq yashi-font-lock-keywords
  `((,(lambda (limit)
        (c-font-lock-doc-comments "/\\*" limit
          yashi-font-lock-doc-comments)
        ))))


(add-hook 'c-mode-hook
          (lambda ()
            (setq c-doc-comment-style '((c-mode . yashi)))))
Yasushi Shoji
  • 2,151
  • 15
  • 35
  • The following test was performed with both Emacs 24.5 and also with the master branch: I started with **Emacs -Q**. I pasted the answer into the `*scratch*` buffer and typed `M-x eval-buffer RET`. Then I opened a new buffer `foo.c`, which defaults to `c-mode`. I typed: `/* See the doc-string for [backtick]pos-visible-in-window-p'. */` The function `pos-visible-in-window-p` did not receive any different color than the rest of the comment -- i.e., the function is `font-lock-comment-face`. I verified the face by placing my cursor on the function and typing: `C-u C-x =` – lawlist Feb 07 '16 at 06:13
  • @lawlist sorry about bugs. First of all I've only tested with Emacs master branch. Second, I thought C can't have a symbol `foo-bar`, so I committed `-` from symbol regexp. Third, I left `/**\n` as the start of comment. I've removed it too. Would you mind to test it again? – Yasushi Shoji Feb 09 '16 at 02:26
  • When using this method, the comment will be highlighted using `font-lock-doc-face` instead of `font-lock-comment-face`. This indicates that this method was intended to be used for doxygen-like comments, not for general highlighting inside comments. One drawback is that you can only have one doc-style, so you can't highlight symbols and doxygen comments. An alternative approach would be to use a plain font-lock rule that highlight symbols inside backtick-tick, that also check that they are inside comments using `syntax-ppss`. – Lindydancer Feb 11 '16 at 10:13