views:

400

answers:

2

When I type the following code in Emacs ruby-mode, the "#{foo}" is fontified in a different color than the enclosing string. How do I do this in my own Emacs mode? I tried to decipher the ruby-mode source code but couldn't understand it in a reasonable amount of time.

"a #{foo} a"
+1  A: 

Search for where ruby-mode.el sets font-lock-syntactic-keywords:

(setq ruby-font-lock-syntactic-keywords
  '(
    ;; #{ }, #$hoge, #@foo are not comments
    ("\\(#\\)[{$@]" 1 (1 . nil))

Here's some documentation on the similar font-lock-keywords variable, which is what you should use to accomplish the same type of fontification.

bmdhacks
+3  A: 

Finally figured it out. The answer is that the "override" parameter in a fontification rule should be set to t, which means that the given face will override the string face. See the documentation for the variable "font-lock-keywords" for details. Here's an example:

(define-derived-mode temp-mode fundamental-mode "Temp"
  "Temporary major mode."
  (set (make-local-variable 'font-lock-defaults)
       '((temp-mode-font-lock-keywords) nil nil nil nil)))

(defconst temp-mode-font-lock-keywords
  (list (list "$[A-Za-z0-9]+" 0 font-lock-variable-name-face t)))