Support comment-region and friends
[hcoop/domtool2.git] / elisp / domtool-mode.el
index 3f8d193..039db8d 100644 (file)
@@ -39,7 +39,6 @@
 
 (defun domtool-syms-re (&rest syms)
   (concat "\\<" (regexp-opt syms t) "\\>"))
-
 (defconst domtool-types-regexp
   (domtool-syms-re "proxy_target" "proxy_port" "mod_rewrite_cond_flag" "mod_rewrite_flag" "rewrite_arg" "redirect_code" "autoindex_option" "autoindex_width" "homedir_path" "dnsRecord" "apache_option" "authType" "location" "ssl" "ssl_cert_path" "suexec_flag" "web_node" "aliasTarget" "aliasSource" "email" "emailUser" "mail_node" "dnsKind" "master" "dns_node" "soa" "serial" "your_path" "your_group" "your_user" "group" "user" "node" "your_domain_host" "your_domain" "domain" "host" "ip" "no_newlines" "no_spaces" "bool" "string" "int")
   "A regexp that matches Domtool types from the standard library.")
@@ -57,7 +56,7 @@
   "A regexp that matches Domtool vals from the standard library.")
 
 (defconst domtool-env-vars-regexp
-  (domtool-syms-re "Aliases" "DNS" "DocumentRoot" "Group" "MailNodes" "Mailbox" "SSL" "ServerAdmin" "SuExec" "TTL" "User" "WebNodes")
+  (domtool-syms-re "Aliases" "DNS" "DocumentRoot" "Group" "MailNodes" "Mailbox" "SSL" "ServerAdmin" "SuExec" "TTL" "User" "WWW" "WebNodes")
   "A regexp that matches Domtool env-vars from the standard library.")
 
 (defvar domtool-font-lock-keywords
          (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 'indent-line-function) 'sml-indent-line)
+  (set (make-local-variable 'comment-start) "(* ")
+  (set (make-local-variable 'comment-end) " *)")
+  (set (make-local-variable 'comment-nested) t))
 
 (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\\)\\_>"
+                         nil t)
+      (cond
+       ((string= (match-string 0) "end")
+       (until-closed-helper (+ level 1)))
+       ((= level 0)
+       (current-indentation))
+       (t
+       (until-closed-helper (- level 1))))
+
+    0))
+
+(defun until-closed (is-with)
+  (save-excursion
+    (if is-with
+       (until-closed-helper 1)
+      (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\\)\\_>"
                                   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 "\\_<\\(with\\)\\_>")
+          (until-closed t))
+         ((looking-at "\\_<\\(end\\)\\_>")
+          (until-closed nil))
          ((not previous-keyword)
           base-indent)
          ((string= previous-keyword "end")