X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/4542571e02a2517e6ca9c342d433343293b06be8..c2f24b82c0b35fef581f5c47bc3f9d0c488f9d6e:/elisp/domtool-mode.el diff --git a/elisp/domtool-mode.el b/elisp/domtool-mode.el index d1a4a98..17c90c5 100644 --- a/elisp/domtool-mode.el +++ b/elisp/domtool-mode.el @@ -37,16 +37,25 @@ )) 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))) @@ -73,7 +82,13 @@ (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))) @@ -83,12 +98,36 @@ (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))) @@ -98,15 +137,16 @@ 'noindent) ((nth 4 state) (domtool-calculate-comment-indent state)) - ((and (looking-at "\\_") - (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))))))) @@ -122,3 +162,5 @@ (incf depth) (decf depth))) (+ (current-indentation) depth))))) + +(provide 'domtool-mode)