Factor path prefixes into ConfigCore structure
[hcoop/domtool2.git] / elisp / domtool-mode.el
index d1a4a98..17c90c5 100644 (file)
        ))
     table))
 
+(defun domtool-syms-re (&rest syms)
+  (concat "\\<" (regexp-opt syms t) "\\>"))
+
+(require 'domtool-tables)
+
 (defvar domtool-font-lock-keywords
   `(,(concat
       "\\_<"
       (regexp-opt '("let" "in" "begin" "end" "with" "where" "extern" "type"
-                    "val" "context" "Root"
-                    ;; Actions
-                    "vhost" "location" "directory" "domain" "dom"
-                    "webAt" "web")
+                    "val" "context" "Root" "if" "then" "else")
                   t)
       "\\_>")
+
+    (,domtool-actions-regexp . font-lock-builtin-face)
+    (,domtool-vals-regexp . font-lock-variable-name-face)
+    (,domtool-contexts-regexp . font-lock-constant-face)
+    (,domtool-env-vars-regexp . font-lock-constant-face)
+    (,domtool-types-regexp . font-lock-type-face)
+
     ("type[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 1 font-lock-type-face)
     ("val[ \t]+\\(\\(\\sw\\|\\s_\\)+\\)" 1 font-lock-variable-name-face)))
 
          (font-lock-syntactic-keywords
           . domtool-font-lock-syntactic-keywords)
          (font-lock-syntactic-face-function
-          . domtool-font-lock-syntactic-face-function))))
+          . domtool-font-lock-syntactic-face-function)))
+  (set (make-local-variable 'comment-start-regexp) "(\\*\\|{{")
+  (set (make-local-variable 'comment-end-regexp) "\\*)\\|}}")
+  (set (make-local-variable 'comment-nested) t)
+
+  (set (make-local-variable 'compile-command)
+       (concat "domtool -tc " (file-relative-name buffer-file-name))))
 
 (defun domtool-indent-line ()
   (let ((savep (> (current-column) (current-indentation)))
      (savep (save-excursion (indent-line-to indent)))
      (t (indent-line-to indent)))))
 
+(defun until-closed-helper (level)
+  (if
+      (re-search-backward "\\_<\\(with\\|where\\|begin\\|end\\|let\\|val\\|type\\|if\\)\\_>"
+                         nil t)
+      (cond
+       ((string= (match-string 0) "end")
+       (until-closed-helper (+ level 1)))
+       ((= level 0)
+       (current-indentation))
+       ((and
+        (string= (match-string 0) "with")
+        (save-excursion
+          (backward-char)
+          (looking-at "\\s-")))
+       (until-closed-helper level))
+       (t
+       (until-closed-helper (- level 1))))
+
+    0))
+
+(defun until-closed ()
+  (save-excursion
+    (until-closed-helper 0)))
+
 (defun domtool-calculate-indent ()
   (save-excursion
     (back-to-indentation)
     (multiple-value-bind (previous-keyword base-indent)
         (save-excursion
-          (if (re-search-backward "\\_<\\(with\\|where\\|end\\)\\_>"
+          (if (re-search-backward "\\_<\\(with\\|where\\|begin\\|end\\|let\\|in\\|val\\|type\\|if\\)\\_>\\|}}\\|{{"
                                   nil t)
               (values (match-string 0) (current-indentation))
             (values nil 0)))
           'noindent)
          ((nth 4 state)
           (domtool-calculate-comment-indent state))
-         ((and (looking-at "\\_<end\\_>")
-               (string= previous-keyword "end"))
-          (- base-indent domtool-indent))
-         ((looking-at "\\_<\\(with\\|end\\)\\_>")
-          base-indent)
+        ((looking-at "{{\\|\\_<\\(extern\\|val\\|type\\|context\\)\\_>")
+         0)
+         ((looking-at "\\_<\\(with\\|end\\|in\\|else\\)\\_>")
+          (until-closed))
          ((not previous-keyword)
           base-indent)
          ((string= previous-keyword "end")
           base-indent)
+         ((looking-at "\\_<\\(val\\|extern\\|context\\)\\_>")
+          base-indent)
          (t
           (+ base-indent domtool-indent)))))))
 
                    (incf depth)
                  (decf depth)))
              (+ (current-indentation) depth)))))
+
+(provide 'domtool-mode)