1 ;;; fuel-font-lock.el -- font lock for factor code
3 ;; Copyright (C) 2008, 2009 Jose Antonio Ortega Ruiz
4 ;; See http://factorcode.org/license.txt for BSD license.
6 ;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
7 ;; Keywords: languages, fuel, factor
8 ;; Start date: Wed Dec 03, 2008 21:40
12 ;; Font lock setup for highlighting Factor code.
16 (require 'fuel-syntax
)
24 (defgroup fuel-faces nil
29 (defmacro fuel-font-lock--defface
(face def group doc
)
30 `(defface ,face
(face-default-spec ,def
)
31 ,(format "Face for %s." doc
)
36 (put 'fuel-font-lock--defface
'lisp-indent-function
1)
38 (defmacro fuel-font-lock--make-face
(prefix def-prefix group face def doc
)
39 (let ((face (intern (format "%s-%s" prefix face
)))
40 (def (intern (format "%s-%s-face" def-prefix def
))))
41 `(fuel-font-lock--defface ,face
,def
,group
,doc
)))
43 (defmacro fuel-font-lock--define-faces
(prefix def-prefix group faces
)
44 (let ((setup (make-symbol (format "%s--faces-setup" prefix
))))
48 (mapcar (lambda (f) (append '(fuel-font-lock--make-face
49 ,prefix
,def-prefix
,group
) f
))
53 (fuel-font-lock--define-faces
54 factor-font-lock font-lock factor-mode
55 ((comment comment
"comments")
56 (constructor type
"constructors (<foo>)")
57 (constant constant
"constants and literal values")
58 (number constant
"integers and floats")
59 (ratio constant
"ratios")
60 (declaration keyword
"declaration words")
61 (parsing-word keyword
"parsing words")
62 (setter-word function-name
"setter words (>>foo)")
63 (getter-word function-name
"getter words (foo>>)")
64 (stack-effect comment
"stack effect specifications")
65 (string string
"strings")
66 (symbol variable-name
"name of symbol being defined")
67 (type-name type
"type names")
68 (vocabulary-name constant
"vocabulary names")
69 (word function-name
"word, generic or method being defined")
70 (invalid-syntax warning
"syntactically invalid constructs")))
75 (defun fuel-font-lock--syntactic-face (state)
76 (if (nth 3 state
) 'factor-font-lock-string
77 (let ((c (char-after (nth 8 state
))))
78 (cond ((or (char-equal c ?\
) (char-equal c ?
\n))
80 (goto-char (nth 8 state
))
82 (cond ((looking-at "USING: ")
83 'factor-font-lock-vocabulary-name
)
84 ((looking-at "\\(TUPLE\\|SYMBOLS\\|VARS\\): ")
85 'factor-font-lock-symbol
)
86 ((looking-at "C-ENUM:\\( \\|\n\\)")
87 'factor-font-lock-constant
)
89 ((or (char-equal c ?U
) (char-equal c ?C
))
90 'factor-font-lock-parsing-word
)
91 ((char-equal c ?\
() 'factor-font-lock-stack-effect
)
92 ((char-equal c ?
\") 'factor-font-lock-string
)
93 (t 'factor-font-lock-comment
)))))
95 (defconst fuel-font-lock--font-lock-keywords
96 `((,fuel-syntax--stack-effect-regex .
'factor-font-lock-stack-effect
)
97 (,fuel-syntax--brace-words-regex
1 'factor-font-lock-parsing-word
)
98 (,fuel-syntax--alien-function-regex
(1 'factor-font-lock-type-name
)
99 (2 'factor-font-lock-word
))
100 (,fuel-syntax--vocab-ref-regexp
2 'factor-font-lock-vocabulary-name
)
101 (,fuel-syntax--constructor-decl-regex
(1 'factor-font-lock-word
)
102 (2 'factor-font-lock-type-name
)
103 (3 'factor-font-lock-invalid-syntax nil t
))
104 (,fuel-syntax--typedef-regex
(1 'factor-font-lock-type-name
)
105 (2 'factor-font-lock-type-name
)
106 (3 'factor-font-lock-invalid-syntax nil t
))
107 (,fuel-syntax--rename-regex
(1 'factor-font-lock-word
)
108 (2 'factor-font-lock-vocabulary-name
)
109 (3 'factor-font-lock-word
)
110 (4 'factor-font-lock-invalid-syntax nil t
))
111 (,fuel-syntax--declaration-words-regex .
'factor-font-lock-declaration
)
112 (,fuel-syntax--word-definition-regex
2 'factor-font-lock-word
)
113 (,fuel-syntax--alias-definition-regex
(1 'factor-font-lock-word
)
114 (2 'factor-font-lock-word
))
115 (,fuel-syntax--int-constant-def-regex
2 'factor-font-lock-constant
)
116 (,fuel-syntax--integer-regex .
'factor-font-lock-number
)
117 (,fuel-syntax--float-regex .
'factor-font-lock-number
)
118 (,fuel-syntax--ratio-regex .
'factor-font-lock-ratio
)
119 (,fuel-syntax--type-definition-regex
2 'factor-font-lock-type-name
)
120 (,fuel-syntax--method-definition-regex
(1 'factor-font-lock-type-name
)
121 (2 'factor-font-lock-word
))
122 (,fuel-syntax--tuple-decl-regex
2 'factor-font-lock-type-name
)
123 (,fuel-syntax--constructor-regex .
'factor-font-lock-constructor
)
124 (,fuel-syntax--setter-regex .
'factor-font-lock-setter-word
)
125 (,fuel-syntax--getter-regex .
'factor-font-lock-getter-word
)
126 (,fuel-syntax--symbol-definition-regex
2 'factor-font-lock-symbol
)
127 (,fuel-syntax--bad-string-regex .
'factor-font-lock-invalid-syntax
)
128 ("\\_<\\(P\\|SBUF\\|DLL\\)\"" 1 'factor-font-lock-parsing-word
)
129 (,fuel-syntax--parsing-words-regex .
'factor-font-lock-parsing-word
)))
131 (defun fuel-font-lock--font-lock-setup (&optional keywords no-syntax
)
132 (set (make-local-variable 'comment-start
) "! ")
133 (set (make-local-variable 'parse-sexp-lookup-properties
) t
)
134 (set (make-local-variable 'font-lock-defaults
)
135 `(,(or keywords
'fuel-font-lock--font-lock-keywords
)
138 (list (cons 'font-lock-syntactic-keywords
139 fuel-syntax--syntactic-keywords
)
140 (cons 'font-lock-syntactic-face-function
141 'fuel-font-lock--syntactic-face
))))))
144 ;;; Fontify strings as Factor code:
146 (defun fuel-font-lock--font-lock-buffer ()
147 (let ((name " *fuel font lock*"))
148 (or (get-buffer name
)
149 (let ((buffer (get-buffer-create name
)))
151 (set-syntax-table fuel-syntax--syntax-table
)
152 (fuel-font-lock--font-lock-setup)
155 (defun fuel-font-lock--factor-str (str)
157 (set-buffer (fuel-font-lock--font-lock-buffer))
160 (let ((font-lock-verbose nil
)) (font-lock-fontify-buffer))
164 (provide 'fuel-font-lock
)
165 ;;; fuel-font-lock.el ends here