summaryrefslogtreecommitdiffstats
path: root/emacs.d/nxhtml/related/tt-mode.el
blob: cf01a47d3d2b869271f7d05a26557873e9eef210 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
;; tt-mode.el --- Emacs major mode for editing Template Toolkit files
;;
;; Copyright (c) 2002 Dave Cross, all rights reserved.
;;
;; This file may be distributed under the same terms as GNU Emacs.
;;
;; $Id: tt-mode.el 13 2008-01-27 09:35:16Z dave $
;;
;; This file adds simple font highlighting of TT directives when you are
;; editing Template Toolkit files.
;;
;; I usually give these files an extension of .tt and in order to automatically
;; invoke this mode for these files, I have the following in my .emacs file.
;;
;; (setq load-path
;;      (cons "/home/dave/xemacs" load-path))
;; (autoload 'tt-mode "tt-mode")
;; (setq auto-mode-alist
;;  (append '(("\\.tt$" . tt-mode))  auto-mode-alist ))
;;
;; Something similar may well work for you.
;;
;; Author: Dave Cross <dave@dave.org.uk>
;;
;; Modified by Lennart Borgman 2008-08-06

(require 'font-lock)

(defvar tt-mode-hook nil
  "List of functions to call when entering TT mode")

(defvar tt-keywords
  (concat "\\b\\(?:"
          (regexp-opt (list "GET" "CALL" "SET" "DEFAULT" "INSERT" "INCLUDE"
                            "BLOCK" "END" "PROCESS" "WRAPPER" "IF" "UNLESS"
                            "ELSIF" "ELSE" "SWITCH" "CASE" "FOR" "FOREACH"
                            "WHILE" "FILTER" "USE" "MACRO" "PERL" "RAWPERL"
                            "TRY" "THROW" "CATCH" "FINAL" "LAST" "RETURN"
                            "STOP" "CLEAR" "META" "TAGS"))
          "\\)\\b"))

(defvar tt-font-lock-keywords
   (list
    ;; Fontify [& ... &] expressions
    '("\\(\\[%[-+]?\\)\\(\\(.\\|\n\\)+?\\)\\([-+]?%\\]\\)"
      (1 font-lock-string-face t)
      (2 font-lock-variable-name-face t)
      (4 font-lock-string-face t))
    ;; Look for keywords within those expressions
    ;;
    ;; Comment out whole directive tag
    '("\\[%\\(#.*?\\)%\\]"
      (1 font-lock-comment-face t))
    ;; Comments to end of line
;;;     '("\\[%\\(?:.\\|\n\\)*\\(#.*\\)"
;;;       (1 font-lock-comment-face t))
    '("\\[% *\\([a-z_0-9]*\\) *%\\]"
      (1 font-lock-constant-face t))
    (list (concat
	   "\\(\\[%[-+]?\\|;\\)[ \n\t]*\\("
	   tt-keywords
	   "\\)")
	  2 font-lock-keyword-face t)
    )
  "Expressions to font-lock in tt-mode.")

;; (defvar tt-font-lock-keywords
;;   ;; Since this is used in a multi major mode we
;;    (list
;;     ;; Fontify [& ... &] expressions
;; ;;;     '("^\\([-+]?\\)\\(\\(.\\|\n\\)+?\\)\\([-+]?\\)$"
;; ;;;       (1 font-lock-string-face t)
;; ;;;       (2 font-lock-variable-name-face t)
;; ;;;       (4 font-lock-string-face t))
;;     '("\\(#.*\\)$"
;;       (1 font-lock-comment-face t))
;;     '("^ *\\([a-z_0-9]*\\) *$"
;;       (1 font-lock-constant-face t))
;;     (list (concat
;;            "^\\(?:[-+]?\\|;\\)[ \n\t]*\\("
;;            tt-keywords
;;            "\\)")
;;            )
;; 	  1 font-lock-keyword-face t)
;;     )
;;   "Expressions to font-lock in tt-mode.")

(defvar tt-font-lock-defaults
  '(tt-font-lock-keywords nil t))

(defun tt-mode-after-change (beg end pre-len)
  ;; add/remove font-lock-multiline
  ;; Fix-me: add variable for search lengths
  (let* ((here (point))
         (beg-is-ml (get-text-property beg 'font-lock-multiline))
         tt-beg
         tt-end
         )
    (when beg-is-ml
      (let ((beg-ok (not (previous-single-property-change
                          here 'font-lock-multiline
                          nil (- here 1))))
            )
        (when beg-ok
          (goto-char beg)
          (search-forward "%]" end t)
          )
            (search-forward "[%" end t)
        ))
    (when tt-end
      (remove-list-of-text-properties here tt-beg '(font-lock-multiline))
      (set-text-properties tt-beg tt-end '(font-lock-multiline t))))
  )


;;;###autoload
(define-derived-mode tt-mode fundamental-mode "TT"
  "Major mode for editing Template Toolkit files."
  (set (make-local-variable 'font-lock-defaults) tt-font-lock-defaults)
  (add-hook 'after-change-functions 'tt-mode-after-change nil t)
  )

(provide 'tt-mode)
;; tt-mode.el ends here