]> gitweb.factorcode.org Git - factor.git/blob - misc/fuel/fuel-font-lock.el
Merge commit 'origin/master'
[factor.git] / misc / fuel / fuel-font-lock.el
1 ;;; fuel-font-lock.el -- font lock for factor code
2
3 ;; Copyright (C) 2008 Jose Antonio Ortega Ruiz
4 ;; See http://factorcode.org/license.txt for BSD license.
5
6 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
7 ;; Keywords: languages, fuel, factor
8 ;; Start date: Wed Dec 03, 2008 21:40
9
10 ;;; Comentary:
11
12 ;; Font lock setup for highlighting Factor code.
13
14 ;;; Code:
15
16 (require 'fuel-syntax)
17 (require 'fuel-base)
18
19 (require 'font-lock)
20
21 \f
22 ;;; Faces:
23
24 (defmacro fuel-font-lock--make-face (prefix def-prefix group face def doc)
25   (let ((face (intern (format "%s-%s" prefix face)))
26         (def (intern (format "%s-%s-face" def-prefix def))))
27     `(defface ,face (face-default-spec ,def)
28        ,(format "Face for %s." doc)
29        :group ',group
30        :group 'faces)))
31
32 (defmacro fuel-font-lock--define-faces (prefix def-prefix group faces)
33   (let ((setup (make-symbol (format "%s--faces-setup" prefix))))
34   `(progn
35      (defmacro ,setup ()
36        (cons 'progn
37              (mapcar (lambda (f) (append '(fuel-font-lock--make-face
38                                       ,prefix ,def-prefix ,group) f))
39                      ',faces)))
40      (,setup))))
41
42 (fuel-font-lock--define-faces
43  factor-font-lock font-lock factor-mode
44  ((comment comment "comments")
45   (constructor type  "constructors (<foo>)")
46   (declaration keyword "declaration words")
47   (parsing-word keyword  "parsing words")
48   (setter-word function-name "setter words (>>foo)")
49   (getter-word function-name "getter words (foo>>)")
50   (stack-effect comment "stack effect specifications")
51   (string string "strings")
52   (symbol variable-name "name of symbol being defined")
53   (type-name type "type names")
54   (vocabulary-name constant "vocabulary names")
55   (word function-name "word, generic or method being defined")))
56
57 \f
58 ;;; Font lock:
59
60 (defconst fuel-font-lock--parsing-lock-keywords
61   (cons '("\\(P\\|SBUF\\)\"" 1 'factor-font-lock-parsing-word)
62         (mapcar (lambda (w) `(,(format "\\(^\\| \\)\\(%s\\)\\($\\| \\)" w)
63                          2 'factor-font-lock-parsing-word))
64                 fuel-syntax--parsing-words)))
65
66 (defconst fuel-font-lock--font-lock-keywords
67   `(,@fuel-font-lock--parsing-lock-keywords
68     (,fuel-syntax--stack-effect-regex . 'factor-font-lock-stack-effect)
69     (,fuel-syntax--parsing-words-ext-regex . 'factor-font-lock-parsing-word)
70     (,fuel-syntax--declaration-words-regex 1 'factor-font-lock-declaration)
71     (,fuel-syntax--word-definition-regex 2 'factor-font-lock-word)
72     (,fuel-syntax--type-definition-regex 2 'factor-font-lock-type-name)
73     (,fuel-syntax--method-definition-regex (1 'factor-font-lock-type-name)
74                                            (2 'factor-font-lock-word))
75     (,fuel-syntax--parent-type-regex 1 'factor-font-lock-type-name)
76     (,fuel-syntax--constructor-regex . 'factor-font-lock-constructor)
77     (,fuel-syntax--setter-regex 2 'factor-font-lock-setter-word)
78     (,fuel-syntax--getter-regex 2 'factor-font-lock-getter-word)
79     (,fuel-syntax--symbol-definition-regex 2 'factor-font-lock-symbol)
80     (,fuel-syntax--use-line-regex 1 'factor-font-lock-vocabulary-name))
81   "Font lock keywords definition for Factor mode.")
82
83 (defun fuel-font-lock--font-lock-setup (&optional keywords no-syntax)
84   (set (make-local-variable 'comment-start) "! ")
85   (set (make-local-variable 'parse-sexp-lookup-properties) t)
86   (set (make-local-variable 'font-lock-comment-face) 'factor-font-lock-comment)
87   (set (make-local-variable 'font-lock-string-face) 'factor-font-lock-string)
88   (set (make-local-variable 'font-lock-defaults)
89        `(,(or keywords 'fuel-font-lock--font-lock-keywords)
90          nil nil nil nil
91          ,@(if no-syntax nil
92              (list (cons 'font-lock-syntactic-keywords
93                          fuel-syntax--syntactic-keywords))))))
94
95 \f
96 (provide 'fuel-font-lock)
97 ;;; fuel-font-lock.el ends here