dot-emacs: Squash complaints about use of interactive commands.
[profile] / dot-emacs.el
index 66f9190..0f7cc5d 100644 (file)
@@ -1,4 +1,4 @@
-;;; -*-emacs-lisp-*-
+;;; -*- mode: emacs-lisp; coding: utf-8 -*-
 ;;;
 ;;; $Id$
 ;;;
 ;;; it under the terms of the GNU General Public License as published by
 ;;; the Free Software Foundation; either version 2 of the License, or
 ;;; (at your option) any later version.
-;;; 
+;;;
 ;;; This program is distributed in the hope that it will be useful,
 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;;; GNU General Public License for more details.
-;;; 
+;;;
 ;;; You should have received a copy of the GNU General Public License
 ;;; 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 ---------------------------------------------
 
+(evan-when-compile (or (fboundp 'make-regexp)
+                      (load "make-regexp")))
+
+(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
   "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 ---
+
+(defvar mdw-config nil)
+(defun mdw-config (sym)
+  "Read the configuration variable named SYM."
+  (unless mdw-config
+    (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? ---
+
+(defun library-exists-p (name)
+  "Return non-nil if NAME.el (or NAME.elc) is somewhere on the Emacs load
+path.  The non-nil value is the filename we found for the library."
+  (let ((path load-path) elt (foundp nil))
+    (while (and path (not foundp))
+      (setq elt (car path))
+      (setq path (cdr path))
+      (setq foundp (or (let ((file (concat elt "/" name ".elc")))
+                        (and (file-exists-p file) file))
+                      (let ((file (concat elt "/" name ".el")))
+                        (and (file-exists-p file) file)))))
+    foundp))
+
+(defun maybe-autoload (symbol file &optional docstring interactivep type)
+  "Set an autoload if the file actually exists."
+  (and (library-exists-p file)
+       (autoload symbol file docstring interactivep type)))
 
 ;; --- Splitting windows ---
 
-(defconst mdw-scrollbar-width (if window-system 6 1)
-  "Guessed width of scroll bar.")
+(or (and (fboundp 'scroll-bar-columns)
+        (fboundp 'fringe-columns))
+    (progn
+      (defun scroll-bar-columns (side)
+       (cond ((eq side 'left) 0)
+             (window-system 3)
+             (t 1)))
+      (defun fringe-columns (side)
+       (cond ((not window-system) 0)
+             ((eq side 'left) 1)
+             (t 2)))))
+
 (defun mdw-divvy-window (&optional w)
   "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))))
+  (or w (setq w (if (and window-system
+                        (>= emacs-major-version 22))
+                   77
+                 78)))
+  (let* ((win (selected-window))
+        (sb-width (if (not window-system)
+                      1
+                    (+ (scroll-bar-columns 'left)
+                       (scroll-bar-columns 'right)
+                       (fringe-columns 'left)
+                       (fringe-columns 'right))))
+        (c (/ (+ (window-width) sb-width)
+              (+ w sb-width))))
     (while (> c 1)
       (setq c (1- c))
-      (split-window-horizontally (+ w mdw-scrollbar-width))
+      (split-window-horizontally (+ w sb-width))
       (other-window 1))
     (select-window win)))
 
@@ -87,6 +177,19 @@ symbols `sunday', `monday', etc. (or a mixture).  If the date stored in
 
 ;;;----- Utility functions --------------------------------------------------
 
+(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 ---
 
 (defun mdw-uniquify-alist (&rest alists)
@@ -185,24 +288,25 @@ input lists are not modified, although they'll probably become garbage."
   (interactive)
   (save-excursion
     (or arg (progn
-              (goto-char (point-max))
+             (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
@@ -251,6 +355,46 @@ Not much right now.  Just support for doing MailCrypt stuff."
     (perform-replace "\n-- \n" "\n-- " nil nil nil)))
 (add-hook 'mail-setup-hook 'mdwmail-mangle-signature)
 
+;;;----- URL viewing --------------------------------------------------------
+
+(defun mdw-w3m-browse-url (url &optional new-session-p)
+  "Invoke w3m on the URL in its current window, or at least a different one.
+If NEW-SESSION-P, start a new session."
+  (interactive "sURL: \nP")
+  (save-excursion
+    (let ((window (selected-window)))
+      (unwind-protect
+         (progn
+           (select-window (or (and (not new-session-p)
+                                   (get-buffer-window "*w3m*"))
+                              (progn
+                                (if (one-window-p t) (split-window))
+                                (get-lru-window))))
+           (w3m-browse-url url new-session-p))
+       (select-window window)))))
+
+(defvar mdw-good-url-browsers
+  '((w3m . mdw-w3m-browse-url)
+    browse-url-w3
+    browse-url-mozilla)
+  "List of good browsers for mdw-good-url-browsers; each item is a browser
+function name, or a cons (CHECK . FUNC).  A symbol FOO stands for (FOO
+. FOO).")
+
+(defun mdw-good-url-browser ()
+  "Return a good URL browser.  Trundle the list of such things, finding the
+first item for which CHECK is fboundp, and returning the correponding FUNC."
+  (let ((bs mdw-good-url-browsers) b check func answer)
+    (while (and bs (not answer))
+      (setq b (car bs)
+           bs (cdr bs))
+      (if (consp b)
+         (setq check (car b) func (cdr b))
+       (setq check b func b))
+      (if (fboundp check)
+         (setq answer func)))
+    answer))
+
 ;;;----- Paragraph filling --------------------------------------------------
 
 ;; --- Useful variables ---
@@ -408,16 +552,20 @@ doesn't cope with anything approximating a complicated case."
   (and mdw-auto-indent
        (cond ((eq major-mode 'lisp-mode)
              (local-set-key "\C-m" 'mdw-indent-newline-and-indent))
-            ((eq major-mode 'slime-repl-mode) nil)
+            ((or (eq major-mode 'slime-repl-mode)
+                 (eq major-mode 'asm-mode))
+             nil)
             (t
              (local-set-key "\C-m" 'newline-and-indent))))
   (local-set-key [C-return] 'newline)
-  (local-set-key [?\;] 'self-insert-command)
+  (or (eq major-mode 'asm-mode)
+      (local-set-key [?\;] 'self-insert-command))
   (local-set-key [?\#] 'self-insert-command)
   (local-set-key [?\"] 'self-insert-command)
   (setq comment-column 40)
   (auto-fill-mode 1)
   (setq fill-column 77)
+  (setq show-trailing-whitespace t)
   (mdw-set-font))
 
 ;; --- Set up all sorts of faces ---
@@ -431,26 +579,28 @@ doesn't cope with anything approximating a complicated case."
 
 ;;;----- General fontification ----------------------------------------------
 
-(defun mdw-set-fonts (frame ff)
-  (if ff (progn (set-face-attribute (caar ff) frame
-                                   :family 'unspecified
-                                   :width 'unspecified
-                                   :height 'unspecified
-                                   :weight 'unspecified
-                                   :slant 'unspecified
-                                   :foreground 'unspecified
-                                   :background 'unspecified
-                                   :underline 'unspecified
-                                   :overline 'unspecified
-                                   :strike-through 'unspecified
-                                   :box 'unspecified
-                                   :inverse-video 'unspecified
-                                   :stipple 'unspecified
-;                                  :font 'unspecified
-                                   :inherit 'unspecified
-                                   )
-               (apply 'set-face-attribute (caar ff) frame (cdar ff))
-               (mdw-set-fonts frame (cdr ff)))))
+(defun mdw-set-fonts (frame faces)
+  (while faces
+    (let ((face (caar faces)))
+      (or (facep face) (make-face face))
+      (set-face-attribute face frame
+                         :family 'unspecified
+                         :width 'unspecified
+                         :height 'unspecified
+                         :weight 'unspecified
+                         :slant 'unspecified
+                         :foreground 'unspecified
+                         :background 'unspecified
+                         :underline 'unspecified
+                         :overline 'unspecified
+                         :strike-through 'unspecified
+                         :box 'unspecified
+                         :inverse-video 'unspecified
+                         :stipple 'unspecified
+                         ;:font 'unspecified
+                         :inherit 'unspecified)
+      (apply 'set-face-attribute face frame (cdar faces))
+      (setq faces (cdr faces)))))
 
 (defun mdw-do-set-font (&optional frame)
   (interactive)
@@ -459,11 +609,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)
@@ -480,6 +634,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)
@@ -489,14 +646,17 @@ 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")
 )))
 
 (defun mdw-set-font ()
@@ -532,7 +692,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 . +)))
@@ -553,8 +713,6 @@ doesn't cope with anything approximating a complicated case."
   (setq c-hanging-comment-ender-p nil)
   (setq c-backslash-column 72)
   (setq c-label-minimum-indentation 0)
-  (setq comment-start "/* ")
-  (setq comment-end " */")
   (setq mdw-fill-prefix
        `((,(concat "\\([ \t]*/?\\)"
                    "\\([\*/][ \t]*\\)"
@@ -564,15 +722,15 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Now define things to be fontified ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '(
-                       ;; "and"        ;C++
-                       ;; "and_eq"     ;C++
+        (mdw-regexps '(
+                       "and"           ;C++
+                       "and_eq"        ;C++
                        "asm"           ;K&R, GCC
                        "auto"          ;K&R, C89
-                       ;; "bitand"     ;C++
-                       ;; "bitor"      ;C++
+                       "bitand"        ;C++
+                       "bitor"         ;C++
                        "bool"          ;C++, C9X macro
                        "break"         ;K&R, C89
                        "case"          ;K&R, C89
@@ -580,7 +738,7 @@ doesn't cope with anything approximating a complicated case."
                        "char"          ;K&R, C89
                        "class"         ;C++
                        "complex"       ;C9X macro, C++ template type
-                       ;; "compl"      ;C++
+                       "compl"         ;C++
                        "const"         ;C89
                        "const_cast"    ;C++
                        "continue"      ;K&R, C89
@@ -594,12 +752,12 @@ doesn't cope with anything approximating a complicated case."
                        ;; "entry"      ;K&R -- never used
                        "enum"          ;C89
                        "explicit"      ;C++
-                       ;; "export"     ;C++
+                       "export"        ;C++
                        "extern"        ;K&R, C89
                        "false"         ;C++, C9X macro
                        "float"         ;K&R, C89
                        "for"           ;K&R, C89
-                       "fortran"       ;K&R
+                       ;; "fortran"    ;K&R
                        "friend"        ;C++
                        "goto"          ;K&R, C89
                        "if"            ;K&R, C89
@@ -611,8 +769,8 @@ doesn't cope with anything approximating a complicated case."
                        "namespace"     ;C++
                        "new"           ;C++
                        "operator"      ;C++
-                       ;; "or"         ;C++
-                       ;; "or_eq"      ;C++
+                       "or"            ;C++
+                       "or_eq"         ;C++
                        "private"       ;C++
                        "protected"     ;C++
                        "public"        ;C++
@@ -645,8 +803,8 @@ doesn't cope with anything approximating a complicated case."
                        "volatile"      ;C89
                        "wchar_t"       ;C++, C89 library type
                        "while"         ;K&R, C89
-                       ;; "xor"        ;C++
-                       ;; "xor_eq"     ;C++
+                       "xor"           ;C++
+                       "xor_eq"        ;C++
                        "_Bool"         ;C9X
                        "_Complex"      ;C9X
                        "_Imaginary"    ;C9X
@@ -666,17 +824,16 @@ doesn't cope with anything approximating a complicated case."
                        "__volatile__"  ;GCC
                        )))
        (preprocessor-keywords
-        (make-regexp '("assert" "define" "elif" "else" "endif" "error"
+        (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"
+        (mdw-regexps '("class" "defs" "encode" "end" "implementation"
                        "interface" "private" "protected" "protocol" "public"
                        "selector"))))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Fontify include files as strings ---
 
@@ -748,16 +905,15 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Now define things to be fontified ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '("break" "case" "cd" "continue" "define" "default"
+        (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 ---
 
@@ -816,9 +972,9 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Now define things to be fontified ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((java-keywords
-        (make-regexp '("abstract" "boolean" "break" "byte" "case" "catch"
+        (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"
@@ -832,7 +988,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -855,6 +1010,94 @@ doesn't cope with anything approximating a complicated case."
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                 '(0 mdw-punct-face))))))
 
+;;;----- C# programming configuration ---------------------------------------
+
+;; --- Make indentation nice ---
+
+(defun mdw-csharp-style ()
+  (c-add-style "[mdw] C# style"
+              '((c-basic-offset . 2)
+                (c-tab-always-indent . nil)
+                (c-offsets-alist (substatement-open . 0)
+                                 (label . 0)
+                                 (case-label . +)
+                                 (access-label . 0)
+                                 (inclass . +)
+                                 (statement-case-intro . +)))
+              t))
+
+;; --- Declare C# fontification style ---
+
+(defun mdw-fontify-csharp ()
+
+  ;; --- Other stuff ---
+
+  (mdw-csharp-style)
+  (modify-syntax-entry ?_ "w")
+  (setq c-hanging-comment-ender-p nil)
+  (setq c-backslash-column 72)
+  (setq comment-start "/* ")
+  (setq comment-end " */")
+  (setq mdw-fill-prefix
+       `((,(concat "\\([ \t]*/?\\)"
+                   "\\([\*/][ \t]*\\)"
+                   "\\([A-Za-z]+:[ \t]*\\)?"
+                   mdw-hanging-indents)
+          (pad . 1) (match . 2) (pad . 3) (pad . 4))))
+
+  ;; --- Now define things to be fontified ---
+
+  (make-local-variable 'font-lock-keywords)
+  (let ((csharp-keywords
+        (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
+
+          ;; --- Handle the keywords defined above ---
+
+          (list (concat "\\<\\(" csharp-keywords "\\)\\>")
+                '(0 font-lock-keyword-face))
+
+          ;; --- Handle numbers too ---
+          ;;
+          ;; The following isn't quite right, but it's close enough.
+
+          (list (concat "\\<\\("
+                        "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+                        "[0-9]+\\(\\.[0-9]*\\|\\)"
+                        "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
+                        "[lLfFdD]?")
+                '(0 mdw-number-face))
+
+          ;; --- And anything else is punctuation ---
+
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face))))))
+
+(defun csharp-mode ()
+  (interactive)
+  (java-mode)
+  (setq major-mode 'csharp-mode)
+  (setq mode-name "C#")
+  (mdw-fontify-csharp)
+  (run-hooks 'csharp-mode-hook))
+
 ;;;----- Awk programming configuration --------------------------------------
 
 ;; --- Make Awk indentation nice ---
@@ -881,9 +1124,9 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Now define things to be fontified ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
+        (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"
@@ -897,7 +1140,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -946,9 +1188,9 @@ doesn't cope with anything approximating a complicated case."
 
   ;; --- Now define fontification things ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
-        (make-regexp '("and" "cmp" "continue" "do" "else" "elsif" "eq"
+        (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"
@@ -956,7 +1198,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -994,7 +1235,6 @@ strip numbers instead."
 
 ;; --- Define Python fontification style ---
 
-(trap (require 'pyrex-mode))
 (defun mdw-fontify-python ()
 
   ;; --- Miscellaneous fiddling ---
@@ -1004,16 +1244,15 @@ strip numbers instead."
 
   ;; --- Now define fontification things ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((python-keywords
-        (make-regexp '("and" "as" "assert" "break" "class" "continue" "def"
+        (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"))))
+                       "while" "yield"))))
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1089,10 +1328,9 @@ strip numbers instead."
 
   ;; --- Fiddle with fontification ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Handle numbers too ---
         ;;
@@ -1124,15 +1362,22 @@ strip numbers instead."
 
   (run-hooks 'arm-assembler-mode-hook))
 
+;;;----- Assembler mode -----------------------------------------------------
+
+(defun mdw-fontify-asm ()
+  (modify-syntax-entry ?' "\"")
+  (modify-syntax-entry ?. "w")
+  (setf fill-prefix nil)
+  (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
+
 ;;;----- TCL configuration --------------------------------------------------
 
 (defun mdw-fontify-tcl ()
   (mapcar #'(lambda (ch) (modify-syntax-entry ch ".")) '(?$))
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
-  (make-local-variable  'font-lock-keywords)
+  (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_]+\\|\\)")
@@ -1174,9 +1419,9 @@ strip numbers instead."
   (setq rexx-tab-always-indent nil)
   (setq rexx-cont-indent rexx-indent)
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((rexx-keywords
-        (make-regexp '("address" "arg" "by" "call" "digits" "do" "drop"
+        (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"
@@ -1201,7 +1446,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1234,9 +1478,9 @@ strip numbers instead."
 
   ;; --- Now define fontification things ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((sml-keywords
-        (make-regexp '("abstype" "and" "andalso" "as"
+        (mdw-regexps '("abstype" "and" "andalso" "as"
                        "case"
                        "datatype" "do"
                        "else" "end" "eqtype" "exception"
@@ -1254,7 +1498,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1265,10 +1508,10 @@ strip numbers instead."
 
           (list (concat "\\<\\(\\~\\|\\)"
                            "\\(0\\(\\([wW]\\|\\)[xX][0-9a-fA-F]+\\|"
-                                  "[wW][0-9]+\\)\\|"
-                               "\\([0-9]+\\(\\.[0-9]+\\|\\)"
-                                        "\\([eE]\\(\\~\\|\\)"
-                                               "[0-9]+\\|\\)\\)\\)")
+                                  "[wW][0-9]+\\)\\|"
+                               "\\([0-9]+\\(\\.[0-9]+\\|\\)"
+                                        "\\([eE]\\(\\~\\|\\)"
+                                               "[0-9]+\\|\\)\\)\\)")
                 '(0 mdw-number-face))
 
           ;; --- And anything else is punctuation ---
@@ -1295,9 +1538,9 @@ strip numbers instead."
 
   ;; --- Fiddle with fontification ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
-        (make-regexp '("as" "case" "ccall" "class" "data" "default"
+        (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"
@@ -1305,7 +1548,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
           (list "--.*$"
                 '(0 font-lock-comment-face))
           (list (concat "\\<\\(" haskell-keywords "\\)\\>")
@@ -1327,10 +1569,9 @@ strip numbers instead."
 
   ;; --- Real fontification things ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1375,10 +1616,9 @@ strip numbers instead."
 
   ;; --- Real fontification things ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1400,31 +1640,31 @@ strip numbers instead."
         ;; --- Handle @/.../ for italics ---
 
         ;; (list "\\(@/\\)\\([^/]*\\)\\(/\\)"
-        ;;       '(1 font-lock-keyword-face)
-        ;;       '(3 font-lock-keyword-face))
+        ;;       '(1 font-lock-keyword-face)
+        ;;       '(3 font-lock-keyword-face))
 
         ;; --- Handle @*...* for boldness ---
 
         ;; (list "\\(@\\*\\)\\([^*]*\\)\\(\\*\\)"
-        ;;       '(1 font-lock-keyword-face)
-        ;;       '(3 font-lock-keyword-face))
+        ;;       '(1 font-lock-keyword-face)
+        ;;       '(3 font-lock-keyword-face))
 
         ;; --- Handle @`...' for literal syntax things ---
 
         ;; (list "\\(@`\\)\\([^']*\\)\\('\\)"
-        ;;       '(1 font-lock-keyword-face)
-        ;;       '(3 font-lock-keyword-face))
+        ;;       '(1 font-lock-keyword-face)
+        ;;       '(3 font-lock-keyword-face))
 
         ;; --- Handle @<...> for nonterminals ---
 
         ;; (list "\\(@<\\)\\([^>]*\\)\\(>\\)"
-        ;;       '(1 font-lock-keyword-face)
-        ;;       '(3 font-lock-keyword-face))
+        ;;       '(1 font-lock-keyword-face)
+        ;;       '(3 font-lock-keyword-face))
 
         ;; --- Handle other @-commands ---
 
         ;; (list "@\\([^a-zA-Z]\\|[a-zA-Z]*\\)"
-        ;;       '(0 font-lock-keyword-face))
+        ;;       '(0 font-lock-keyword-face))
 
         ;; --- Make sure we get comments properly ---
 
@@ -1436,6 +1676,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 ()
@@ -1492,7 +1752,7 @@ 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"
+        (mdw-regexps '("array" "bitmap" "callback" "docs[ \t]+enum"
                        "export" "enum" "fixed-octetstring" "flags"
                        "harmless" "map" "nested" "optional"
                        "optional-tagged" "package" "primitive"
@@ -1537,7 +1797,7 @@ strip numbers instead."
   (setq comment-start "/* ")
   (setq comment-end " */")
   (let ((preprocessor-keywords
-        (make-regexp '("assert" "define" "elif" "else" "endif" "error"
+        (mdw-regexps '("assert" "define" "elif" "else" "endif" "error"
                       "ident" "if" "ifdef" "ifndef" "import" "include"
                       "line" "pragma" "unassert" "undef" "warning"))))
     (setq message-mode-keywords
@@ -1547,15 +1807,14 @@ strip numbers instead."
                              '(2 font-lock-string-face))
                        (list (concat "^\\([ \t]*#[ \t]*\\(\\("
                                      preprocessor-keywords
-                                     "\\)\\>\\|[0-9]+\\|$\\)\\)")
+                                     "\\)\\>\\|[0-9]+\\|$\\)\\)")
                              '(1 font-lock-keyword-face)))
                  message-mode-keywords)))
-  (setq font-lock-defaults
-       '(message-mode-keywords nil nil nil nil))
   (turn-on-font-lock-if-enabled)
-  (run-hooks 'messages-mode-hook))
+  (run-hooks 'cpp-messages-mode-hook))
 
-(add-hook 'messages-file-hook 'mdw-misc-mode-config t)
+(add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
+(add-hook 'cpp-messages-mode-hook 'mdw-misc-mode-config t)
 ; (add-hook 'messages-file-hook 'mdw-fontify-messages t)
 
 ;;;----- Messages-file mode -------------------------------------------------
@@ -1582,7 +1841,7 @@ strip numbers instead."
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'mallow-driver-mode-keywords)
   (let ((keywords
-        (make-regexp '("each" "divert" "file" "if"
+        (mdw-regexps '("each" "divert" "file" "if"
                        "perl" "set" "string" "type" "write"))))
     (setq mallow-driver-mode-keywords
          (list
@@ -1658,10 +1917,9 @@ strip numbers instead."
   (local-set-key "\C-i" 'smalltalk-reindent))
 
 (defun mdw-fontify-smalltalk ()
-  (make-local-variable  'font-lock-keywords)
+  (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_]+\\)\\|"
@@ -1699,10 +1957,9 @@ strip numbers instead."
 
   ;; --- Not much fontification needed ---
 
-  (make-local-variable  'font-lock-keywords)
+  (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
               '(0 mdw-punct-face)))))
 
@@ -1712,13 +1969,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 ---------------------------------------------------------
@@ -1729,7 +1989,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)