dot-emacs: Fix calls to mdw-regexps.
[profile] / dot-emacs.el
index 0599106..3da4450 100644 (file)
@@ -1,4 +1,4 @@
-;;; -*-emacs-lisp-*-
+;;; -*- mode: emacs-lisp; coding: utf-8 -*-
 ;;;
 ;;; $Id$
 ;;;
 ;;; along with this program; if not, write to the Free Software Foundation,
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+;;;----- Check command-line -------------------------------------------------
+
+(defvar mdw-fast-startup nil
+  "Whether .emacs should optimize for rapid startup.
+This may be at the expense of cool features.")
+(let ((probe nil) (next command-line-args))
+  (message "probe = %s" probe)
+  (message "next = %s" next)
+  (while next
+    (cond ((string= (car next) "--mdw-fast-startup")
+          (setq mdw-fast-startup t)
+          (if probe
+              (rplacd probe (cdr next))
+            (setq command-line-args (cdr next))))
+         (t
+          (setq probe next)))
+    (setq next (cdr next))))
+
 ;;;----- Some general utilities ---------------------------------------------
 
+(eval-when-compile
+  (unless (fboundp 'make-regexp)
+    (load "make-regexp"))
+  (require 'cl))
+
+(defmacro mdw-regexps (&rest list)
+  "Turn a LIST of strings into a single regular expression at compile-time."
+  `',(make-regexp list))
+
 ;; --- Some error trapping ---
 ;;
 ;; If individual bits of this file go tits-up, we don't particularly want
@@ -34,7 +61,9 @@
   "Execute FORMS without allowing errors to propagate outside."
   `(condition-case err
        ,(if (cdr forms) (cons 'progn forms) (car forms))
-     (error (message "Error (trapped): %s" (error-message-string err)))))
+     (error (message "Error (trapped): %s in %s"
+                    (error-message-string err)
+                    ',forms))))
 
 ;; --- Configuration reading ---
 
 (defun mdw-config (sym)
   "Read the configuration variable named SYM."
   (unless mdw-config
-    (setq mdw-config (with-temp-buffer
-                      (insert-file-contents "~/.mdw.conf")
-                      (replace-regexp "^[ \t]*\\(#.*\\|\\)\n" ""
-                                      nil (point-min) (point-max))
-                      (replace-regexp (concat "^[ \t]*"
-                                              "\\([-a-zA-Z0-9_.]*\\)"
-                                              "[ \t]*=[ \t]*"
-                                              "\\(.*[^ \t\n]\\|\\)"
-                                              "[ \t]**\\(\n\\|$\\)")
-                                      "(\\1 . \"\\2\") "
-                                      nil (point-min) (point-max))
-                      (car (read-from-string
-                            (concat "(" (buffer-string) ")"))))))
+    (setq mdw-config
+         (flet ((replace (what with)
+                  (goto-char (point-min))
+                  (while (re-search-forward what nil t)
+                    (replace-match with t))))
+           (with-temp-buffer
+             (insert-file-contents "~/.mdw.conf")
+             (replace  "^[ \t]*\\(#.*\\|\\)\n" "")
+             (replace (concat "^[ \t]*"
+                              "\\([-a-zA-Z0-9_.]*\\)"
+                              "[ \t]*=[ \t]*"
+                              "\\(.*[^ \t\n]\\|\\)"
+                              "[ \t]**\\(\n\\|$\\)")
+                      "(\\1 . \"\\2\")\n")
+             (car (read-from-string
+                   (concat "(" (buffer-string) ")")))))))
   (cdr (assq sym mdw-config)))
 
 ;; --- Is an Emacs library available? ---
@@ -79,18 +111,41 @@ path.  The non-nil value is the filename we found for the library."
 
 ;; --- Splitting windows ---
 
-(defconst mdw-scrollbar-width (if window-system 6 1)
-  "Guessed width of scroll bar.")
-(defun mdw-divvy-window (&optional w)
+(unless (fboundp 'scroll-bar-columns)
+  (defun scroll-bar-columns (side)
+    (cond ((eq side 'left) 0)
+         (window-system 3)
+         (t 1))))
+(unless (fboundp 'fringe-columns)
+  (defun fringe-columns (side)
+    (cond ((not window-system) 0)
+         ((eq side 'left) 1)
+         (t 2))))
+
+(defun mdw-divvy-window (&optional width)
   "Split a wide window into appropriate widths."
-  (interactive)
-  (or w (setq w 78))
-  (let ((win (selected-window))
-       (c (/ (+ (window-width) mdw-scrollbar-width)
-             (+ w mdw-scrollbar-width))))
+  (interactive "P")
+  (setq width (cond (width (prefix-numeric-value width))
+                   ((and window-system
+                         (>= emacs-major-version 22))
+                    77)
+                   (t 78)))
+  (let* ((win (selected-window))
+        (sb-width (if (not window-system)
+                      1
+                    (let ((tot 0))
+                      (dolist (what '(scroll-bar fringe))
+                        (dolist (side '(left right))
+                          (incf tot
+                                (funcall (intern (concat (symbol-name what)
+                                                         "-columns"))
+                                         side))))
+                      tot)))
+        (c (/ (+ (window-width) sb-width)
+              (+ width sb-width))))
     (while (> c 1)
       (setq c (1- c))
-      (split-window-horizontally (+ w mdw-scrollbar-width))
+      (split-window-horizontally (+ width sb-width))
       (other-window 1))
     (select-window win)))
 
@@ -128,18 +183,18 @@ symbols `sunday', `monday', etc. (or a mixture).  If the date stored in
 
 ;;;----- Utility functions --------------------------------------------------
 
-(defun line-number-at-pos (&optional pos)
-  "Print the current buffer line number and narrowed line number of point."
-  (let ((opoint (or pos (point))) start)
-    (save-excursion
-      (save-restriction
-       (goto-char (point-min))
-       (widen)
-       (forward-line 0)
-       (setq start (point))
-       (goto-char opoint)
-       (forward-line 0)
-       (1+ (count-lines 1 (point)))))))
+(or (fboundp 'line-number-at-pos)
+    (defun line-number-at-pos (&optional pos)
+      (let ((opoint (or pos (point))) start)
+       (save-excursion
+         (save-restriction
+           (goto-char (point-min))
+           (widen)
+           (forward-line 0)
+           (setq start (point))
+           (goto-char opoint)
+           (forward-line 0)
+           (1+ (count-lines 1 (point))))))))
 
 ;; --- mdw-uniquify-alist ---
 
@@ -241,22 +296,23 @@ input lists are not modified, although they'll probably become garbage."
     (or arg (progn
              (goto-char (point-max))
              (insert "\nNP: ")
-             (insert-file np-file)))))
-
-(trap
-  (require 'tramp)
-  (require 'autorevert)
-  (defun mdw-check-autorevert ()
-    (if (and (buffer-file-name)
-            (tramp-tramp-file-p (buffer-file-name)))
-       (unless global-auto-revert-ignore-buffer
-         (setq global-auto-revert-ignore-buffer 'tramp))
-       (if (eq global-auto-revert-ignore-buffer 'tramp)
-           (setq global-auto-revert-ignore-buffer nil))))
-  (defadvice find-file (after mdw-autorevert activate)
-    (mdw-check-autorevert))
-  (defadvice write-file (after mdw-autorevert activate)
-    (mdw-check-autorevert)))
+             (insert-file-contents np-file)))))
+
+(defun mdw-check-autorevert ()
+  "Sets global-auto-revert-ignore-buffer appropriately for this buffer,
+taking into consideration whether it's been found using tramp, which seems to
+get itself into a twist."
+  (cond ((and (buffer-file-name)
+             (tramp-tramp-file-p (buffer-file-name)))
+        (unless global-auto-revert-ignore-buffer
+          (setq global-auto-revert-ignore-buffer 'tramp)))
+       ((eq global-auto-revert-ignore-buffer 'tramp)
+        (setq global-auto-revert-ignore-buffer nil))))
+
+(defadvice find-file (after mdw-autorevert activate)
+  (mdw-check-autorevert))
+(defadvice write-file (after mdw-autorevert activate)
+  (mdw-check-autorevert))
 
 (defun mdwmail-mode ()
   "Major mode for editing news and mail messages from external programs
@@ -559,11 +615,15 @@ doesn't cope with anything approximating a complicated case."
       ,@(cond ((eq window-system 'w32)
               '(:family "courier new" :height 85))
              ((eq window-system 'x)
-              '(:family "misc-fixed" :width semi-condensed))))
-    (modeline :foreground "blue" :background "yellow"
-             :box (:line-width 1 :style released-button))
+              '(:family "misc-fixed" :height 130 :width semi-condensed))))
+    (fixed-pitch)
+    (minibuffer-prompt)
+    (mode-line :foreground "blue" :background "yellow"
+              :box (:line-width 1 :style released-button))
+    (mode-line-inactive :foreground "yellow" :background "blue"
+                       :box (:line-width 1 :style released-button))
     (scroll-bar :foreground "black" :background "lightgrey")
-    (fringe :foreground "yellow" :background "grey30")
+    (fringe :foreground "yellow" :background "black")
     (show-paren-match-face :background "darkgreen")
     (show-paren-mismatch-face :background "red")
     (font-lock-warning-face :background "red" :weight bold)
@@ -580,6 +640,9 @@ doesn't cope with anything approximating a complicated case."
     (mdw-number-face :foreground "yellow")
     (font-lock-function-name-face :weight bold)
     (font-lock-variable-name-face :slant italic)
+    (font-lock-comment-delimiter-face
+       :foreground ,(if window-system "SeaGreen1" "green")
+       :slant italic)
     (font-lock-comment-face
        :foreground ,(if window-system "SeaGreen1" "green")
        :slant italic)
@@ -589,12 +652,14 @@ doesn't cope with anything approximating a complicated case."
     (font-lock-reference-face :weight bold)
     (woman-bold-face :weight bold)
     (woman-italic-face :slant italic)
-    (diff-header-face :foreground "skyblue1")
-    (diff-index-face :weight bold)
-    (diff-file-header-face)
-    (diff-context-face :foreground "grey70")
-    (diff-added-face :foreground "white")
-    (diff-removed-face :foreground "white" :slant italic)
+    (diff-index :weight bold)
+    (diff-file-header :weight bold)
+    (diff-hunk-header :foreground "SkyBlue1")
+    (diff-function :foreground "SkyBlue1" :weight bold)
+    (diff-header :background "grey10")
+    (diff-added :foreground "green")
+    (diff-removed :foreground "red")
+    (diff-context)
     (whizzy-slice-face :background "grey10")
     (whizzy-error-face :background "darkred")
     (trailing-whitespace :background "red")
@@ -633,7 +698,7 @@ doesn't cope with anything approximating a complicated case."
                                  (label . 0)
                                  (case-label . +)
                                  (access-label . -)
-                                 (inclass . ++)
+                                 (inclass . +)
                                  (inline-open . ++)
                                  (statement-cont . 0)
                                  (statement-case-intro . +)))
@@ -665,117 +730,115 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '(
-                       "and"           ;C++
-                       "and_eq"        ;C++
-                       "asm"           ;K&R, GCC
-                       "auto"          ;K&R, C89
-                       "bitand"        ;C++
-                       "bitor"         ;C++
-                       "bool"          ;C++, C9X macro
-                       "break"         ;K&R, C89
-                       "case"          ;K&R, C89
-                       "catch"         ;C++
-                       "char"          ;K&R, C89
-                       "class"         ;C++
-                       "complex"       ;C9X macro, C++ template type
-                       "compl"         ;C++
-                       "const"         ;C89
-                       "const_cast"    ;C++
-                       "continue"      ;K&R, C89
-                       "defined"       ;C89 preprocessor
-                       "default"       ;K&R, C89
-                       "delete"        ;C++
-                       "do"            ;K&R, C89
-                       "double"        ;K&R, C89
-                       "dynamic_cast"  ;C++
-                       "else"          ;K&R, C89
-                       ;; "entry"      ;K&R -- never used
-                       "enum"          ;C89
-                       "explicit"      ;C++
-                       "export"        ;C++
-                       "extern"        ;K&R, C89
-                       "false"         ;C++, C9X macro
-                       "float"         ;K&R, C89
-                       "for"           ;K&R, C89
-                       ;; "fortran"    ;K&R
-                       "friend"        ;C++
-                       "goto"          ;K&R, C89
-                       "if"            ;K&R, C89
-                       "imaginary"     ;C9X macro
-                       "inline"        ;C++, C9X, GCC
-                       "int"           ;K&R, C89
-                       "long"          ;K&R, C89
-                       "mutable"       ;C++
-                       "namespace"     ;C++
-                       "new"           ;C++
-                       "operator"      ;C++
-                       "or"            ;C++
-                       "or_eq"         ;C++
-                       "private"       ;C++
-                       "protected"     ;C++
-                       "public"        ;C++
-                       "register"      ;K&R, C89
-                       "reinterpret_cast" ;C++
-                       "restrict"      ;C9X
-                       "return"        ;K&R, C89
-                       "short"         ;K&R, C89
-                       "signed"        ;C89
-                       "sizeof"        ;K&R, C89
-                       "static"        ;K&R, C89
-                       "static_cast"   ;C++
-                       "struct"        ;K&R, C89
-                       "switch"        ;K&R, C89
-                       "template"      ;C++
-                       "this"          ;C++
-                       "throw"         ;C++
-                       "true"          ;C++, C9X macro
-                       "try"           ;C++
-                       "this"          ;C++
-                       "typedef"       ;C89
-                       "typeid"        ;C++
-                       "typeof"        ;GCC
-                       "typename"      ;C++
-                       "union"         ;K&R, C89
-                       "unsigned"      ;K&R, C89
-                       "using"         ;C++
-                       "virtual"       ;C++
-                       "void"          ;C89
-                       "volatile"      ;C89
-                       "wchar_t"       ;C++, C89 library type
-                       "while"         ;K&R, C89
-                       "xor"           ;C++
-                       "xor_eq"        ;C++
-                       "_Bool"         ;C9X
-                       "_Complex"      ;C9X
-                       "_Imaginary"    ;C9X
-                       "_Pragma"       ;C9X preprocessor
-                       "__alignof__"   ;GCC
-                       "__asm__"       ;GCC
-                       "__attribute__" ;GCC
-                       "__complex__"   ;GCC
-                       "__const__"     ;GCC
-                       "__extension__" ;GCC
-                       "__imag__"      ;GCC
-                       "__inline__"    ;GCC
-                       "__label__"     ;GCC
-                       "__real__"      ;GCC
-                       "__signed__"    ;GCC
-                       "__typeof__"    ;GCC
-                       "__volatile__"  ;GCC
-                       )))
+        (mdw-regexps "and"             ;C++
+                     "and_eq"          ;C++
+                     "asm"             ;K&R, GCC
+                     "auto"            ;K&R, C89
+                     "bitand"          ;C++
+                     "bitor"           ;C++
+                     "bool"            ;C++, C9X macro
+                     "break"           ;K&R, C89
+                     "case"            ;K&R, C89
+                     "catch"           ;C++
+                     "char"            ;K&R, C89
+                     "class"           ;C++
+                     "complex"         ;C9X macro, C++ template type
+                     "compl"           ;C++
+                     "const"           ;C89
+                     "const_cast"      ;C++
+                     "continue"        ;K&R, C89
+                     "defined"         ;C89 preprocessor
+                     "default"         ;K&R, C89
+                     "delete"          ;C++
+                     "do"              ;K&R, C89
+                     "double"          ;K&R, C89
+                     "dynamic_cast"    ;C++
+                     "else"            ;K&R, C89
+                     ;; "entry"        ;K&R -- never used
+                     "enum"            ;C89
+                     "explicit"        ;C++
+                     "export"          ;C++
+                     "extern"          ;K&R, C89
+                     "false"           ;C++, C9X macro
+                     "float"           ;K&R, C89
+                     "for"             ;K&R, C89
+                     ;; "fortran"      ;K&R
+                     "friend"          ;C++
+                     "goto"            ;K&R, C89
+                     "if"              ;K&R, C89
+                     "imaginary"       ;C9X macro
+                     "inline"          ;C++, C9X, GCC
+                     "int"             ;K&R, C89
+                     "long"            ;K&R, C89
+                     "mutable"         ;C++
+                     "namespace"       ;C++
+                     "new"             ;C++
+                     "operator"        ;C++
+                     "or"              ;C++
+                     "or_eq"           ;C++
+                     "private"         ;C++
+                     "protected"       ;C++
+                     "public"          ;C++
+                     "register"        ;K&R, C89
+                     "reinterpret_cast" ;C++
+                     "restrict"         ;C9X
+                     "return"           ;K&R, C89
+                     "short"            ;K&R, C89
+                     "signed"           ;C89
+                     "sizeof"           ;K&R, C89
+                     "static"           ;K&R, C89
+                     "static_cast"      ;C++
+                     "struct"           ;K&R, C89
+                     "switch"           ;K&R, C89
+                     "template"         ;C++
+                     "this"             ;C++
+                     "throw"            ;C++
+                     "true"             ;C++, C9X macro
+                     "try"              ;C++
+                     "this"             ;C++
+                     "typedef"          ;C89
+                     "typeid"           ;C++
+                     "typeof"           ;GCC
+                     "typename"         ;C++
+                     "union"            ;K&R, C89
+                     "unsigned"         ;K&R, C89
+                     "using"            ;C++
+                     "virtual"          ;C++
+                     "void"             ;C89
+                     "volatile"         ;C89
+                     "wchar_t"          ;C++, C89 library type
+                     "while"            ;K&R, C89
+                     "xor"              ;C++
+                     "xor_eq"           ;C++
+                     "_Bool"            ;C9X
+                     "_Complex"         ;C9X
+                     "_Imaginary"       ;C9X
+                     "_Pragma"          ;C9X preprocessor
+                     "__alignof__"      ;GCC
+                     "__asm__"          ;GCC
+                     "__attribute__"    ;GCC
+                     "__complex__"      ;GCC
+                     "__const__"        ;GCC
+                     "__extension__"    ;GCC
+                     "__imag__"         ;GCC
+                     "__inline__"       ;GCC
+                     "__label__"        ;GCC
+                     "__real__"         ;GCC
+                     "__signed__"       ;GCC
+                     "__typeof__"       ;GCC
+                     "__volatile__"     ;GCC
+                     ))
        (preprocessor-keywords
-        (make-regexp '("assert" "define" "elif" "else" "endif" "error"
-                       "ident" "if" "ifdef" "ifndef" "import" "include"
-                       "line" "pragma" "unassert" "undef" "warning")))
+        (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
+                     "ident" "if" "ifdef" "ifndef" "import" "include"
+                     "line" "pragma" "unassert" "undef" "warning"))
        (objc-keywords
-        (make-regexp '("class" "defs" "encode" "end" "implementation"
-                       "interface" "private" "protected" "protocol" "public"
-                       "selector"))))
+        (mdw-regexps "class" "defs" "encode" "end" "implementation"
+                     "interface" "private" "protected" "protocol" "public"
+                     "selector")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Fontify include files as strings ---
 
@@ -849,14 +912,13 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '("break" "case" "cd" "continue" "define" "default"
-                       "do" "else" "exit" "for" "global" "goto" "help" "if"
-                       "local" "mat" "obj" "print" "quit" "read" "return"
-                       "show" "static" "switch" "while" "write"))))
+        (mdw-regexps "break" "case" "cd" "continue" "define" "default"
+                     "do" "else" "exit" "for" "global" "goto" "help" "if"
+                     "local" "mat" "obj" "print" "quit" "read" "return"
+                     "show" "static" "switch" "while" "write")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -917,21 +979,20 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((java-keywords
-        (make-regexp '("abstract" "boolean" "break" "byte" "case" "catch"
-                       "char" "class" "const" "continue" "default" "do"
-                       "double" "else" "extends" "final" "finally" "float"
-                       "for" "goto" "if" "implements" "import" "instanceof"
-                       "int" "interface" "long" "native" "new" "package"
-                       "private" "protected" "public" "return" "short"
-                       "static" "super" "switch" "synchronized" "this"
-                       "throw" "throws" "transient" "try" "void" "volatile"
-                       "while"
-
-                       "false" "null" "true"))))
+        (mdw-regexps "abstract" "boolean" "break" "byte" "case" "catch"
+                     "char" "class" "const" "continue" "default" "do"
+                     "double" "else" "extends" "final" "finally" "float"
+                     "for" "goto" "if" "implements" "import" "instanceof"
+                     "int" "interface" "long" "native" "new" "package"
+                     "private" "protected" "public" "return" "short"
+                     "static" "super" "switch" "synchronized" "this"
+                     "throw" "throws" "transient" "try" "void" "volatile"
+                     "while"
+
+                     "false" "null" "true")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -993,26 +1054,25 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((csharp-keywords
-        (make-regexp '("abstract" "as" "base" "bool" "break"
-                       "byte" "case" "catch" "char" "checked"
-                       "class" "const" "continue" "decimal" "default"
-                       "delegate" "do" "double" "else" "enum"
-                       "event" "explicit" "extern" "false" "finally"
-                       "fixed" "float" "for" "foreach" "goto"
-                       "if" "implicit" "in" "int" "interface"
-                       "internal" "is" "lock" "long" "namespace"
-                       "new" "null" "object" "operator" "out"
-                       "override" "params" "private" "protected" "public"
-                       "readonly" "ref" "return" "sbyte" "sealed"
-                       "short" "sizeof" "stackalloc" "static" "string"
-                       "struct" "switch" "this" "throw" "true"
-                       "try" "typeof" "uint" "ulong" "unchecked"
-                       "unsafe" "ushort" "using" "virtual" "void"
-                       "volatile" "while" "yield"))))
+        (mdw-regexps "abstract" "as" "base" "bool" "break"
+                     "byte" "case" "catch" "char" "checked"
+                     "class" "const" "continue" "decimal" "default"
+                     "delegate" "do" "double" "else" "enum"
+                     "event" "explicit" "extern" "false" "finally"
+                     "fixed" "float" "for" "foreach" "goto"
+                     "if" "implicit" "in" "int" "interface"
+                     "internal" "is" "lock" "long" "namespace"
+                     "new" "null" "object" "operator" "out"
+                     "override" "params" "private" "protected" "public"
+                     "readonly" "ref" "return" "sbyte" "sealed"
+                     "short" "sizeof" "stackalloc" "static" "string"
+                     "struct" "switch" "this" "throw" "true"
+                     "try" "typeof" "uint" "ulong" "unchecked"
+                     "unsafe" "ushort" "using" "virtual" "void"
+                     "volatile" "while" "yield")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -1071,21 +1131,20 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
-                       "ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR"
-                       "FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS"
-                       "RSTART" "RLENGTH" "RT" "SUBSEP"
-                       "atan2" "break" "close" "continue" "cos" "delete"
-                       "do" "else" "exit" "exp" "fflush" "file" "for" "func"
-                       "function" "gensub" "getline" "gsub" "if" "in"
-                       "index" "int" "length" "log" "match" "next" "rand"
-                       "return" "print" "printf" "sin" "split" "sprintf"
-                       "sqrt" "srand" "strftime" "sub" "substr" "system"
-                       "systime" "tolower" "toupper" "while"))))
+        (mdw-regexps "BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
+                     "ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR"
+                     "FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS"
+                     "RSTART" "RLENGTH" "RT"   "SUBSEP"
+                     "atan2" "break" "close" "continue" "cos" "delete"
+                     "do" "else" "exit" "exp" "fflush" "file" "for" "func"
+                     "function" "gensub" "getline" "gsub" "if" "in"
+                     "index" "int" "length" "log" "match" "next" "rand"
+                     "return" "print" "printf" "sin" "split" "sprintf"
+                     "sqrt" "srand" "strftime" "sub" "substr" "system"
+                     "systime" "tolower" "toupper" "while")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -1136,15 +1195,14 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
-        (make-regexp '("and" "cmp" "continue" "do" "else" "elsif" "eq"
-                       "for" "foreach" "ge" "gt" "goto" "if"
-                       "last" "le" "lt" "local" "my" "ne" "next" "or"
-                       "package" "redo" "require" "return" "sub"
-                       "undef" "unless" "until" "use" "while"))))
+        (mdw-regexps "and" "cmp" "continue" "do" "else" "elsif" "eq"
+                     "for" "foreach" "ge" "gt" "goto" "if"
+                     "last" "le" "lt" "local" "my" "ne" "next" "or"
+                     "package" "redo" "require" "return" "sub"
+                     "undef" "unless" "until" "use" "while")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1182,7 +1240,6 @@ strip numbers instead."
 
 ;; --- Define Python fontification style ---
 
-(trap (require 'pyrex-mode))
 (defun mdw-fontify-python ()
 
   ;; --- Miscellaneous fiddling ---
@@ -1194,14 +1251,13 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((python-keywords
-        (make-regexp '("and" "as" "assert" "break" "class" "continue" "def"
-                       "del" "elif" "else" "except" "exec" "finally" "for"
-                       "from" "global" "if" "import" "in" "is" "lambda"
-                       "not" "or" "pass" "print" "raise" "return" "try"
-                       "while" "yield"))))
+        (mdw-regexps "and" "as" "assert" "break" "class" "continue" "def"
+                     "del" "elif" "else" "except" "exec" "finally" "for"
+                     "from" "global" "if" "import" "in" "is" "lambda"
+                     "not" "or" "pass" "print" "raise" "return" "try"
+                     "while" "yield")))
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1280,7 +1336,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Handle numbers too ---
         ;;
@@ -1328,7 +1383,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
                       "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
@@ -1372,32 +1426,31 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((rexx-keywords
-        (make-regexp '("address" "arg" "by" "call" "digits" "do" "drop"
-                       "else" "end" "engineering" "exit" "expose" "for"
-                       "forever" "form" "fuzz" "if" "interpret" "iterate"
-                       "leave" "linein" "name" "nop" "numeric" "off" "on"
-                       "options" "otherwise" "parse" "procedure" "pull"
-                       "push" "queue" "return" "say" "select" "signal"
-                       "scientific" "source" "then" "trace" "to" "until"
-                       "upper" "value" "var" "version" "when" "while"
-                       "with"
-
-                       "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x"
-                       "center" "center" "charin" "charout" "chars"
-                       "compare" "condition" "copies" "c2d" "c2x"
-                       "datatype" "date" "delstr" "delword" "d2c" "d2x"
-                       "errortext" "format" "fuzz" "insert" "lastpos"
-                       "left" "length" "lineout" "lines" "max" "min"
-                       "overlay" "pos" "queued" "random" "reverse" "right"
-                       "sign" "sourceline" "space" "stream" "strip"
-                       "substr" "subword" "symbol" "time" "translate"
-                       "trunc" "value" "verify" "word" "wordindex"
-                       "wordlength" "wordpos" "words" "xrange" "x2b" "x2c"
-                       "x2d"))))
+        (mdw-regexps "address" "arg" "by" "call" "digits" "do" "drop"
+                     "else" "end" "engineering" "exit" "expose" "for"
+                     "forever" "form" "fuzz" "if" "interpret" "iterate"
+                     "leave" "linein" "name" "nop" "numeric" "off" "on"
+                     "options" "otherwise" "parse" "procedure" "pull"
+                     "push" "queue" "return" "say" "select" "signal"
+                     "scientific" "source" "then" "trace" "to" "until"
+                     "upper" "value" "var" "version" "when" "while"
+                     "with"
+
+                     "abbrev" "abs" "bitand" "bitor" "bitxor" "b2x"
+                     "center" "center" "charin" "charout" "chars"
+                     "compare" "condition" "copies" "c2d" "c2x"
+                     "datatype" "date" "delstr" "delword" "d2c" "d2x"
+                     "errortext" "format" "fuzz" "insert" "lastpos"
+                     "left" "length" "lineout" "lines" "max" "min"
+                     "overlay" "pos" "queued" "random" "reverse" "right"
+                     "sign" "sourceline" "space" "stream" "strip"
+                     "substr" "subword" "symbol" "time" "translate"
+                     "trunc" "value" "verify" "word" "wordindex"
+                     "wordlength" "wordpos" "words" "xrange" "x2b" "x2c"
+                     "x2d")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1432,25 +1485,24 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((sml-keywords
-        (make-regexp '("abstype" "and" "andalso" "as"
-                       "case"
-                       "datatype" "do"
-                       "else" "end" "eqtype" "exception"
-                       "fn" "fun" "functor"
-                       "handle"
-                       "if" "in" "include" "infix" "infixr"
-                       "let" "local"
-                       "nonfix"
-                       "of" "op" "open" "orelse"
-                       "raise" "rec"
-                       "sharing" "sig" "signature" "struct" "structure"
-                       "then" "type"
-                       "val"
-                       "where" "while" "with" "withtype"))))
+        (mdw-regexps "abstype" "and" "andalso" "as"
+                     "case"
+                     "datatype" "do"
+                     "else" "end" "eqtype" "exception"
+                     "fn" "fun" "functor"
+                     "handle"
+                     "if" "in" "include" "infix" "infixr"
+                     "let" "local"
+                     "nonfix"
+                     "of" "op" "open" "orelse"
+                     "raise" "rec"
+                     "sharing" "sig" "signature" "struct" "structure"
+                     "then" "type"
+                     "val"
+                     "where" "while" "with" "withtype")))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1493,15 +1545,14 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
-        (make-regexp '("as" "case" "ccall" "class" "data" "default"
-                       "deriving" "do" "else" "foreign" "hiding" "if"
-                       "import" "in" "infix" "infixl" "infixr" "instance"
-                       "let" "module" "newtype" "of" "qualified" "safe"
-                       "stdcall" "then" "type" "unsafe" "where"))))
+        (mdw-regexps "as" "case" "ccall" "class" "data" "default"
+                     "deriving" "do" "else" "foreign" "hiding" "if"
+                     "import" "in" "infix" "infixl" "infixr" "instance"
+                     "let" "module" "newtype" "of" "qualified" "safe"
+                     "stdcall" "then" "type" "unsafe" "where")))
 
     (setq font-lock-keywords
          (list
-          't
           (list "--.*$"
                 '(0 font-lock-comment-face))
           (list (concat "\\<\\(" haskell-keywords "\\)\\>")
@@ -1526,7 +1577,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1574,7 +1624,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1632,6 +1681,26 @@ strip numbers instead."
         (list "[$^_{}#&]"
               '(0 mdw-punct-face)))))
 
+;;;----- SGML hacking -------------------------------------------------------
+
+(defun mdw-sgml-mode ()
+  (interactive)
+  (sgml-mode)
+  (mdw-standard-fill-prefix "")
+  (make-variable-buffer-local 'sgml-delimiters)
+  (setq sgml-delimiters
+       '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
+         "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
+         "LITA" "'" "MDC" ">" "MDO" "<!" "MINUS" "-" "MSC" "]]" "NESTC" "{"
+         "NET" "}" "OPT" "?" "OR" "|" "PERO" "%" "PIC" ">" "PIO" "<?"
+         "PLUS" "+" "REFC" "." "REP" "*" "RNI" "#" "SEQ" "," "STAGO" ":"
+         "TAGC" "." "VI" "=" "MS-START" "<![" "MS-END" "]]>"
+         "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "<!--" "XML-TAGCE" "/>"
+         "NULL" ""))
+  (setq major-mode 'mdw-sgml-mode)
+  (setq mode-name "[mdw] SGML")
+  (run-hooks 'mdw-sgml-mode-hook))
+
 ;;;----- Shell scripts ------------------------------------------------------
 
 (defun mdw-setup-sh-script-mode ()
@@ -1688,13 +1757,13 @@ strip numbers instead."
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'message-mode-keywords)
   (let ((keywords
-        (make-regexp '("array" "bitmap" "callback" "docs[ \t]+enum"
-                       "export" "enum" "fixed-octetstring" "flags"
-                       "harmless" "map" "nested" "optional"
-                       "optional-tagged" "package" "primitive"
-                       "primitive-nullfree" "relaxed[ \t]+enum"
-                       "set" "table" "tagged-optional" "union"
-                       "variadic" "vector" "version" "version-tag"))))
+        (mdw-regexps "array" "bitmap" "callback" "docs[ \t]+enum"
+                     "export" "enum" "fixed-octetstring" "flags"
+                     "harmless" "map" "nested" "optional"
+                     "optional-tagged" "package" "primitive"
+                     "primitive-nullfree" "relaxed[ \t]+enum"
+                     "set" "table" "tagged-optional"   "union"
+                     "variadic" "vector" "version" "version-tag")))
     (setq message-mode-keywords
          (list
           (list (concat "\\<\\(" keywords "\\)\\>:")
@@ -1733,9 +1802,9 @@ strip numbers instead."
   (setq comment-start "/* ")
   (setq comment-end " */")
   (let ((preprocessor-keywords
-        (make-regexp '("assert" "define" "elif" "else" "endif" "error"
-                      "ident" "if" "ifdef" "ifndef" "import" "include"
-                      "line" "pragma" "unassert" "undef" "warning"))))
+        (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
+                     "ident" "if" "ifdef" "ifndef" "import" "include"
+                     "line" "pragma" "unassert" "undef" "warning")))
     (setq message-mode-keywords
          (append (list (list (concat "^[ \t]*\\#[ \t]*"
                                      "\\(include\\|import\\)"
@@ -1777,8 +1846,8 @@ strip numbers instead."
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'mallow-driver-mode-keywords)
   (let ((keywords
-        (make-regexp '("each" "divert" "file" "if"
-                       "perl" "set" "string" "type" "write"))))
+        (mdw-regexps "each" "divert" "file" "if"
+                     "perl" "set" "string" "type" "write")))
     (setq mallow-driver-mode-keywords
          (list
           (list (concat "^%\\s *\\(}\\|\\(" keywords "\\)\\>\\).*$")
@@ -1856,7 +1925,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\<[A-Z][a-zA-Z0-9]*\\>"
               '(0 font-lock-keyword-face))
         (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
@@ -1897,7 +1965,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
               '(0 mdw-punct-face)))))
 
@@ -1907,13 +1974,16 @@ strip numbers instead."
   (and mdw-auto-indent
        (indent-for-tab-command)))
 
+(defun mdw-setup-m4 ()
+  (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
+
 ;;;----- Text mode ----------------------------------------------------------
 
 (defun mdw-text-mode ()
   (setq fill-column 72)
   (flyspell-mode t)
   (mdw-standard-fill-prefix
-   "\\([ \t]*\\([A-Za-z0-9]*[>#|:] ?\\)*[ \t]*\\)" 3)
+   "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
   (auto-fill-mode 1))
 
 ;;;----- Shell mode ---------------------------------------------------------
@@ -1924,7 +1994,7 @@ strip numbers instead."
            'comint-watch-for-password-prompt))
 
 (defun mdw-term-mode-setup ()
-  (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
+  (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
   (make-local-variable 'mouse-yank-at-point)
   (make-local-variable 'transient-mark-mode)
   (setq mouse-yank-at-point t)