chiark / gitweb /
el/dot-emacs.el (mdw-switch-window-configuration): Print a message afterwards.
[profile] / el / dot-emacs.el
index b65c132037b1dd447c984016aa36c8d959370cd8..9088736fcd183a9c504756dd9b20cbcb456c4d42 100644 (file)
 ;;;--------------------------------------------------------------------------
 ;;; Check command-line.
 
 ;;;--------------------------------------------------------------------------
 ;;; Check command-line.
 
+(defgroup mdw nil
+  "Customization for mdw's Emacs configuration."
+  :prefix "mdw-")
+
+(defun mdw-check-command-line-switch (switch)
+  (let ((probe nil) (next command-line-args) (found nil))
+    (while next
+      (cond ((string= (car next) switch)
+            (setq found t)
+            (if probe (rplacd probe (cdr next))
+              (setq command-line-args (cdr next))))
+           (t
+            (setq probe next)))
+      (setq next (cdr next)))
+    found))
+
 (defvar mdw-fast-startup nil
   "Whether .emacs should optimize for rapid startup.
 This may be at the expense of cool features.")
 (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))
-  (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))))
+(setq mdw-fast-startup
+      (mdw-check-command-line-switch "--mdw-fast-startup"))
+
+(defvar mdw-splashy-startup nil
+  "Whether to show a splash screen and related frippery.")
+(setq mdw-splashy-startup
+      (mdw-check-command-line-switch "--mdw-splashy-startup"))
 
 ;;;--------------------------------------------------------------------------
 ;;; Some general utilities.
 
 (eval-when-compile
 
 ;;;--------------------------------------------------------------------------
 ;;; Some general utilities.
 
 (eval-when-compile
-  (unless (fboundp 'make-regexp)
-    (load "make-regexp"))
+  (unless (fboundp 'make-regexp) (load "make-regexp"))
   (require 'cl))
 
 (defmacro mdw-regexps (&rest list)
   (require 'cl))
 
 (defmacro mdw-regexps (&rest list)
@@ -85,31 +97,33 @@ (defun mdw-config (sym)
   "Read the configuration variable named SYM."
   (unless mdw-config
     (setq mdw-config
   "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) ")")))))))
+           (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)))
 
 ;; Width configuration.
 
   (cdr (assq sym mdw-config)))
 
 ;; Width configuration.
 
-(defvar mdw-column-width
+(defcustom mdw-column-width
   (string-to-number (or (mdw-config 'emacs-width) "77"))
   (string-to-number (or (mdw-config 'emacs-width) "77"))
-  "Width of Emacs columns.")
-(defvar mdw-text-width mdw-column-width
-  "Expected width of text within columns.")
-(put 'mdw-text-width 'safe-local-variable 'integerp)
+  "Width of Emacs columns."
+  :type 'integer)
+(defcustom mdw-text-width mdw-column-width
+  "Expected width of text within columns."
+  :type 'integer
+  :safe 'integerp)
 
 ;; Local variables hacking.
 
 
 ;; Local variables hacking.
 
@@ -160,6 +174,17 @@ (defun mdw-kick-menu-bar (&optional frame)
     (set-frame-parameter frame 'menu-bar-lines 0)
     (set-frame-parameter frame 'menu-bar-lines old)))
 
     (set-frame-parameter frame 'menu-bar-lines 0)
     (set-frame-parameter frame 'menu-bar-lines old)))
 
+;; Page motion.
+
+(defun mdw-fixup-page-position ()
+  (unless (eq (char-before (point)) ?\f)
+    (forward-line 0)))
+
+(defadvice backward-page (after mdw-fixup compile activate)
+  (mdw-fixup-page-position))
+(defadvice forward-page (after mdw-fixup compile activate)
+  (mdw-fixup-page-position))
+
 ;; Splitting windows.
 
 (unless (fboundp 'scroll-bar-columns)
 ;; Splitting windows.
 
 (unless (fboundp 'scroll-bar-columns)
@@ -221,6 +246,10 @@ (defun mdw-divvy-window (&optional width)
     (select-window win)))
 
 (defun mdw-set-frame-width (columns &optional width)
     (select-window win)))
 
 (defun mdw-set-frame-width (columns &optional width)
+  "Set the current frame to be the correct width for COLUMNS columns.
+
+If WIDTH is non-nil, then it provides the width for the new columns.  (This
+can be set interactively with a prefix argument.)"
   (interactive "nColumns: 
 P")
   (setq width (if width (prefix-numeric-value width)
   (interactive "nColumns: 
 P")
   (setq width (if width (prefix-numeric-value width)
@@ -231,10 +260,99 @@ (defun mdw-set-frame-width (columns &optional width)
                        sb-width))
     (mdw-divvy-window width)))
 
                        sb-width))
     (mdw-divvy-window width)))
 
+(defcustom mdw-frame-width-fudge
+  (cond ((<= emacs-major-version 20) 1)
+       ((= emacs-major-version 26) 3)
+       (t 0))
+  "The number of extra columns to add to the desired frame width.
+
+This is sadly necessary because Emacs 26 is broken in this regard."
+  :type 'integer)
+
+(defcustom mdw-frame-colour-alist
+  '((black . ("#000000" . "#ffffff"))
+    (red . ("#2a0000" . "#ffffff"))
+    (green . ("#002a00" . "#ffffff"))
+    (blue . ("#00002a" . "#ffffff")))
+  "Alist mapping symbol names to (FOREGROUND . BACKGROUND) colour pairs."
+  :type '(alist :key-type symbol :value-type (cons color color)))
+
+(defun mdw-set-frame-colour (colour &optional frame)
+  (interactive "xColour name or (FOREGROUND . BACKGROUND) pair: 
+")
+  (when (and colour (symbolp colour))
+    (let ((entry (assq colour mdw-frame-colour-alist)))
+      (unless entry (error "Unknown colour `%s'" colour))
+      (setf colour (cdr entry))))
+  (set-frame-parameter frame 'background-color (car colour))
+  (set-frame-parameter frame 'foreground-color (cdr colour)))
+
+;; Window configuration switching.
+
+(defvar mdw-current-window-configuration nil
+  "The current window configuration register name, or `nil'.")
+
+(defun mdw-switch-window-configuration (register &optional no-save)
+  "Switch make REGISTER be the new current window configuration.
+If a current window configuration register is established, and
+NO-SAVE is nil, then save the current window configuration to
+that register first.
+
+Signal an error if the new register contains something other than
+a window configuration.  If the register is unset then save the
+current window configuration to it immediately.
+
+With one or three C-u, or an odd numeric prefix argument, set
+NO-SAVE, so the previous window configuration register is left
+unchanged.
+
+With two or three C-u, or a prefix argument which is an odd
+multiple of 2, just clear the record of the current window
+configuration register, so that the next switch doesn't save the
+prevailing configuration."
+  (interactive
+   (let ((arg current-prefix-arg))
+     (list (if (or (and (consp arg) (= (car arg) 16) (= (car arg) 64))
+                  (and (integerp arg) (not (zerop (logand arg 2)))))
+              nil
+            (register-read-with-preview "Switch to window configuration: "))
+          (or (and (consp arg) (= (car arg) 4) (= (car arg) 64))
+              (and (integerp arg) (not (zerop (logand arg 1))))))))
+
+  (let ((previous mdw-current-window-configuration)
+       (current-windows (list (current-window-configuration)
+                              (point-marker)))
+       (register-value (and register (get-register register))))
+    (when (and mdw-current-window-configuration (not no-save))
+      (set-register mdw-current-window-configuration current-windows))
+    (cond ((null register)
+          (setq mdw-current-window-configuration nil)
+          (if previous
+              (message "Left window configuration `%c'." previous)
+            (message "Nothing to do!")))
+         ((not (or (null register-value)
+                   (and (consp register-value)
+                        (window-configuration-p (car register-value))
+                        (integer-or-marker-p (cadr register-value))
+                        (null (caddr register-value)))))
+          (error "Register `%c' is not a window configuration" register))
+         (t
+          (cond ((null register-value)
+                 (set-register register current-windows)
+                 (message "Started new window configuration `%c'."
+                          register))
+                (t
+                 (set-window-configuration (car register-value))
+                 (goto-char (cadr register-value))
+                 (message "Switched to window configuration `%c'."
+                          register)))
+          (setq mdw-current-window-configuration register)))))
+
 ;; Don't raise windows unless I say so.
 
 ;; Don't raise windows unless I say so.
 
-(defvar mdw-inhibit-raise-frame nil
-  "*Whether `raise-frame' should do nothing when the frame is mapped.")
+(defcustom mdw-inhibit-raise-frame nil
+  "Whether `raise-frame' should do nothing when the frame is mapped."
+  :type 'boolean)
 
 (defadvice raise-frame
     (around mdw-inhibit (&optional frame) activate compile)
 
 (defadvice raise-frame
     (around mdw-inhibit (&optional frame) activate compile)
@@ -310,6 +428,9 @@ (defadvice exchange-point-and-mark
 
 ;; Functions for sexp diary entries.
 
 
 ;; Functions for sexp diary entries.
 
+(defvar mdw-diary-for-org-mode-p nil
+  "Display diary along with the agenda?")
+
 (defun mdw-not-org-mode (form)
   "As FORM, but not in Org mode agenda."
   (and (not mdw-diary-for-org-mode-p)
 (defun mdw-not-org-mode (form)
   "As FORM, but not in Org mode agenda."
   (and (not mdw-diary-for-org-mode-p)
@@ -338,9 +459,9 @@ (defun mdw-discordian-date (date)
         (months ["Chaos" "Discord" "Confusion"
                  "Bureaucracy" "Aftermath"])
         (day-count [0 31 59 90 120 151 181 212 243 273 304 334])
         (months ["Chaos" "Discord" "Confusion"
                  "Bureaucracy" "Aftermath"])
         (day-count [0 31 59 90 120 151 181 212 243 273 304 334])
-        (year (- (extract-calendar-year date) 1900))
-        (month (1- (extract-calendar-month date)))
-        (day (1- (extract-calendar-day date)))
+        (year (- (calendar-extract-year date) 1900))
+        (month (1- (calendar-extract-month date)))
+        (day (1- (calendar-extract-day date)))
         (julian (+ (aref day-count month) day))
         (dyear (+ year 3066)))
     (if (and (= month 1) (= day 28))
         (julian (+ (aref day-count month) day))
         (dyear (+ year 3066)))
     (if (and (= month 1) (= day 28))
@@ -389,12 +510,14 @@ (defun mdw-todo (&optional when)
                                (nth 2 when))))))))
     (eq w d)))
 
                                (nth 2 when))))))))
     (eq w d)))
 
-(defvar mdw-diary-for-org-mode-p nil)
-
 (defadvice org-agenda-list (around mdw-preserve-links activate)
   (let ((mdw-diary-for-org-mode-p t))
     ad-do-it))
 
 (defadvice org-agenda-list (around mdw-preserve-links activate)
   (let ((mdw-diary-for-org-mode-p t))
     ad-do-it))
 
+(defcustom diary-time-regexp nil
+  "Regexp matching times in the diary buffer."
+  :type 'regexp)
+
 (defadvice diary-add-to-list (before mdw-trim-leading-space compile activate)
   "Trim leading space from the diary entry string."
   (save-match-data
 (defadvice diary-add-to-list (before mdw-trim-leading-space compile activate)
   "Trim leading space from the diary entry string."
   (save-match-data
@@ -433,11 +556,11 @@ (defadvice org-bbdb-anniversaries (after mdw-fixup-list compile activate)
          (insert e)
          (setq anyp t)))
       (setq ad-return-value
          (insert e)
          (setq anyp t)))
       (setq ad-return-value
-           (and anyp (buffer-string))))))
+             (and anyp (buffer-string))))))
 
 ;; Fighting with Org-mode's evil key maps.
 
 
 ;; Fighting with Org-mode's evil key maps.
 
-(defvar mdw-evil-keymap-keys
+(defcustom mdw-evil-keymap-keys
   '(([S-up] . [?\C-c up])
     ([S-down] . [?\C-c down])
     ([S-left] . [?\C-c left])
   '(([S-up] . [?\C-c up])
     ([S-down] . [?\C-c down])
     ([S-left] . [?\C-c left])
@@ -448,7 +571,9 @@ (defvar mdw-evil-keymap-keys
     (([M-right] [?\e right]) . [C-right]))
   "Defines evil keybindings to clobber in `mdw-clobber-evil-keymap'.
 The value is an alist mapping evil keys (as a list, or singleton)
     (([M-right] [?\e right]) . [C-right]))
   "Defines evil keybindings to clobber in `mdw-clobber-evil-keymap'.
 The value is an alist mapping evil keys (as a list, or singleton)
-to good keys (in the same form).")
+to good keys (in the same form)."
+  :type '(alist :key-type (choice key-sequence (repeat key-sequence))
+               :value-type key-sequence))
 
 (defun mdw-clobber-evil-keymap (keymap)
   "Replace evil key bindings in the KEYMAP.
 
 (defun mdw-clobber-evil-keymap (keymap)
   "Replace evil key bindings in the KEYMAP.
@@ -472,7 +597,7 @@       (define-key keymap key nil))
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
-(defvar mdw-org-latex-defs
+(defcustom mdw-org-latex-defs
   '(("strayman"
      "\\documentclass{strayman}
 \\usepackage[utf8]{inputenc}
   '(("strayman"
      "\\documentclass{strayman}
 \\usepackage[utf8]{inputenc}
@@ -482,14 +607,21 @@ (defvar mdw-org-latex-defs
      ("\\subsection{%s}" . "\\subsection*{%s}")
      ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
      ("\\paragraph{%s}" . "\\paragraph*{%s}")
      ("\\subsection{%s}" . "\\subsection*{%s}")
      ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
      ("\\paragraph{%s}" . "\\paragraph*{%s}")
-     ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
+     ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
+  "Additional LaTeX class definitions."
+  :type '(alist :key-type string
+               :value-type (list string
+                                 (alist :inline t
+                                        :key-type string
+                                        :value-type string))))
 
 (eval-after-load "org-latex"
   '(setq org-export-latex-classes
 
 (eval-after-load "org-latex"
   '(setq org-export-latex-classes
-        (append mdw-org-latex-defs org-export-latex-classes)))
+          (append mdw-org-latex-defs org-export-latex-classes)))
 
 (eval-after-load "ox-latex"
   '(setq org-latex-classes (append mdw-org-latex-defs org-latex-classes)
 
 (eval-after-load "ox-latex"
   '(setq org-latex-classes (append mdw-org-latex-defs org-latex-classes)
+        org-latex-caption-above nil
         org-latex-default-packages-alist '(("AUTO" "inputenc" t)
                                            ("T1" "fontenc" t)
                                            ("" "fixltx2e" nil)
         org-latex-default-packages-alist '(("AUTO" "inputenc" t)
                                            ("T1" "fontenc" t)
                                            ("" "fixltx2e" nil)
@@ -510,7 +642,7 @@ (eval-after-load "ox-latex"
 (setq org-export-docbook-xslt-proc-command "xsltproc --output %o %s %i"
       org-export-docbook-xsl-fo-proc-command "fop %i.safe %o"
       org-export-docbook-xslt-stylesheet
 (setq org-export-docbook-xslt-proc-command "xsltproc --output %o %s %i"
       org-export-docbook-xsl-fo-proc-command "fop %i.safe %o"
       org-export-docbook-xslt-stylesheet
-      "/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl")
+       "/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl")
 
 ;; Glasses.
 
 
 ;; Glasses.
 
@@ -520,25 +652,56 @@ (setq glasses-separator "-"
 
 ;; Some hacks to do with window placement.
 
 
 ;; Some hacks to do with window placement.
 
+(defvar mdw-designated-window nil
+  "The window chosen by `mdw-designate-window', or nil.")
+
+(defun mdw-designate-window (cancel)
+  "Use the selected window for the next pop-up buffer.
+With a prefix argument, clear the designated window."
+  (interactive "P")
+  (cond (cancel
+        (setq mdw-designated-window nil)
+        (message "Window designation cleared."))
+       (t
+        (setq mdw-designated-window (selected-window))
+        (message "Window designated."))))
+
+(defun mdw-display-buffer-in-designated-window (buffer alist)
+  "Display function to use the designated window."
+  (prog1 mdw-designated-window
+    (when mdw-designated-window
+      (select-window mdw-designated-window)
+      (switch-to-buffer buffer nil t))
+    (setq mdw-designated-window nil)))
+
+(setq display-buffer-base-action
+      (let* ((action display-buffer-base-action)
+            (funcs (car action))
+            (alist (cdr action)))
+       (cons (cons 'mdw-display-buffer-in-designated-window funcs) alist)))
+
 (defun mdw-clobber-other-windows-showing-buffer (buffer-or-name)
   "Arrange that no windows on other frames are showing BUFFER-OR-NAME."
   (interactive "bBuffer: ")
   (let ((home-frame (selected-frame))
        (buffer (get-buffer buffer-or-name))
        (safe-buffer (get-buffer "*scratch*")))
 (defun mdw-clobber-other-windows-showing-buffer (buffer-or-name)
   "Arrange that no windows on other frames are showing BUFFER-OR-NAME."
   (interactive "bBuffer: ")
   (let ((home-frame (selected-frame))
        (buffer (get-buffer buffer-or-name))
        (safe-buffer (get-buffer "*scratch*")))
-    (mapc (lambda (frame)
-           (or (eq frame home-frame)
-               (mapc (lambda (window)
-                       (and (eq (window-buffer window) buffer)
-                            (set-window-buffer window safe-buffer)))
-                     (window-list frame))))
-         (frame-list))))
+    (dolist (frame (frame-list))
+      (unless (eq frame home-frame)
+       (dolist (window (window-list frame))
+         (when (eq (window-buffer window) buffer)
+           (set-window-buffer window safe-buffer)))))))
 
 (defvar mdw-inhibit-walk-windows nil
   "If non-nil, then `walk-windows' does nothing.
 This is used by advice on `switch-to-buffer-other-frame' to inhibit finding
 buffers in random frames.")
 
 
 (defvar mdw-inhibit-walk-windows nil
   "If non-nil, then `walk-windows' does nothing.
 This is used by advice on `switch-to-buffer-other-frame' to inhibit finding
 buffers in random frames.")
 
+(setq display-buffer--other-frame-action
+       '((display-buffer-reuse-window display-buffer-pop-up-frame)
+         (reusable-frames . nil)
+         (inhibit-same-window . t)))
+
 (defadvice walk-windows (around mdw-inhibit activate)
   "If `mdw-inhibit-walk-windows' is non-nil, then do nothing."
   (and (not mdw-inhibit-walk-windows)
 (defadvice walk-windows (around mdw-inhibit activate)
   "If `mdw-inhibit-walk-windows' is non-nil, then do nothing."
   (and (not mdw-inhibit-walk-windows)
@@ -555,17 +718,50 @@ (defadvice display-buffer (before mdw-inhibit-other-frames activate)
 Pretend they don't exist.  They might be on other display devices."
   (ad-set-arg 2 nil))
 
 Pretend they don't exist.  They might be on other display devices."
   (ad-set-arg 2 nil))
 
+(setq even-window-sizes nil
+      even-window-heights nil)
+
+;; Rename buffers along with files.
+
+(defvar mdw-inhibit-rename-buffer nil
+  "If non-nil, `rename-file' won't rename the buffer visiting the file.")
+
+(defmacro mdw-advise-to-inhibit-rename-buffer (function)
+  "Advise FUNCTION to set `mdw-inhibit-rename-buffer' while it runs.
+
+This will prevent `rename-file' from renaming the buffer."
+  `(defadvice ,function (around mdw-inhibit-rename-buffer compile activate)
+     "Don't rename the buffer when renaming the underlying file."
+     (let ((mdw-inhibit-rename-buffer t))
+       ad-do-it)))
+(mdw-advise-to-inhibit-rename-buffer recode-file-name)
+(mdw-advise-to-inhibit-rename-buffer set-visited-file-name)
+(mdw-advise-to-inhibit-rename-buffer backup-buffer)
+
+(defadvice rename-file (after mdw-rename-buffers (from to &optional forcep)
+                       compile activate)
+  "If a buffer is visiting the file, rename it to match the new name.
+
+Don't do this if `mdw-inhibit-rename-buffer' is non-nil."
+  (unless mdw-inhibit-rename-buffer
+    (let ((buffer (get-file-buffer from)))
+      (when buffer
+       (let ((to (if (not (string= (file-name-nondirectory to) "")) to
+                   (concat to (file-name-nondirectory from)))))
+         (with-current-buffer buffer
+           (set-visited-file-name to nil t)))))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Improved compilation machinery.
 
 ;; Uprated version of M-x compile.
 
 (setq compile-command
 ;;;--------------------------------------------------------------------------
 ;;; Improved compilation machinery.
 
 ;; Uprated version of M-x compile.
 
 (setq compile-command
-      (let ((ncpu (with-temp-buffer
-                   (insert-file-contents "/proc/cpuinfo")
-                   (buffer-string)
-                   (count-matches "^processor\\s-*:"))))
-       (format "make -j%d -k" (* 2 ncpu))))
+       (let ((ncpu (with-temp-buffer
+                     (insert-file-contents "/proc/cpuinfo")
+                     (buffer-string)
+                     (count-matches "^processor\\s-*:"))))
+         (format "nice make -j%d -k" (* 2 ncpu))))
 
 (defun mdw-compilation-buffer-name (mode)
   (concat "*" (downcase mode) ": "
 
 (defun mdw-compilation-buffer-name (mode)
   (concat "*" (downcase mode) ": "
@@ -578,7 +774,7 @@      (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile)))
 
 (defadvice compile (around hack-environment compile activate)
   "Hack the environment inherited by inferiors in the compilation."
 
 (defadvice compile (around hack-environment compile activate)
   "Hack the environment inherited by inferiors in the compilation."
-  (let ((process-environment process-environment))
+  (let ((process-environment (copy-tree process-environment)))
     (setenv "LD_PRELOAD" nil)
     ad-do-it))
 
     (setenv "LD_PRELOAD" nil)
     ad-do-it))
 
@@ -646,22 +842,22 @@ (defun mdw-flymake-make-init ()
            #'flymake-get-make-cmdline)))))
 
 (setq flymake-allowed-file-name-masks
            #'flymake-get-make-cmdline)))))
 
 (setq flymake-allowed-file-name-masks
-      '(("\\.\\(?:[cC]\\|cc\\|cpp\\|cxx\\|c\\+\\+\\)\\'"
-        mdw-flymake-make-init)
-       ("\\.\\(?:[hH]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'"
-        mdw-flymake-master-make-init)
-       ("\\.p[lm]" flymake-perl-init)))
+       '(("\\.\\(?:[cC]\\|cc\\|cpp\\|cxx\\|c\\+\\+\\)\\'"
+          mdw-flymake-make-init)
+         ("\\.\\(?:[hH]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'"
+          mdw-flymake-master-make-init)
+         ("\\.p[lm]" flymake-perl-init)))
 
 (setq flymake-mode-map
 
 (setq flymake-mode-map
-      (let ((map (if (boundp 'flymake-mode-map)
-                    flymake-mode-map
-                  (make-sparse-keymap))))
-       (define-key map [?\C-c ?\C-f ?\C-p] 'flymake-goto-prev-error)
-       (define-key map [?\C-c ?\C-f ?\C-n] 'flymake-goto-next-error)
-       (define-key map [?\C-c ?\C-f ?\C-c] 'flymake-compile)
-       (define-key map [?\C-c ?\C-f ?\C-k] 'flymake-stop-all-syntax-checks)
-       (define-key map [?\C-c ?\C-f ?\C-e] 'flymake-popup-current-error-menu)
-       map))
+       (let ((map (if (boundp 'flymake-mode-map)
+                      flymake-mode-map
+                    (make-sparse-keymap))))
+         (define-key map [?\C-c ?\C-f ?\C-p] 'flymake-goto-prev-error)
+         (define-key map [?\C-c ?\C-f ?\C-n] 'flymake-goto-next-error)
+         (define-key map [?\C-c ?\C-f ?\C-c] 'flymake-compile)
+         (define-key map [?\C-c ?\C-f ?\C-k] 'flymake-stop-all-syntax-checks)
+         (define-key map [?\C-c ?\C-f ?\C-e] 'flymake-popup-current-error-menu)
+         map))
 
 ;;;--------------------------------------------------------------------------
 ;;; Mail and news hacking.
 
 ;;;--------------------------------------------------------------------------
 ;;; Mail and news hacking.
@@ -681,8 +877,8 @@ (add-hook 'mdwail-mode-hook
            (make-local-variable 'paragraph-separate)
            (make-local-variable 'paragraph-start)
            (setq paragraph-start
            (make-local-variable 'paragraph-separate)
            (make-local-variable 'paragraph-start)
            (setq paragraph-start
-                 (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
-                         paragraph-start))
+                   (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
+                           paragraph-start))
            (setq paragraph-separate
                  (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
                          paragraph-separate))))
            (setq paragraph-separate
                  (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|"
                          paragraph-separate))))
@@ -738,10 +934,13 @@ (let ((path exec-path))
 
 ;; AUTHINFO GENERIC kludge.
 
 
 ;; AUTHINFO GENERIC kludge.
 
-(defvar nntp-authinfo-generic nil
+(defcustom nntp-authinfo-generic nil
   "Set to the `NNTPAUTH' string to pass on to `authinfo-kludge'.
 
   "Set to the `NNTPAUTH' string to pass on to `authinfo-kludge'.
 
-Use this to arrange for per-server settings.")
+Use this to arrange for per-server settings."
+  :type '(choice (const :tag "Use `NNTPAUTH' environment variable" nil)
+                string)
+  :safe 'stringp)
 
 (defun nntp-open-authinfo-kludge (buffer)
   "Open a connection to SERVER using `authinfo-kludge'."
 
 (defun nntp-open-authinfo-kludge (buffer)
   "Open a connection to SERVER using `authinfo-kludge'."
@@ -786,20 +985,21 @@ (defun mdw-nnimap-transform-headers ()
          (delete-region (+ (match-beginning 0) 2) (point))
          (setq string (buffer-substring (point) (+ (point) size)))
          (delete-region (point) (+ (point) size))
          (delete-region (+ (match-beginning 0) 2) (point))
          (setq string (buffer-substring (point) (+ (point) size)))
          (delete-region (point) (+ (point) size))
-         (insert (format "%S" (mm-subst-char-in-string ?\n ?\s string)))
+         (insert (format "%S" (subst-char-in-string ?\n ?\s string)))
          ;; [mdw] missing from upstream
          (backward-char 1))
        (beginning-of-line)
        (setq article
          ;; [mdw] missing from upstream
          (backward-char 1))
        (beginning-of-line)
        (setq article
-             (and (re-search-forward "UID \\([0-9]+\\)" (line-end-position)
-                                     t)
-                  (match-string 1)))
+               (and (re-search-forward "UID \\([0-9]+\\)"
+                                       (line-end-position)
+                                       t)
+                    (match-string 1)))
        (setq lines nil)
        (setq size
        (setq lines nil)
        (setq size
-             (and (re-search-forward "RFC822.SIZE \\([0-9]+\\)"
-                                     (line-end-position)
-                                     t)
-                  (match-string 1)))
+               (and (re-search-forward "RFC822.SIZE \\([0-9]+\\)"
+                                       (line-end-position)
+                                       t)
+                    (match-string 1)))
        (beginning-of-line)
        (when (search-forward "BODYSTRUCTURE" (line-end-position) t)
          (let ((structure (ignore-errors
        (beginning-of-line)
        (when (search-forward "BODYSTRUCTURE" (line-end-position) t)
          (let ((structure (ignore-errors
@@ -832,6 +1032,18 @@ (eval-after-load 'nnimap
   '(defalias 'nnimap-transform-headers
      (symbol-function 'mdw-nnimap-transform-headers)))
 
   '(defalias 'nnimap-transform-headers
      (symbol-function 'mdw-nnimap-transform-headers)))
 
+(defadvice gnus-other-frame (around mdw-hack-frame-width compile activate)
+  "Always arrange for mail/news frames to be 80 columns wide."
+  (let ((default-frame-alist (cons `(width . ,(+ 80 mdw-frame-width-fudge))
+                                  (cl-delete 'width default-frame-alist
+                                             :key #'car))))
+    ad-do-it))
+
+;; Preferred programs.
+
+(setq mailcap-user-mime-data
+       '(((type . "application/pdf") (viewer . "mupdf %s"))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
 
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
 
@@ -899,7 +1111,7 @@ (defun date ()
                                     (erase-buffer)
                                     (shell-command "date +%Y-%m-%d" t)
                                     (goto-char (mark))
                                     (erase-buffer)
                                     (shell-command "date +%Y-%m-%d" t)
                                     (goto-char (mark))
-                                    (delete-backward-char 1)
+                                    (delete-char -1)
                                     (buffer-string))
                (kill-buffer buffer))))))
 
                                     (buffer-string))
                (kill-buffer buffer))))))
 
@@ -917,8 +1129,10 @@ (defun uuencode (file &optional name)
   ;; Now actually do the thing.
   (call-process "uuencode" file t nil name))
 
   ;; Now actually do the thing.
   (call-process "uuencode" file t nil name))
 
-(defvar np-file "~/.np"
-  "*Where the `now-playing' file is.")
+(defcustom np-file "~/.np"
+  "Where the `now-playing' file is."
+  :type 'file
+  :safe 'stringp)
 
 (defun np (&optional arg)
   "Grabs a `now-playing' string."
 
 (defun np (&optional arg)
   "Grabs a `now-playing' string."
@@ -1034,14 +1248,15 @@ (defun mdw-w3m-browse-url (url &optional new-session-p)
 (eval-after-load 'w3m
   '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session))
 
 (eval-after-load 'w3m
   '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session))
 
-(defvar mdw-good-url-browsers
+(defcustom mdw-good-url-browsers
   '(browse-url-mozilla
     browse-url-generic
     (w3m . mdw-w3m-browse-url)
     browse-url-w3)
   "List of good browsers for mdw-good-url-browsers.
 Each item is a browser function name, or a cons (CHECK . FUNC).
   '(browse-url-mozilla
     browse-url-generic
     (w3m . mdw-w3m-browse-url)
     browse-url-w3)
   "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).")
+A symbol FOO stands for (FOO . FOO)."
+  :type '(repeat (choice function (cons function function))))
 
 (defun mdw-good-url-browser ()
   "Return a good URL browser.
 
 (defun mdw-good-url-browser ()
   "Return a good URL browser.
@@ -1099,30 +1314,45 @@ (eval-after-load "w3m-search"
 
 ;; Useful variables.
 
 
 ;; Useful variables.
 
-(defvar mdw-fill-prefix nil
-  "*Used by `mdw-line-prefix' and `mdw-fill-paragraph'.
+(defcustom mdw-fill-prefix nil
+  "Used by `mdw-line-prefix' and `mdw-fill-paragraph'.
 If there's no fill prefix currently set (by the `fill-prefix'
 variable) and there's a match from one of the regexps here, it
 gets used to set the fill-prefix for the current operation.
 
 If there's no fill prefix currently set (by the `fill-prefix'
 variable) and there's a match from one of the regexps here, it
 gets used to set the fill-prefix for the current operation.
 
-The variable is a list of items of the form `REGEXP . PREFIX'; if
-the REGEXP matches, the PREFIX is used to set the fill prefix.
-It in turn is a list of things:
+The variable is a list of items of the form `PATTERN . PREFIX'; if
+the PATTERN matches, the PREFIX is used to set the fill prefix.
+
+A PATTERN is one of the following.
+
+  * STRING -- a regular expression, expected to match at point
+  * (eval . FORM) -- a Lisp form which must evaluate non-nil
+  * (if COND CONSEQ-PAT ALT-PAT) -- if COND evaluates non-nil, must match
+    CONSEQ-PAT; otherwise must match ALT-PAT
+  * (and PATTERN ...) -- must match all of the PATTERNs
+  * (or PATTERN ...) -- must match at least one PATTERN
+  * (not PATTERN) -- mustn't match (probably not useful)
 
 
-  STRING -- insert a literal string
-  (match . N) -- insert the thing matched by bracketed subexpression N
-  (pad . N) -- a string of whitespace the same width as subexpression N
-  (expr . FORM) -- the result of evaluating FORM")
+A PREFIX is a list of the following kinds of things:
+
+  * STRING -- insert a literal string
+  * (match . N) -- insert the thing matched by bracketed subexpression N
+  * (pad . N) -- a string of whitespace the same width as subexpression N
+  * (expr . FORM) -- the result of evaluating FORM
+
+Information about `bracketed subexpressions' comes from the match data,
+as modified during matching.")
 
 (make-variable-buffer-local 'mdw-fill-prefix)
 
 
 (make-variable-buffer-local 'mdw-fill-prefix)
 
-(defvar mdw-hanging-indents
+(defcustom mdw-hanging-indents
   (concat "\\(\\("
            "\\([*o+]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
            "[ \t]+"
          "\\)?\\)")
   (concat "\\(\\("
            "\\([*o+]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
            "[ \t]+"
          "\\)?\\)")
-  "*Standard regexp matching parts of a hanging indent.
-This is mainly useful in `auto-fill-mode'.")
+  "Standard regexp matching parts of a hanging indent.
+This is mainly useful in `auto-fill-mode'."
+  :type 'regexp)
 
 ;; Utility functions.
 
 
 ;; Utility functions.
 
@@ -1136,16 +1366,41 @@ (defun mdw-maybe-tabify (s)
          (funcall tabfun (point-min) (point-max))
          (setq s (buffer-substring (point-min) (1- (point-max)))))))))
 
          (funcall tabfun (point-min) (point-max))
          (setq s (buffer-substring (point-min) (1- (point-max)))))))))
 
-(defun mdw-examine-fill-prefixes (l)
-  "Given a list of dynamic fill prefixes, pick one which matches
-context and return the static fill prefix to use.  Point must be
-at the start of a line, and match data must be saved."
-  (cond ((not l) nil)
-       ((looking-at (car (car l)))
-        (mdw-maybe-tabify (apply #'concat
-                                 (mapcar #'mdw-do-prefix-match
-                                         (cdr (car l))))))
-       (t (mdw-examine-fill-prefixes (cdr l)))))
+(defun mdw-fill-prefix-match-p (pat)
+  "Return non-nil if PAT matches at the current position."
+  (cond ((stringp pat) (looking-at pat))
+       ((not (consp pat)) (error "Unknown pattern item `%S'" pat))
+       ((eq (car pat) 'eval) (eval (cdr pat)))
+       ((eq (car pat) 'if)
+        (if (or (null (cdr pat))
+                (null (cddr pat))
+                (null (cdddr pat))
+                (cddddr pat))
+            (error "Invalid `if' pattern `%S'" pat))
+        (mdw-fill-prefix-match-p (if (eval (cadr pat))
+                                     (caddr pat)
+                                   (cadddr pat))))
+       ((eq (car pat) 'and)
+        (let ((pats (cdr pat))
+              (ok t))
+          (while (and pats
+                      (or (mdw-fill-prefix-match-p (car pats))
+                          (setq ok nil)))
+            (setq pats (cdr pats)))
+          ok))
+       ((eq (car pat) 'or)
+        (let ((pats (cdr pat))
+              (ok nil))
+          (while (and pats
+                      (or (not (mdw-fill-prefix-match-p (car pats)))
+                          (progn (setq ok t) nil)))
+            (setq pats (cdr pats)))
+          ok))
+       ((eq (car pat) 'not)
+        (if (or (null (cdr pat)) (cddr pat))
+            (error "Invalid `not' pattern `%S'" pat))
+        (not (mdw-fill-prefix-match-p (car pats))))
+       (t (error "Unknown pattern form `%S'" pat))))
 
 (defun mdw-maybe-car (p)
   "If P is a pair, return (car P), otherwise just return P."
 
 (defun mdw-maybe-car (p)
   "If P is a pair, return (car P), otherwise just return P."
@@ -1170,6 +1425,22 @@ (defun mdw-do-prefix-match (m)
        ((eq (car m) 'eval) (eval (cdr m)))
        (t "")))
 
        ((eq (car m) 'eval) (eval (cdr m)))
        (t "")))
 
+(defun mdw-examine-fill-prefixes (l)
+  "Given a list of dynamic fill prefixes, pick one which matches
+context and return the static fill prefix to use.  Point must be
+at the start of a line, and match data must be saved."
+  (let ((prefix nil))
+    (while (cond ((null l) nil)
+                ((mdw-fill-prefix-match-p (caar l))
+                 (setq prefix
+                         (mdw-maybe-tabify
+                          (apply #'concat
+                                 (mapcar #'mdw-do-prefix-match
+                                         (cdr (car l))))))
+                 nil))
+      (setq l (cdr l)))
+    prefix))
+
 (defun mdw-choose-dynamic-fill-prefix ()
   "Work out the dynamic fill prefix based on the variable `mdw-fill-prefix'."
   (cond ((and fill-prefix (not (string= fill-prefix ""))) fill-prefix)
 (defun mdw-choose-dynamic-fill-prefix ()
   "Work out the dynamic fill prefix based on the variable `mdw-fill-prefix'."
   (cond ((and fill-prefix (not (string= fill-prefix ""))) fill-prefix)
@@ -1191,23 +1462,108 @@ (defun mdw-fill-paragraph ()
   (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
     (fill-paragraph nil)))
 
   (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
     (fill-paragraph nil)))
 
+(defun mdw-point-within-string-p ()
+  "Return non-nil if point is within a string."
+  (let ((state (syntax-ppss)))
+    (elt state 3)))
+
 (defun mdw-standard-fill-prefix (rx &optional mat)
   "Set the dynamic fill prefix, handling standard hanging indents and stuff.
 This is just a short-cut for setting the thing by hand, and by
 design it doesn't cope with anything approximating a complicated
 case."
   (setq mdw-fill-prefix
 (defun mdw-standard-fill-prefix (rx &optional mat)
   "Set the dynamic fill prefix, handling standard hanging indents and stuff.
 This is just a short-cut for setting the thing by hand, and by
 design it doesn't cope with anything approximating a complicated
 case."
   (setq mdw-fill-prefix
-       `((,(concat rx mdw-hanging-indents)
-          (match . 1)
-          (pad . ,(or mat 2))))))
+         `(((if (mdw-point-within-string-p)
+                ,(concat "\\(\\s-*\\)" mdw-hanging-indents)
+              ,(concat rx mdw-hanging-indents))
+            (match . 1)
+            (pad . ,(or mat 2))))))
+
+;;;--------------------------------------------------------------------------
+;;; Printing.
+
+;; Teach PostScript about a condensed variant of Courier.  I'm using 85% of
+;; the usual width, which happens to match `mdwfonts', and David Carlisle's
+;; `pslatex'.  (Once upon a time, I used 80%, but decided consistency with
+;; `pslatex' was useful.)
+(setq ps-user-defined-prologue "
+/CourierCondensed /Courier
+/CourierCondensed-Bold /Courier-Bold
+/CourierCondensed-Oblique /Courier-Oblique
+/CourierCondensed-BoldOblique /Courier-BoldOblique
+  4 { findfont [0.85 0 0 1 0 0] makefont definefont pop } repeat
+")
+
+;; Hack `ps-print''s settings.
+(eval-after-load 'ps-print
+  '(progn
+
+     ;; Notice that the comment-delimiters should be in italics too.
+     (pushnew 'font-lock-comment-delimiter-face ps-italic-faces)
+
+     ;; Select more suitable colours for the main kinds of tokens.  The
+     ;; colours set on the Emacs faces are chosen for use against a dark
+     ;; background, and work very badly on white paper.
+     (ps-extend-face '(font-lock-comment-face "darkgreen" nil italic))
+     (ps-extend-face '(font-lock-comment-delimiter-face "darkgreen" nil italic))
+     (ps-extend-face '(font-lock-string-face "RoyalBlue4" nil))
+     (ps-extend-face '(mdw-punct-face "sienna" nil))
+     (ps-extend-face '(mdw-number-face "OrangeRed3" nil))
+
+     ;; Teach `ps-print' about my condensed varsions of Courier.
+     (setq ps-font-info-database
+            (append '((CourierCondensed
+                       (fonts (normal . "CourierCondensed")
+                              (bold . "CourierCondensed-Bold")
+                              (italic . "CourierCondensed-Oblique")
+                              (bold-italic . "CourierCondensed-BoldOblique"))
+                       (size . 10.0)
+                       (line-height . 10.55)
+                       (space-width . 5.1)
+                       (avg-char-width . 5.1)))
+                    (cl-remove 'CourierCondensed ps-font-info-database
+                               :key #'car)))))
+
+;; Arrange to strip overlays from the buffer before we print .  This will
+;; prevent `flyspell' from interfering with the printout.  (It would be less
+;; bad if `ps-print' could merge the `flyspell' overlay face with the
+;; underlying `font-lock' face, but it can't (and that seems hard).  So
+;; instead we have this hack.
+;;
+;; The basic trick is to copy the relevant text from the buffer being printed
+;; into a temporary buffer and... just print that.  The text properties come
+;; with the text and end up in the new buffer, and the overlays get lost
+;; along the way.  Only problem is that the headers identifying the file
+;; being printed get confused, so remember the original buffer and reinstate
+;; it when constructing the headers.
+(defvar mdw-printing-buffer)
+
+(defadvice ps-generate-header
+    (around mdw-use-correct-buffer () activate compile)
+  "Print the correct name of the buffer being printed."
+  (with-current-buffer mdw-printing-buffer
+    ad-do-it))
+
+(defadvice ps-generate
+    (around mdw-strip-overlays (buffer from to genfunc) activate compile)
+  "Strip overlays -- in particular, from `flyspell' -- before printout."
+  (with-temp-buffer
+    (let ((mdw-printing-buffer buffer))
+      (insert-buffer-substring buffer from to)
+      (ad-set-arg 0 (current-buffer))
+      (ad-set-arg 1 (point-min))
+      (ad-set-arg 2 (point-max))
+      ad-do-it)))
 
 ;;;--------------------------------------------------------------------------
 ;;; Other common declarations.
 
 ;; Common mode settings.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Other common declarations.
 
 ;; Common mode settings.
 
-(defvar mdw-auto-indent t
-  "Whether to indent automatically after a newline.")
+(defcustom mdw-auto-indent t
+  "Whether to indent automatically after a newline."
+  :type 'boolean
+  :safe 'booleanp)
 
 (defun mdw-whitespace-mode (&optional arg)
   "Turn on/off whitespace mode, but don't highlight trailing space."
 
 (defun mdw-whitespace-mode (&optional arg)
   "Turn on/off whitespace mode, but don't highlight trailing space."
@@ -1231,10 +1587,18 @@ (defun mdw-misc-mode-config ()
   (set (make-local-variable 'mdw-do-misc-mode-hacking) t)
   (local-set-key [C-return] 'newline)
   (make-local-variable 'page-delimiter)
   (set (make-local-variable 'mdw-do-misc-mode-hacking) t)
   (local-set-key [C-return] 'newline)
   (make-local-variable 'page-delimiter)
-  (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
+  (setq page-delimiter (concat       "^" "\f"
+                              "\\|" "^"
+                                    ".\\{0,4\\}"
+                                    "-\\{5\\}"
+                                    "\\(" " " ".*" " " "\\)?"
+                                    "-+"
+                                    ".\\{0,2\\}"
+                                    "$"))
   (setq comment-column 40)
   (auto-fill-mode 1)
   (setq fill-column mdw-text-width)
   (setq comment-column 40)
   (auto-fill-mode 1)
   (setq fill-column mdw-text-width)
+  (flyspell-prog-mode)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (if (fboundp 'hs-minor-mode)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (if (fboundp 'hs-minor-mode)
@@ -1278,9 +1642,10 @@        (define-key map [C-S-mouse-3] 'gtags-pop-stack))))
 
 ;; Backup file handling.
 
 
 ;; Backup file handling.
 
-(defvar mdw-backup-disable-regexps nil
-  "*List of regular expressions: if a file name matches any of
-these then the file is not backed up.")
+(defcustom mdw-backup-disable-regexps nil
+  "List of regular expressions: if a file name matches any of
+these then the file is not backed up."
+  :type '(repeat regexp))
 
 (defun mdw-backup-enable-predicate (name)
   "[mdw]'s default backup predicate.
 
 (defun mdw-backup-enable-predicate (name)
   "[mdw]'s default backup predicate.
@@ -1315,15 +1680,17 @@ (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 ;;;--------------------------------------------------------------------------
 ;;; Fullscreen-ness.
 
 ;;;--------------------------------------------------------------------------
 ;;; Fullscreen-ness.
 
-(defvar mdw-full-screen-parameters
+(defcustom mdw-full-screen-parameters
   '((menu-bar-lines . 0)
   '((menu-bar-lines . 0)
-    ;(vertical-scroll-bars . nil)
+    ;;(vertical-scroll-bars . nil)
     )
     )
-  "Frame parameters to set when making a frame fullscreen.")
+  "Frame parameters to set when making a frame fullscreen."
+  :type '(alist :key-type symbol))
 
 
-(defvar mdw-full-screen-save
+(defcustom mdw-full-screen-save
   '(width height)
   '(width height)
-  "Extra frame parameters to save when setting fullscreen.")
+  "Extra frame parameters to save when setting fullscreen."
+  :type '(repeat symbol))
 
 (defun mdw-toggle-full-screen (&optional frame)
   "Show the FRAME fullscreen."
 
 (defun mdw-toggle-full-screen (&optional frame)
   "Show the FRAME fullscreen."
@@ -1371,11 +1738,12 @@ (mdw-define-face fixed-pitch
   (((type w32)) :family "courier new" :height 85)
   (((type x)) :family "6x13" :foundry "trad" :height 130)
   (t :foreground "white" :background "black"))
   (((type w32)) :family "courier new" :height 85)
   (((type x)) :family "6x13" :foundry "trad" :height 130)
   (t :foreground "white" :background "black"))
-(if (mdw-emacs-version-p 23)
-    (mdw-define-face variable-pitch
-      (((type x)) :family "sans" :height 100))
-  (mdw-define-face variable-pitch
-    (((type x)) :family "helvetica" :height 90)))
+(mdw-define-face fixed-pitch-serif
+  (((type w32)) :family "courier new" :height 85 :weight bold)
+  (((type x)) :family "6x13" :foundry "trad" :height 130 :weight bold)
+  (t :foreground "white" :background "black" :weight bold))
+(mdw-define-face variable-pitch
+  (((type x)) :family "helvetica" :height 120))
 (mdw-define-face region
   (((min-colors 64)) :background "grey30")
   (((class color)) :background "blue")
 (mdw-define-face region
   (((min-colors 64)) :background "grey30")
   (((class color)) :background "blue")
@@ -1415,6 +1783,15 @@ (mdw-define-face highlight
   (((class color)) :background "cyan")
   (t :inverse-video t))
 
   (((class color)) :background "cyan")
   (t :inverse-video t))
 
+(mdw-define-face viper-minibuffer-emacs (t nil))
+(mdw-define-face viper-minibuffer-insert (t nil))
+(mdw-define-face viper-minibuffer-vi (t nil))
+(mdw-define-face viper-replace-overlay
+  (((min-colors 64)) :background "darkred")
+  (((class color)) :background "red")
+  (t :inverse-video t))
+(mdw-define-face viper-search (t :inherit isearch))
+
 (mdw-define-face holiday-face
   (t :background "red"))
 (mdw-define-face calendar-today-face
 (mdw-define-face holiday-face
   (t :background "red"))
 (mdw-define-face calendar-today-face
@@ -1425,6 +1802,10 @@ (mdw-define-face comint-highlight-prompt
 (mdw-define-face comint-highlight-input
   (t nil))
 
 (mdw-define-face comint-highlight-input
   (t nil))
 
+(mdw-define-face Man-underline
+  (((type tty)) :underline t)
+  (t :slant italic))
+
 (mdw-define-face ido-subdir
   (t :foreground "cyan" :weight bold))
 
 (mdw-define-face ido-subdir
   (t :foreground "cyan" :weight bold))
 
@@ -1561,6 +1942,10 @@ (mdw-define-face gnus-cite-10
 (mdw-define-face gnus-cite-11
   (t :foreground "grey"))
 
 (mdw-define-face gnus-cite-11
   (t :foreground "grey"))
 
+(mdw-define-face gnus-emphasis-underline
+  (((type tty)) :underline t)
+  (t :slant italic))
+
 (mdw-define-face diff-header
   (t nil))
 (mdw-define-face diff-index
 (mdw-define-face diff-header
   (t nil))
 (mdw-define-face diff-index
@@ -1750,7 +2135,9 @@ (mdw-define-face mdw-point-overlay-face
   (((class color)) :background "blue")
   (((type tty) (class mono)) :inverse-video t))
 
   (((class color)) :background "blue")
   (((type tty) (class mono)) :inverse-video t))
 
-(defvar mdw-point-overlay-fringe-display '(vertical-bar . vertical-bar))
+(defcustom mdw-point-overlay-fringe-display '(vertical-bar . vertical-bar)
+  "Bitmaps to display in the left and right fringes in the current line."
+  :type '(cons symbol symbol))
 
 (defun mdw-configure-point-overlay ()
   (let ((ov (make-overlay 0 0)))
 
 (defun mdw-configure-point-overlay ()
   (let ((ov (make-overlay 0 0)))
@@ -1799,14 +2186,14 @@ (define-minor-mode mdw-point-overlay-mode
   :global nil
   (let ((buffer (current-buffer)))
     (setq mdw-point-overlay-buffers
   :global nil
   (let ((buffer (current-buffer)))
     (setq mdw-point-overlay-buffers
-         (mapcan (lambda (buf)
-                   (if (and (buffer-live-p buf)
-                            (not (eq buf buffer)))
-                       (list buf)))
-                 mdw-point-overlay-buffers))
+           (mapcan (lambda (buf)
+                     (if (and (buffer-live-p buf)
+                              (not (eq buf buffer)))
+                         (list buf)))
+                   mdw-point-overlay-buffers))
     (if mdw-point-overlay-mode
        (setq mdw-point-overlay-buffers
     (if mdw-point-overlay-mode
        (setq mdw-point-overlay-buffers
-             (cons buffer mdw-point-overlay-buffers))))
+               (cons buffer mdw-point-overlay-buffers))))
   (cond (mdw-point-overlay-buffers
         (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
         (add-hook 'post-command-hook 'mdw-update-point-overlay))
   (cond (mdw-point-overlay-buffers
         (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
         (add-hook 'post-command-hook 'mdw-update-point-overlay))
@@ -1819,6 +2206,21 @@ (define-globalized-minor-mode mdw-global-point-overlay-mode
   mdw-point-overlay-mode
   (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
 
   mdw-point-overlay-mode
   (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
 
+(defvar mdw-terminal-title-alist nil)
+(defun mdw-update-terminal-title ()
+  (when (let ((term (frame-parameter nil 'tty-type)))
+         (and term (string-match "^xterm" term)))
+    (let* ((tty (frame-parameter nil 'tty))
+          (old (assoc tty mdw-terminal-title-alist))
+          (new (format-mode-line frame-title-format)))
+      (unless (and old (equal (cdr old) new))
+       (if old (rplacd old new)
+         (setq mdw-terminal-title-alist
+                 (cons (cons tty new) mdw-terminal-title-alist)))
+       (send-string-to-terminal (concat "\e]2;" new "\e\\"))))))
+
+(add-hook 'post-command-hook 'mdw-update-terminal-title)
+
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
 
@@ -1859,50 +2261,47 @@ (defun mdw-c-indent-arglist-nested (langelem)
 (defvar mdw-define-c-styles-hook nil
   "Hook run when `cc-mode' starts up to define styles.")
 
 (defvar mdw-define-c-styles-hook nil
   "Hook run when `cc-mode' starts up to define styles.")
 
-(defmacro mdw-define-c-style (name &rest assocs)
-  "Define a C style, called NAME (a symbol), setting ASSOCs.
+(defun mdw-merge-style-alists (first second)
+  (let ((output nil))
+    (dolist (item first)
+      (let ((key (car item)) (value (cdr item)))
+       (if (string-suffix-p "-alist" (symbol-name key))
+           (push (cons key
+                       (mdw-merge-style-alists value
+                                               (cdr (assoc key second))))
+                 output)
+         (push item output))))
+    (dolist (item second)
+      (unless (assoc (car item) first)
+       (push item output)))
+    (nreverse output)))
+
+(cl-defmacro mdw-define-c-style (name (&optional parent) &rest assocs)
+  "Define a C style, called NAME (a symbol) based on PARENT, setting ASSOCs.
 A function, named `mdw-define-c-style/NAME', is defined to actually install
 the style using `c-add-style', and added to the hook
 `mdw-define-c-styles-hook'.  If CC Mode is already loaded, then the style is
 set."
   (declare (indent defun))
   (let* ((name-string (symbol-name name))
 A function, named `mdw-define-c-style/NAME', is defined to actually install
 the style using `c-add-style', and added to the hook
 `mdw-define-c-styles-hook'.  If CC Mode is already loaded, then the style is
 set."
   (declare (indent defun))
   (let* ((name-string (symbol-name name))
+        (var (intern (concat "mdw-c-style/" name-string)))
         (func (intern (concat "mdw-define-c-style/" name-string))))
     `(progn
         (func (intern (concat "mdw-define-c-style/" name-string))))
     `(progn
-       (defun ,func () (c-add-style ,name-string ',assocs))
+       (setq ,var
+              ,(if (null parent)
+                   `',assocs
+                 (let ((parent-list (intern (concat "mdw-c-style/"
+                                                    (symbol-name parent)))))
+                   `(mdw-merge-style-alists ',assocs ,parent-list))))
+       (defun ,func () (c-add-style ,name-string ,var))
        (and (featurep 'cc-mode) (,func))
        (and (featurep 'cc-mode) (,func))
-       (add-hook 'mdw-define-c-styles-hook ',func))))
+       (add-hook 'mdw-define-c-styles-hook ',func)
+       ',name)))
 
 (eval-after-load "cc-mode"
   '(run-hooks 'mdw-define-c-styles-hook))
 
 
 (eval-after-load "cc-mode"
   '(run-hooks 'mdw-define-c-styles-hook))
 
-(mdw-define-c-style mdw-trustonic-c
-  (c-basic-offset . 4)
-  (comment-column . 0)
-  (c-indent-comment-alist (anchored-comment . (column . 0))
-                         (end-block . (space . 1))
-                         (cpp-end-block . (space . 1))
-                         (other . (space . 1)))
-  (c-class-key . "class")
-  (c-backslash-column . 0)
-  (c-auto-align-backslashes . nil)
-  (c-label-minimum-indentation . 0)
-  (c-offsets-alist (substatement-open . (add 0 c-indent-one-line-block))
-                  (defun-open . (add 0 c-indent-one-line-block))
-                  (arglist-cont-nonempty . mdw-c-indent-arglist-nested)
-                  (topmost-intro . mdw-c-indent-extern-mumble)
-                  (cpp-define-intro . 0)
-                  (knr-argdecl . 0)
-                  (inextern-lang . [0])
-                  (label . 0)
-                  (case-label . +)
-                  (access-label . -2)
-                  (inclass . +)
-                  (inline-open . ++)
-                  (statement-cont . +)
-                  (statement-case-intro . +)))
-
-(mdw-define-c-style mdw-c
+(mdw-define-c-style mdw-c ()
   (c-basic-offset . 2)
   (comment-column . 40)
   (c-class-key . "class")
   (c-basic-offset . 2)
   (comment-column . 40)
   (c-class-key . "class")
@@ -1923,6 +2322,18 @@             (defun-open . (add 0 c-indent-one-line-block))
                   (statement-cont . +)
                   (statement-case-intro . +)))
 
                   (statement-cont . +)
                   (statement-case-intro . +)))
 
+(mdw-define-c-style mdw-trustonic-c (mdw-c)
+  (c-basic-offset . 4)
+  (c-offsets-alist (access-label . -2)))
+
+(mdw-define-c-style mdw-trustonic-alec-c (mdw-trustonic-c)
+  (comment-column . 0)
+  (c-indent-comment-alist (anchored-comment . (column . 0))
+                         (end-block . (space . 1))
+                         (cpp-end-block . (space . 1))
+                         (other . (space . 1)))
+  (c-offsets-alist (arglist-cont-nonempty . mdw-c-indent-arglist-nested)))
+
 (defun mdw-set-default-c-style (modes style)
   "Update the default CC Mode style for MODES to be STYLE.
 
 (defun mdw-set-default-c-style (modes style)
   "Update the default CC Mode style for MODES to be STYLE.
 
@@ -1931,14 +2342,14 @@ (defun mdw-set-default-c-style (modes style)
   (let ((modes (if (listp modes) modes (list modes)))
        (style (symbol-name style)))
     (setq c-default-style
   (let ((modes (if (listp modes) modes (list modes)))
        (style (symbol-name style)))
     (setq c-default-style
-         (append (mapcar (lambda (mode)
-                           (cons mode style))
-                         modes)
-                 (remove-if (lambda (assoc)
-                              (memq (car assoc) modes))
-                            (if (listp c-default-style)
-                                c-default-style
-                              (list (cons 'other c-default-style))))))))
+           (append (mapcar (lambda (mode)
+                             (cons mode style))
+                           modes)
+                   (remove-if (lambda (assoc)
+                                (memq (car assoc) modes))
+                              (if (listp c-default-style)
+                                  c-default-style
+                                (list (cons 'other c-default-style))))))))
 (setq c-default-style "mdw-c")
 
 (mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
 (setq c-default-style "mdw-c")
 
 (mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
@@ -2095,47 +2506,51 @@ (defun mdw-fontify-c-and-c++ ()
                      "selector")))
 
     (setq font-lock-keywords
                      "selector")))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Fontify include files as strings.
-          (list (concat "^[ \t]*\\#[ \t]*"
-                        "\\(include\\|import\\)"
-                        "[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
-                '(2 font-lock-string-face))
-
-          ;; Preprocessor directives are `references'?.
-          (list (concat "^\\([ \t]*#[ \t]*\\(\\("
-                        preprocessor-keywords
-                        "\\)\\>\\|[0-9]+\\|$\\)\\)")
-                '(1 font-lock-keyword-face))
-
-          ;; Handle the keywords defined above.
-          (list (concat "@\\<\\(" objc-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
-
-          (list (concat "\\<\\(" c-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
-
-          (list (concat "\\<\\(" c-builtins "\\)\\>")
-                '(0 font-lock-variable-name-face))
-
-          ;; Handle numbers too.
-          ;;
-          ;; This looks strange, I know.  It corresponds to the
-          ;; preprocessor's idea of what a number looks like, rather than
-          ;; anything sensible.
-          (list (concat "\\(\\<[0-9]\\|\\.[0-9]\\)"
-                        "\\([Ee][+-]\\|[0-9A-Za-z_.]\\)*")
-                '(0 mdw-number-face))
-
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+           (list
+
+            ;; Fontify include files as strings.
+            (list (concat "^[ \t]*\\#[ \t]*"
+                          "\\(include\\|import\\)"
+                          "[ \t]*\\(<[^>]+>?\\)")
+                  '(2 font-lock-string-face))
+
+            ;; Preprocessor directives are `references'?.
+            (list (concat "^\\([ \t]*#[ \t]*\\(\\("
+                          preprocessor-keywords
+                          "\\)\\>\\|[0-9]+\\|$\\)\\)")
+                  '(1 font-lock-keyword-face))
+
+            ;; Handle the keywords defined above.
+            (list (concat "@\\<\\(" objc-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+
+            (list (concat "\\<\\(" c-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+
+            (list (concat "\\<\\(" c-builtins "\\)\\>")
+                  '(0 font-lock-variable-name-face))
+
+            ;; Handle numbers too.
+            ;;
+            ;; This looks strange, I know.  It corresponds to the
+            ;; preprocessor's idea of what a number looks like, rather than
+            ;; anything sensible.
+            (list (concat "\\(\\<[0-9]\\|\\.[0-9]\\)"
+                          "\\([Ee][+-]\\|[0-9A-Za-z_.]\\)*")
+                  '(0 mdw-number-face))
+
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
 
 (define-derived-mode sod-mode c-mode "Sod"
   "Major mode for editing Sod code.")
 (push '("\\.sod$" . sod-mode) auto-mode-alist)
 
 
 (define-derived-mode sod-mode c-mode "Sod"
   "Major mode for editing Sod code.")
 (push '("\\.sod$" . sod-mode) auto-mode-alist)
 
+(dolist (hook '(c-mode-hook objc-mode-hook c++-mode-hook))
+  (add-hook hook 'mdw-misc-mode-config t)
+  (add-hook hook 'mdw-fontify-c-and-c++ t))
+
 ;;;--------------------------------------------------------------------------
 ;;; AP calc mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; AP calc mode.
 
@@ -2162,31 +2577,35 @@ (defun mdw-fontify-apcalc ()
                      "show" "static" "switch" "while" "write")))
 
     (setq font-lock-keywords
                      "show" "static" "switch" "while" "write")))
 
     (setq font-lock-keywords
-         (list
+           (list
 
 
-          ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" c-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
+            ;; Handle the keywords defined above.
+            (list (concat "\\<\\(" c-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
 
 
-          ;; Handle numbers too.
-          ;;
-          ;; This looks strange, I know.  It corresponds to the
-          ;; preprocessor's idea of what a number looks like, rather than
-          ;; anything sensible.
-          (list (concat "\\(\\<[0-9]\\|\\.[0-9]\\)"
-                        "\\([Ee][+-]\\|[0-9A-Za-z_.]\\)*")
-                '(0 mdw-number-face))
+            ;; Handle numbers too.
+            ;;
+            ;; This looks strange, I know.  It corresponds to the
+            ;; preprocessor's idea of what a number looks like, rather than
+            ;; anything sensible.
+            (list (concat "\\(\\<[0-9]\\|\\.[0-9]\\)"
+                          "\\([Ee][+-]\\|[0-9A-Za-z_.]\\)*")
+                  '(0 mdw-number-face))
 
 
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'apcalc-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'apcalc-mode-hook 'mdw-fontify-apcalc t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Java programming configuration.
 
 ;; Make indentation nice.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Java programming configuration.
 
 ;; Make indentation nice.
 
-(mdw-define-c-style mdw-java
+(mdw-define-c-style mdw-java ()
   (c-basic-offset . 2)
   (c-backslash-column . 72)
   (c-offsets-alist (substatement-open . 0)
   (c-basic-offset . 2)
   (c-backslash-column . 72)
   (c-offsets-alist (substatement-open . 0)
@@ -2233,29 +2652,33 @@ (defun mdw-fontify-java ()
         (mdw-regexps "false" "null" "super" "this" "true")))
 
     (setq font-lock-keywords
         (mdw-regexps "false" "null" "super" "this" "true")))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" java-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
-
-          ;; Handle the magic builtins defined above.
-          (list (concat "\\<\\(" java-builtins "\\)\\>")
-                '(0 font-lock-variable-name-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))))))
+           (list
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\<\\(" java-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+
+            ;; Handle the magic builtins defined above.
+            (list (concat "\\<\\(" java-builtins "\\)\\>")
+                  '(0 font-lock-variable-name-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))))))
+
+(progn
+  (add-hook 'java-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'java-mode-hook 'mdw-fontify-java t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Javascript programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Javascript programming configuration.
@@ -2282,38 +2705,39 @@ (defun mdw-fontify-javascript ()
                      "private" "protected" "public" "return" "short"
                      "static" "super" "switch" "synchronized" "throw"
                      "throws" "transient" "try" "typeof" "var" "void"
                      "private" "protected" "public" "return" "short"
                      "static" "super" "switch" "synchronized" "throw"
                      "throws" "transient" "try" "typeof" "var" "void"
-                     "volatile" "while" "with" "yield"
-
-                     "boolean" "byte" "char" "double" "float" "int" "long"
-                     "short" "void"))
+                     "volatile" "while" "with" "yield"))
        (javascript-builtins
         (mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
                      "arguments" "this")))
 
     (setq font-lock-keywords
        (javascript-builtins
         (mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
                      "arguments" "this")))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
-                '(0 font-lock-keyword-face))
-
-          ;; Handle the predefined builtins defined above.
-          (list (concat "\\_<\\(" javascript-builtins "\\)\\_>")
-                '(0 font-lock-variable-name-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))))))
+           (list
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
+                  '(0 font-lock-keyword-face))
+
+            ;; Handle the predefined builtins defined above.
+            (list (concat "\\_<\\(" javascript-builtins "\\)\\_>")
+                  '(0 font-lock-variable-name-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))))))
+
+(progn
+  (add-hook 'js-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'js-mode-hook 'mdw-fontify-javascript t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Scala programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Scala programming configuration.
@@ -2337,59 +2761,63 @@ (defun mdw-fontify-scala ()
        (punctuation "[-!%^&*=+:@#~/?\\|`]"))
 
     (setq font-lock-keywords
        (punctuation "[-!%^&*=+:@#~/?\\|`]"))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Magical identifiers between backticks.
-          (list (concat "`\\([^`]+\\)`")
-                '(1 font-lock-variable-name-face))
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\_<\\(" scala-keywords "\\)\\_>")
-                '(0 font-lock-keyword-face))
-
-          ;; Handle the constants defined above.
-          (list (concat "\\_<\\(" scala-constants "\\)\\_>")
-                '(0 font-lock-variable-name-face))
-
-          ;; Magical identifiers between backticks.
-          (list (concat "`\\([^`]+\\)`")
-                '(1 font-lock-variable-name-face))
-
-          ;; Handle numbers too.
-          ;;
-          ;; As usual, not quite right.
-          (list (concat "\\_<\\("
-                        "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
-                        "[0-9]+\\(\\.[0-9]*\\|\\)"
-                        "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
-                        "[lLfFdD]?")
-                '(0 mdw-number-face))
-
-          ;; And everything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))
+           (list
+
+            ;; Magical identifiers between backticks.
+            (list (concat "`\\([^`]+\\)`")
+                  '(1 font-lock-variable-name-face))
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\_<\\(" scala-keywords "\\)\\_>")
+                  '(0 font-lock-keyword-face))
+
+            ;; Handle the constants defined above.
+            (list (concat "\\_<\\(" scala-constants "\\)\\_>")
+                  '(0 font-lock-variable-name-face))
+
+            ;; Magical identifiers between backticks.
+            (list (concat "`\\([^`]+\\)`")
+                  '(1 font-lock-variable-name-face))
+
+            ;; Handle numbers too.
+            ;;
+            ;; As usual, not quite right.
+            (list (concat "\\_<\\("
+                          "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+                          "[0-9]+\\(\\.[0-9]*\\)?"
+                          "\\([eE][-+]?[0-9]+\\)?\\)"
+                          "[lLfFdD]?")
+                  '(0 mdw-number-face))
+
+            ;; And everything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face)))
 
          font-lock-syntactic-keywords
 
          font-lock-syntactic-keywords
-         (list
-
-          ;; Single quotes around characters.  But not when used to quote
-          ;; symbol names.  Ugh.
-          (list (concat "\\('\\)"
-                        "\\(" "."
-                        "\\|" "\\\\" "\\(" "\\\\\\\\" "\\)*"
-                              "u+" "[0-9a-fA-F]\\{4\\}"
-                        "\\|" "\\\\" "[0-7]\\{1,3\\}"
-                        "\\|" "\\\\" "." "\\)"
-                        "\\('\\)")
-                '(1 "\"")
-                '(4 "\""))))))
+           (list
+
+            ;; Single quotes around characters.  But not when used to quote
+            ;; symbol names.  Ugh.
+            (list (concat "\\('\\)"
+                          "\\(" "."
+                          "\\|" "\\\\" "\\(" "\\\\\\\\" "\\)*"
+                          "u+" "[0-9a-fA-F]\\{4\\}"
+                          "\\|" "\\\\" "[0-7]\\{1,3\\}"
+                          "\\|" "\\\\" "." "\\)"
+                          "\\('\\)")
+                  '(1 "\"")
+                  '(4 "\""))))))
+
+(progn
+  (add-hook 'scala-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'scala-mode-hook 'mdw-fontify-scala t))
 
 ;;;--------------------------------------------------------------------------
 ;;; C# programming configuration.
 
 ;; Make indentation nice.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; C# programming configuration.
 
 ;; Make indentation nice.
 
-(mdw-define-c-style mdw-csharp
+(mdw-define-c-style mdw-csharp ()
   (c-basic-offset . 2)
   (c-backslash-column . 72)
   (c-offsets-alist (substatement-open . 0)
   (c-basic-offset . 2)
   (c-backslash-column . 72)
   (c-offsets-alist (substatement-open . 0)
@@ -2428,33 +2856,35 @@ (defun mdw-fontify-csharp ()
         (mdw-regexps "base" "false" "null" "this" "true")))
 
     (setq font-lock-keywords
         (mdw-regexps "base" "false" "null" "this" "true")))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" csharp-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
-
-          ;; Handle the magic builtins defined above.
-          (list (concat "\\<\\(" csharp-builtins "\\)\\>")
-                '(0 font-lock-variable-name-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))))))
+           (list
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\<\\(" csharp-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+
+            ;; Handle the magic builtins defined above.
+            (list (concat "\\<\\(" csharp-builtins "\\)\\>")
+                  '(0 font-lock-variable-name-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))))))
 
 (define-derived-mode csharp-mode java-mode "C#"
   "Major mode for editing C# code.")
 
 
 (define-derived-mode csharp-mode java-mode "C#"
   "Major mode for editing C# code.")
 
+(add-hook 'csharp-mode-hook 'mdw-fontify-csharp t)
+
 ;;;--------------------------------------------------------------------------
 ;;; F# programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; F# programming configuration.
 
@@ -2511,68 +2941,73 @@ (defun mdw-fontify-fsharp ()
         (mdw-regexps "if" "indent" "else" "endif")))
 
     (setq font-lock-keywords
         (mdw-regexps "if" "indent" "else" "endif")))
 
     (setq font-lock-keywords
-         (list (list (concat "\\(^\\|[^\"]\\)"
-                             "\\(" "(\\*"
-                                   "[^*]*\\*+"
-                                   "\\(" "[^)*]" "[^*]*" "\\*+" "\\)*"
-                                   ")"
-                             "\\|"
-                                   "//.*"
-                             "\\)")
-                     '(2 font-lock-comment-face))
-
-               (list (concat "'" "\\("
-                                   "\\\\"
-                                   "\\(" "[ntbr'\\]"
-                                   "\\|" "[0-9][0-9][0-9]"
-                                   "\\|" "u" "[0-9a-fA-F]\\{4\\}"
-                                   "\\|" "U" "[0-9a-fA-F]\\{8\\}"
-                                   "\\)"
-                                 "\\|"
-                                 "." "\\)" "'"
-                             "\\|"
-                             "\"" "[^\"\\]*"
-                                   "\\(" "\\\\" "\\(.\\|\n\\)"
-                                         "[^\"\\]*" "\\)*"
-                             "\\(\"\\|\\'\\)")
-                     '(0 font-lock-string-face))
-
-               (list (concat "\\_<\\(" bang-keywords "\\)!" "\\|"
-                             "^#[ \t]*\\(" preprocessor-keywords "\\)\\_>"
-                             "\\|"
-                             "\\_<\\(" fsharp-keywords "\\)\\_>")
-                     '(0 font-lock-keyword-face))
-               (list (concat "\\<\\(" fsharp-builtins "\\)\\_>")
-                     '(0 font-lock-variable-name-face))
-
-               (list (concat "\\_<"
-                             "\\(" "0[bB][01]+" "\\|"
-                                   "0[oO][0-7]+" "\\|"
-                                   "0[xX][0-9a-fA-F]+" "\\)"
-                             "\\(" "lf\\|LF" "\\|"
-                                   "[uU]?[ysnlL]?" "\\)"
-                             "\\|"
-                             "\\_<"
-                             "[0-9]+" "\\("
-                               "[mMQRZING]"
+           (list (list (concat "\\(^\\|[^\"]\\)"
+                               "\\(" "(\\*"
+                                     "[^*]*\\*+"
+                                     "\\(" "[^)*]" "[^*]*" "\\*+" "\\)*"
+                                     ")"
                                "\\|"
                                "\\|"
-                               "\\(\\.[0-9]*\\)?"
-                               "\\([eE][-+]?[0-9]+\\)?"
-                               "[fFmM]?"
+                                     "//.*"
+                               "\\)")
+                       '(2 font-lock-comment-face))
+
+                 (list (concat "'" "\\("
+                                     "\\\\"
+                                     "\\(" "[ntbr'\\]"
+                                     "\\|" "[0-9][0-9][0-9]"
+                                     "\\|" "u" "[0-9a-fA-F]\\{4\\}"
+                                     "\\|" "U" "[0-9a-fA-F]\\{8\\}"
+                                     "\\)"
+                                   "\\|"
+                                   "." "\\)" "'"
                                "\\|"
                                "\\|"
-                               "[uU]?[ysnlL]?"
-                             "\\)")
-                     '(0 mdw-number-face))
+                               "\"" "[^\"\\]*"
+                                     "\\(" "\\\\" "\\(.\\|\n\\)"
+                                           "[^\"\\]*" "\\)*"
+                               "\\(\"\\|\\'\\)")
+                       '(0 font-lock-string-face))
+
+                 (list (concat "\\_<\\(" bang-keywords "\\)!" "\\|"
+                               "^#[ \t]*\\(" preprocessor-keywords "\\)\\_>"
+                               "\\|"
+                               "\\_<\\(" fsharp-keywords "\\)\\_>")
+                       '(0 font-lock-keyword-face))
+                 (list (concat "\\<\\(" fsharp-builtins "\\)\\_>")
+                       '(0 font-lock-variable-name-face))
+
+                 (list (concat "\\_<"
+                               "\\(" "0[bB][01]+" "\\|"
+                                     "0[oO][0-7]+" "\\|"
+                                     "0[xX][0-9a-fA-F]+" "\\)"
+                               "\\(" "lf\\|LF" "\\|"
+                                     "[uU]?[ysnlL]?" "\\)"
+                               "\\|"
+                               "\\_<"
+                               "[0-9]+" "\\("
+                                 "[mMQRZING]"
+                                 "\\|"
+                                 "\\(\\.[0-9]*\\)?"
+                                 "\\([eE][-+]?[0-9]+\\)?"
+                                 "[fFmM]?"
+                                 "\\|"
+                                 "[uU]?[ysnlL]?"
+                               "\\)")
+                       '(0 mdw-number-face))
 
 
-               (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                     '(0 mdw-punct-face))))))
+                 (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                       '(0 mdw-punct-face))))))
 
 (defun mdw-fontify-inferior-fsharp ()
   (mdw-fontify-fsharp)
   (setq font-lock-keywords
 
 (defun mdw-fontify-inferior-fsharp ()
   (mdw-fontify-fsharp)
   (setq font-lock-keywords
-       (append (list (list "^[#-]" '(0 font-lock-comment-face))
-                     (list "^>" '(0 font-lock-keyword-face)))
-               font-lock-keywords)))
+         (append (list (list "^[#-]" '(0 font-lock-comment-face))
+                       (list "^>" '(0 font-lock-keyword-face)))
+                 font-lock-keywords)))
+
+(progn
+  (add-hook 'fsharp-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'fsharp-mode-hook 'mdw-fontify-fsharp t)
+  (add-hook 'inferior-fsharp-mode-hooks 'mdw-fontify-inferior-fsharp t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Go programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Go programming configuration.
@@ -2597,44 +3032,47 @@ (defun mdw-fontify-go ()
                      "new" "panic" "real" "recover")))
 
     (setq font-lock-keywords
                      "new" "panic" "real" "recover")))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" go-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
-          (list (concat "\\<\\(" go-intrinsics "\\)\\>")
-                '(0 font-lock-variable-name-face))
-
-          ;; Strings and characters.
-          (list (concat "'"
-                        "\\(" "[^\\']" "\\|"
-                              "\\\\"
-                              "\\(" "[abfnrtv\\'\"]" "\\|"
-                                    "[0-7]\\{3\\}" "\\|"
-                                    "x" "[0-9A-Fa-f]\\{2\\}" "\\|"
-                                    "u" "[0-9A-Fa-f]\\{4\\}" "\\|"
-                                    "U" "[0-9A-Fa-f]\\{8\\}" "\\)" "\\)"
-                        "'"
-                        "\\|"
-                        "\""
-                        "\\(" "[^\n\\\"]+" "\\|" "\\\\." "\\)*"
-                        "\\(\"\\|$\\)"
-                        "\\|"
-                        "`" "[^`]+" "`")
-                '(0 font-lock-string-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]+\\|\\)\\)")
-                '(0 mdw-number-face))
-
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+           (list
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\<\\(" go-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+            (list (concat "\\<\\(" go-intrinsics "\\)\\>")
+                  '(0 font-lock-variable-name-face))
+
+            ;; Strings and characters.
+            (list (concat "'"
+                          "\\(" "[^\\']" "\\|"
+                                "\\\\"
+                                "\\(" "[abfnrtv\\'\"]" "\\|"
+                                      "[0-7]\\{3\\}" "\\|"
+                                      "x" "[0-9A-Fa-f]\\{2\\}" "\\|"
+                                      "u" "[0-9A-Fa-f]\\{4\\}" "\\|"
+                                      "U" "[0-9A-Fa-f]\\{8\\}" "\\)" "\\)"
+                          "'"
+                          "\\|"
+                          "\""
+                          "\\(" "[^\n\\\"]+" "\\|" "\\\\." "\\)*"
+                          "\\(\"\\|$\\)"
+                          "\\|"
+                          "`" "[^`]+" "`")
+                  '(0 font-lock-string-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]+\\)?\\)")
+                  '(0 mdw-number-face))
+
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+(progn
+  (add-hook 'go-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'go-mode-hook 'mdw-fontify-go t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Rust programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Rust programming configuration.
@@ -2683,44 +3121,48 @@ (defun mdw-fontify-rust ()
                      "char" "str"
                      "self" "Self")))
     (setq font-lock-keywords
                      "char" "str"
                      "self" "Self")))
     (setq font-lock-keywords
-         (list
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\_<\\(" rust-keywords "\\)\\_>")
-                '(0 font-lock-keyword-face))
-          (list (concat "\\_<\\(" rust-builtins "\\)\\_>")
-                '(0 font-lock-variable-name-face))
-
-          ;; Handle numbers too.
-          (list (concat "\\_<\\("
-                              "[0-9][0-9_]*"
-                              "\\(" "\\(\\.[0-9_]+\\)?[eE][-+]?[0-9_]+"
-                              "\\|" "\\.[0-9_]+"
-                              "\\)"
-                              "\\(f32\\|f64\\)?"
-                        "\\|" "\\(" "[0-9][0-9_]*"
-                              "\\|" "0x[0-9a-fA-F_]+"
-                              "\\|" "0o[0-7_]+"
-                              "\\|" "0b[01_]+"
-                              "\\)"
-                              "\\([ui]\\(8\\|16\\|32\\|64\\|size\\)\\)?"
-                        "\\)\\_>")
-                '(0 mdw-number-face))
-
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+           (list
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\_<\\(" rust-keywords "\\)\\_>")
+                  '(0 font-lock-keyword-face))
+            (list (concat "\\_<\\(" rust-builtins "\\)\\_>")
+                  '(0 font-lock-variable-name-face))
+
+            ;; Handle numbers too.
+            (list (concat "\\_<\\("
+                                "[0-9][0-9_]*"
+                                "\\(" "\\(\\.[0-9_]+\\)?[eE][-+]?[0-9_]+"
+                                "\\|" "\\.[0-9_]+"
+                                "\\)"
+                                "\\(f32\\|f64\\)?"
+                          "\\|" "\\(" "[0-9][0-9_]*"
+                                "\\|" "0x[0-9a-fA-F_]+"
+                                "\\|" "0o[0-7_]+"
+                                "\\|" "0b[01_]+"
+                                "\\)"
+                                "\\([ui]\\(8\\|16\\|32\\|64\\|size\\)\\)?"
+                          "\\)\\_>")
+                  '(0 mdw-number-face))
+
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face)))))
 
   ;; Hack key bindings.
   (local-set-key [?{] 'mdw-self-insert-and-indent)
   (local-set-key [?}] 'mdw-self-insert-and-indent))
 
 
   ;; Hack key bindings.
   (local-set-key [?{] 'mdw-self-insert-and-indent)
   (local-set-key [?}] 'mdw-self-insert-and-indent))
 
+(progn
+  (add-hook 'rust-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'rust-mode-hook 'mdw-fontify-rust t))
+
 ;;;--------------------------------------------------------------------------
 ;;; Awk programming configuration.
 
 ;; Make Awk indentation nice.
 
 ;;;--------------------------------------------------------------------------
 ;;; Awk programming configuration.
 
 ;; Make Awk indentation nice.
 
-(mdw-define-c-style mdw-awk
+(mdw-define-c-style mdw-awk ()
   (c-basic-offset . 2)
   (c-offsets-alist (substatement-open . 0)
                   (c-backslash-column . 72)
   (c-basic-offset . 2)
   (c-offsets-alist (substatement-open . 0)
                   (c-backslash-column . 72)
@@ -2751,39 +3193,44 @@ (defun mdw-fontify-awk ()
                      "systime" "tolower" "toupper" "while")))
 
     (setq font-lock-keywords
                      "systime" "tolower" "toupper" "while")))
 
     (setq font-lock-keywords
-         (list
-
-          ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" c-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]+\\|\\)\\)"
-                        "[uUlL]*")
-                '(0 mdw-number-face))
-
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+           (list
+
+            ;; Handle the keywords defined above.
+            (list (concat "\\<\\(" c-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]+\\)?\\)"
+                          "[uUlL]*")
+                  '(0 mdw-number-face))
+
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'awk-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'awk-mode-hook 'mdw-fontify-awk t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Perl programming style.
 
 ;; Perl indentation style.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Perl programming style.
 
 ;; Perl indentation style.
 
-(setq perl-indent-level 2)
+(setq-default perl-indent-level 2)
 
 
-(setq cperl-indent-level 2)
-(setq cperl-continued-statement-offset 2)
-(setq cperl-continued-brace-offset 0)
-(setq cperl-brace-offset -2)
-(setq cperl-brace-imaginary-offset 0)
-(setq cperl-label-offset 0)
+(setq-default cperl-indent-level 2
+             cperl-continued-statement-offset 2
+             cperl-indent-region-fix-constructs nil
+             cperl-continued-brace-offset 0
+             cperl-brace-offset -2
+             cperl-brace-imaginary-offset 0
+             cperl-label-offset 0)
 
 ;; Define perl fontification style.
 
 
 ;; Define perl fontification style.
 
@@ -2817,21 +3264,21 @@ (defun mdw-fontify-perl ()
                      "when" "while")))
 
     (setq font-lock-keywords
                      "when" "while")))
 
     (setq font-lock-keywords
-         (list
+           (list
 
 
-          ;; Set up the keywords defined above.
-          (list (concat "\\<\\(" perl-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
+            ;; Set up the keywords defined above.
+            (list (concat "\\<\\(" perl-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
 
 
-          ;; At least numbers are simpler than C.
-          (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
-                        "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
-                        "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
-                '(0 mdw-number-face))
+            ;; At least numbers are simpler than C.
+            (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
+                          "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\)?"
+                          "\\([eE][-+]?[0-9_]+\\)?")
+                  '(0 mdw-number-face))
 
 
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
 
 (defun perl-number-tests (&optional arg)
   "Assign consecutive numbers to lines containing `#t'.  With ARG,
 
 (defun perl-number-tests (&optional arg)
   "Assign consecutive numbers to lines containing `#t'.  With ARG,
@@ -2848,33 +3295,43 @@ (defun perl-number-tests (&optional arg)
       (if (re-search-forward "\\(tests\\s-*=>\\s-*\\)\\w*" nil t)
          (replace-match (format "\\1%d" i))))))
 
       (if (re-search-forward "\\(tests\\s-*=>\\s-*\\)\\w*" nil t)
          (replace-match (format "\\1%d" i))))))
 
+(dolist (hook '(perl-mode-hook cperl-mode-hook))
+  (add-hook hook 'mdw-misc-mode-config t)
+  (add-hook hook 'mdw-fontify-perl t))
+
 ;;;--------------------------------------------------------------------------
 ;;; Python programming style.
 
 ;;;--------------------------------------------------------------------------
 ;;; Python programming style.
 
+(setq-default py-indent-offset 2
+             python-indent 2
+             python-indent-offset 2
+             python-fill-docstring-style 'symmetric)
+
 (defun mdw-fontify-pythonic (keywords)
 
   ;; Miscellaneous fiddling.
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
   (setq indent-tabs-mode nil)
 (defun mdw-fontify-pythonic (keywords)
 
   ;; Miscellaneous fiddling.
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
   (setq indent-tabs-mode nil)
+  (set (make-local-variable 'forward-sexp-function) nil)
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
-       (list
+         (list
 
 
-        ;; Set up the keywords defined above.
-        (list (concat "\\_<\\(" keywords "\\)\\_>")
-              '(0 font-lock-keyword-face))
+          ;; Set up the keywords defined above.
+          (list (concat "\\_<\\(" keywords "\\)\\_>")
+                '(0 font-lock-keyword-face))
 
 
-        ;; At least numbers are simpler than C.
-        (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO]?[0-7]+\\|[bB][01]+\\)\\|"
-                      "\\_<[0-9][0-9]*\\(\\.[0-9]*\\|\\)"
-                      "\\([eE]\\([-+]\\|\\)[0-9]+\\|[lL]\\|\\)")
-              '(0 mdw-number-face))
+          ;; At least numbers are simpler than C.
+          (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO]?[0-7]+\\|[bB][01]+\\)\\|"
+                        "\\_<[0-9][0-9]*\\(\\.[0-9]*\\)?"
+                        "\\([eE][-+]?[0-9]+\\|[lL]\\)?")
+                '(0 mdw-number-face))
 
 
-        ;; And anything else is punctuation.
-        (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face)))))
+          ;; And anything else is punctuation.
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face)))))
 
 ;; Define Python fontification styles.
 
 
 ;; Define Python fontification styles.
 
@@ -2898,15 +3355,20 @@ (defun mdw-fontify-pyrex ()
 (define-derived-mode pyrex-mode python-mode "Pyrex"
   "Major mode for editing Pyrex source code")
 (setq auto-mode-alist
 (define-derived-mode pyrex-mode python-mode "Pyrex"
   "Major mode for editing Pyrex source code")
 (setq auto-mode-alist
-      (append '(("\\.pyx$" . pyrex-mode)
-               ("\\.pxd$" . pyrex-mode)
-               ("\\.pxi$" . pyrex-mode))
-             auto-mode-alist))
+       (append '(("\\.pyx$" . pyrex-mode)
+                 ("\\.pxd$" . pyrex-mode)
+                 ("\\.pxi$" . pyrex-mode))
+               auto-mode-alist))
+
+(progn
+  (add-hook 'python-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'python-mode-hook 'mdw-fontify-python t)
+  (add-hook 'pyrex-mode-hook 'mdw-fontify-pyrex t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Lua programming style.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Lua programming style.
 
-(setq lua-indent-level 2)
+(setq-default lua-indent-level 2)
 
 (defun mdw-fontify-lua ()
 
 
 (defun mdw-fontify-lua ()
 
@@ -2921,40 +3383,44 @@ (defun mdw-fontify-lua ()
                      "nil" "not" "or" "repeat" "return" "then" "true"
                      "until" "while")))
     (setq font-lock-keywords
                      "nil" "not" "or" "repeat" "return" "then" "true"
                      "until" "while")))
     (setq font-lock-keywords
-         (list
-
-          ;; Set up the keywords defined above.
-          (list (concat "\\_<\\(" lua-keywords "\\)\\_>")
-                '(0 font-lock-keyword-face))
-
-          ;; At least numbers are simpler than C.
-          (list (concat "\\_<\\(" "0[xX]"
-                                  "\\(" "[0-9a-fA-F]+"
-                                        "\\(\\.[0-9a-fA-F]*\\)?"
-                                  "\\|" "\\.[0-9a-fA-F]+"
-                                  "\\)"
-                                  "\\([pP][-+]?[0-9]+\\)?"
-                            "\\|" "\\(" "[0-9]+"
-                                        "\\(\\.[0-9]*\\)?"
-                                  "\\|" "\\.[0-9]+"
-                                  "\\)"
-                                  "\\([eE][-+]?[0-9]+\\)?"
-                            "\\)")
-                '(0 mdw-number-face))
-
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+           (list
+
+            ;; Set up the keywords defined above.
+            (list (concat "\\_<\\(" lua-keywords "\\)\\_>")
+                  '(0 font-lock-keyword-face))
+
+            ;; At least numbers are simpler than C.
+            (list (concat "\\_<\\(" "0[xX]"
+                                    "\\(" "[0-9a-fA-F]+"
+                                          "\\(\\.[0-9a-fA-F]*\\)?"
+                                    "\\|" "\\.[0-9a-fA-F]+"
+                                    "\\)"
+                                    "\\([pP][-+]?[0-9]+\\)?"
+                              "\\|" "\\(" "[0-9]+"
+                                          "\\(\\.[0-9]*\\)?"
+                                    "\\|" "\\.[0-9]+"
+                                    "\\)"
+                                    "\\([eE][-+]?[0-9]+\\)?"
+                              "\\)")
+                  '(0 mdw-number-face))
+
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'lua-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'lua-mode-hook 'mdw-fontify-lua t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Icon programming style.
 
 ;; Icon indentation style.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Icon programming style.
 
 ;; Icon indentation style.
 
-(setq icon-brace-offset 0
-      icon-continued-brace-offset 0
-      icon-continued-statement-offset 2
-      icon-indent-level 2)
+(setq-default icon-brace-offset 0
+             icon-continued-brace-offset 0
+             icon-continued-statement-offset 2
+             icon-indent-level 2)
 
 ;; Define Icon fontification style.
 
 
 ;; Define Icon fontification style.
 
@@ -2975,31 +3441,246 @@ (defun mdw-fontify-icon ()
         (mdw-regexps "define" "else" "endif" "error" "ifdef" "ifndef"
                      "include" "line" "undef")))
     (setq font-lock-keywords
         (mdw-regexps "define" "else" "endif" "error" "ifdef" "ifndef"
                      "include" "line" "undef")))
     (setq font-lock-keywords
-         (list
+           (list
 
 
-          ;; Set up the keywords defined above.
-          (list (concat "\\<\\(" icon-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
+            ;; Set up the keywords defined above.
+            (list (concat "\\<\\(" icon-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
 
 
-          ;; The things that Icon calls keywords.
-          (list "&\\sw+\\>" '(0 font-lock-variable-name-face))
+            ;; The things that Icon calls keywords.
+            (list "&\\sw+\\>" '(0 font-lock-variable-name-face))
 
 
-          ;; At least numbers are simpler than C.
-          (list (concat "\\<[0-9]+"
-                        "\\([rR][0-9a-zA-Z]+\\|"
-                        "\\.[0-9]+\\([eE][+-]?[0-9]+\\)?\\)\\>\\|"
-                        "\\.[0-9]+\\([eE][+-]?[0-9]+\\)?\\>")
-                '(0 mdw-number-face))
+            ;; At least numbers are simpler than C.
+            (list (concat "\\<[0-9]+"
+                          "\\([rR][0-9a-zA-Z]+\\|"
+                          "\\.[0-9]+\\([eE][+-]?[0-9]+\\)?\\)\\>\\|"
+                          "\\.[0-9]+\\([eE][+-]?[0-9]+\\)?\\>")
+                  '(0 mdw-number-face))
 
 
-          ;; Preprocessor.
-          (list (concat "^[ \t]*$[ \t]*\\<\\("
-                        preprocessor-keywords
-                        "\\)\\>")
-                '(0 font-lock-keyword-face))
+            ;; Preprocessor.
+            (list (concat "^[ \t]*$[ \t]*\\<\\("
+                          preprocessor-keywords
+                          "\\)\\>")
+                  '(0 font-lock-keyword-face))
 
 
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'icon-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'icon-mode-hook 'mdw-fontify-icon t))
+
+;;;--------------------------------------------------------------------------
+;;; Fortran mode.
+
+(defun mdw-fontify-fortran-common ()
+  (let ((fortran-keywords
+        (mdw-regexps "access"
+                     "assign"
+                     "associate"
+                     "backspace"
+                     "blank"
+                     "block\\s-*data"
+                     "call"
+                     "case"
+                     "character"
+                     "class"
+                     "close"
+                     "common"
+                     "complex"
+                     "continue"
+                     "critical"
+                     "data"
+                     "dimension"
+                     "do"
+                     "double\\s-*precision"
+                     "else" "elseif" "elsewhere"
+                     "end"
+                       "endblock" "endblockdata"
+                       "endcritical"
+                       "enddo"
+                       "endinterface"
+                       "endmodule"
+                       "endprocedure"
+                       "endprogram"
+                       "endselect"
+                       "endsubmodule"
+                       "endsubroutine"
+                       "endtype"
+                       "endwhere"
+                       "endenum"
+                       "end\\s-*file"
+                       "endforall"
+                       "endfunction"
+                       "endif"
+                     "entry"
+                     "enum"
+                     "equivalence"
+                     "err"
+                     "external"
+                     "file"
+                     "fmt"
+                     "forall"
+                     "form"
+                     "format"
+                     "function"
+                     "go\\s-*to"
+                     "if"
+                     "implicit"
+                     "in" "inout"
+                     "inquire"
+                     "include"
+                     "integer"
+                     "interface"
+                     "intrinsic"
+                     "iostat"
+                     "len"
+                     "logical"
+                     "module"
+                     "open"
+                     "out"
+                     "parameter"
+                     "pause"
+                     "procedure"
+                     "program"
+                     "precision"
+                     "program"
+                     "read"
+                     "real"
+                     "rec"
+                     "recl"
+                     "return"
+                     "rewind"
+                     "save"
+                     "select" "selectcase" "selecttype"
+                     "status"
+                     "stop"
+                     "submodule"
+                     "subroutine"
+                     "then"
+                     "to"
+                     "type"
+                     "unit"
+                     "where"
+                     "write"))
+       (fortran-operators (mdw-regexps "and"
+                                       "eq"
+                                       "eqv"
+                                       "false"
+                                       "ge"
+                                       "gt"
+                                       "le"
+                                       "lt"
+                                       "ne"
+                                       "neqv"
+                                       "not"
+                                       "or"
+                                       "true"))
+       (fortran-intrinsics (mdw-regexps "abs" "dabs" "iabs" "cabs"
+                                        "atan" "datan" "atan2" "datan2"
+                                        "cmplx"
+                                        "conjg"
+                                        "cos" "dcos" "ccos"
+                                        "dble"
+                                        "dim" "idim"
+                                        "exp" "dexp" "cexp"
+                                        "float"
+                                        "ifix"
+                                        "aimag"
+                                        "int" "aint" "idint"
+                                        "alog" "dlog" "clog"
+                                        "alog10" "dlog10"
+                                        "max"
+                                        "amax0" "amax1"
+                                        "max0" "max1"
+                                        "dmax1"
+                                        "min"
+                                        "amin0" "amin1"
+                                        "min0" "min1"
+                                        "dmin1"
+                                        "mod" "amod" "dmod"
+                                        "sin" "dsin" "csin"
+                                        "sign" "isign" "dsign"
+                                        "sngl"
+                                        "sqrt" "dsqrt" "csqrt"
+                                        "tanh"))
+       (preprocessor-keywords
+        (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
+                     "ident" "if" "ifdef" "ifndef" "import" "include"
+                     "line" "pragma" "unassert" "undef" "warning")))
+    (setq font-lock-keywords-case-fold-search t
+           font-lock-keywords
+           (list
+
+            ;; Fontify include files as strings.
+            (list (concat "^[ \t]*\\#[ \t]*" "include"
+                          "[ \t]*\\(<[^>]+>?\\)")
+                  '(1 font-lock-string-face))
+
+            ;; Preprocessor directives are `references'?.
+            (list (concat "^\\([ \t]*#[ \t]*\\(\\("
+                          preprocessor-keywords
+                          "\\)\\>\\|[0-9]+\\|$\\)\\)")
+                  '(1 font-lock-keyword-face))
+
+            ;; Set up the keywords defined above.
+            (list (concat "\\<\\(" fortran-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+
+            ;; Set up the `.foo.' operators.
+            (list (concat "\\.\\(" fortran-operators "\\)\\.")
+                  '(0 font-lock-keyword-face))
+
+            ;; Set up the intrinsic functions.
+            (list (concat "\\<\\(" fortran-intrinsics "\\)\\>")
+                  '(0 font-lock-variable-name-face))
+
+            ;; Numbers.
+            (list (concat       "\\(" "\\<" "[0-9]+" "\\(\\.[0-9]*\\)?"
+                                "\\|" "\\.[0-9]+"
+                                "\\)"
+                                "\\(" "[de]" "[+-]?" "[0-9]+" "\\)?"
+                                "\\(" "_" "\\sw+" "\\)?"
+                          "\\|" "b'[01]*'" "\\|" "'[01]*'b"
+                          "\\|" "b\"[01]*\"" "\\|" "\"[01]*\"b"
+                          "\\|" "o'[0-7]*'" "\\|" "'[0-7]*'o"
+                          "\\|" "o\"[0-7]*\"" "\\|" "\"[0-7]*\"o"
+                          "\\|" "[xz]'[0-9a-f]*'" "\\|" "'[0-9a-f]*'[xz]"
+                          "\\|" "[xz]\"[0-9a-f]*\"" "\\|" "\"[0-9a-f]*\"[xz]")
+                  '(0 mdw-number-face))
+
+            ;; Any anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))
+
+    (modify-syntax-entry ?/ "." font-lock-syntax-table)
+    (modify-syntax-entry ?< ".")
+    (modify-syntax-entry ?> ".")))
+
+(defun mdw-fontify-fortran () (mdw-fontify-fortran-common))
+(defun mdw-fontify-f90 () (mdw-fontify-fortran-common))
+
+(setq fortran-do-indent 2
+      fortran-if-indent 2
+      fortran-structure-indent 2
+      fortran-comment-line-start "*"
+      fortran-comment-indent-style 'relative
+      fortran-continuation-string "&"
+      fortran-continuation-indent 4)
+
+(setq f90-do-indent 2
+      f90-if-indent 2
+      f90-program-indent 2
+      f90-continuation-indent 4
+      f90-smart-end-names nil
+      f90-smart-end 'no-blink)
+
+(progn
+  (add-hook 'fortran-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'fortran-mode-hook 'mdw-fontify-fortran t)
+  (add-hook 'f90-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'f90-mode-hook 'mdw-fontify-f90 t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Assembler mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; Assembler mode.
@@ -3024,21 +3705,32 @@ (defun mdw-asm-set-comment ()
 (add-hook 'asm-mode-local-variables-hook 'mdw-asm-set-comment)
 (put 'asm-comment-char 'safe-local-variable 'characterp)
 
 (add-hook 'asm-mode-local-variables-hook 'mdw-asm-set-comment)
 (put 'asm-comment-char 'safe-local-variable 'characterp)
 
+(progn
+  (add-hook 'asm-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'asm-mode-hook 'mdw-fontify-asm t))
+
 ;;;--------------------------------------------------------------------------
 ;;; TCL configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; TCL configuration.
 
+(setq-default tcl-indent-level 2)
+
 (defun mdw-fontify-tcl ()
 (defun mdw-fontify-tcl ()
-  (mapcar #'(lambda (ch) (modify-syntax-entry ch ".")) '(?$))
+  (dolist (ch '(?$))
+    (modify-syntax-entry ch "."))
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
-       (list
-        (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
-                      "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
-                      "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
-              '(0 mdw-number-face))
-        (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face)))))
+         (list
+          (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
+                        "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\)?"
+                        "\\([eE][-+]?[0-9_]+\\)?")
+                '(0 mdw-number-face))
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face)))))
+
+(progn
+  (add-hook 'tcl-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'tcl-mode-hook 'mdw-fontify-tcl t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Dylan programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Dylan programming configuration.
@@ -3082,34 +3774,38 @@ (defun mdw-fontify-dylan ()
                          "all-keys" "key" "next" "rest" "include"
                          "t" "f")))
     (setq font-lock-keywords
                          "all-keys" "key" "next" "rest" "include"
                          "t" "f")))
     (setq font-lock-keywords
-         (list (list (concat "\\<\\(" dylan-keywords
-                             "\\|" "with\\(out\\)?-" word
-                             "\\)\\>")
-                     '(0 font-lock-keyword-face))
-               (list (concat "\\<" word ":" "\\|"
-                             "#\\(" sharp-keywords "\\)\\>")
-                     '(0 font-lock-variable-name-face))
-               (list (concat "\\("
-                             "\\([-+]\\|\\<\\)[0-9]+" "\\("
-                               "\\(\\.[0-9]+\\)?" "\\([eE][-+][0-9]+\\)?"
-                               "\\|" "/[0-9]+"
-                             "\\)"
-                             "\\|" "\\.[0-9]+" "\\([eE][-+][0-9]+\\)?"
-                             "\\|" "#b[01]+"
-                             "\\|" "#o[0-7]+"
-                             "\\|" "#x[0-9a-zA-Z]+"
-                             "\\)\\>")
-                     '(0 mdw-number-face))
-               (list (concat "\\("
-                             "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|"
-                             "\\_<[-+*/=<>:&|]+\\_>"
-                             "\\)")
-                     '(0 mdw-punct-face))))))
+           (list (list (concat "\\<\\(" dylan-keywords
+                               "\\|" "with\\(out\\)?-" word
+                               "\\)\\>")
+                       '(0 font-lock-keyword-face))
+                 (list (concat "\\<" word ":" "\\|"
+                               "#\\(" sharp-keywords "\\)\\>")
+                       '(0 font-lock-variable-name-face))
+                 (list (concat "\\("
+                               "\\([-+]\\|\\<\\)[0-9]+" "\\("
+                                 "\\(\\.[0-9]+\\)?" "\\([eE][-+][0-9]+\\)?"
+                                 "\\|" "/[0-9]+"
+                               "\\)"
+                               "\\|" "\\.[0-9]+" "\\([eE][-+][0-9]+\\)?"
+                               "\\|" "#b[01]+"
+                               "\\|" "#o[0-7]+"
+                               "\\|" "#x[0-9a-zA-Z]+"
+                               "\\)\\>")
+                       '(0 mdw-number-face))
+                 (list (concat "\\("
+                               "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|"
+                               "\\_<[-+*/=<>:&|]+\\_>"
+                               "\\)")
+                       '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'dylan-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'dylan-mode-hook 'mdw-fontify-dylan t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Algol 68 configuration.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Algol 68 configuration.
 
-(setq a68-indent-step 2)
+(setq-default a68-indent-step 2)
 
 (defun mdw-fontify-algol-68 ()
 
 
 (defun mdw-fontify-algol-68 ()
 
@@ -3129,24 +3825,28 @@ (defun mdw-fontify-algol-68 ()
                (i 1 (1+ i)))
               ((>= i (length word)) regexp)))))
     (setq font-lock-keywords
                (i 1 (1+ i)))
               ((>= i (length word)) regexp)))))
     (setq font-lock-keywords
-         (list (list (concat "\\<COMMENT\\>"
-                             "\\(" not-comment "\\)\\{0,5\\}"
-                             "\\(\\'\\|\\<COMMENT\\>\\)")
-                     '(0 font-lock-comment-face))
-               (list (concat "\\<CO\\>"
-                             "\\([^C]+\\|C[^O]\\)\\{0,5\\}"
-                             "\\($\\|\\<CO\\>\\)")
-                     '(0 font-lock-comment-face))
-               (list "\\<[A-Z_]+\\>"
-                     '(0 font-lock-keyword-face))
-               (list (concat "\\<"
-                             "[0-9]+"
-                             "\\(\\.[0-9]+\\)?"
-                             "\\([eE][-+]?[0-9]+\\)?"
-                             "\\>")
-                     '(0 mdw-number-face))
-               (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
-                     '(0 mdw-punct-face))))))
+           (list (list (concat "\\<COMMENT\\>"
+                               "\\(" not-comment "\\)\\{0,5\\}"
+                               "\\(\\'\\|\\<COMMENT\\>\\)")
+                       '(0 font-lock-comment-face))
+                 (list (concat "\\<CO\\>"
+                               "\\([^C]+\\|C[^O]\\)\\{0,5\\}"
+                               "\\($\\|\\<CO\\>\\)")
+                       '(0 font-lock-comment-face))
+                 (list "\\<[A-Z_]+\\>"
+                       '(0 font-lock-keyword-face))
+                 (list (concat "\\<"
+                               "[0-9]+"
+                               "\\(\\.[0-9]+\\)?"
+                               "\\([eE][-+]?[0-9]+\\)?"
+                               "\\>")
+                       '(0 mdw-number-face))
+                 (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
+                       '(0 mdw-punct-face))))))
+
+(dolist (hook '(a68-mode-hook a68-mode-hooks))
+  (add-hook hook 'mdw-misc-mode-config t)
+  (add-hook hook 'mdw-fontify-algol-68 t))
 
 ;;;--------------------------------------------------------------------------
 ;;; REXX configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; REXX configuration.
@@ -3168,10 +3868,8 @@ (defun mdw-fontify-rexx ()
   (setq mdw-auto-indent nil)
   (local-set-key [?\C-m] 'mdw-rexx-indent-newline-indent)
   (local-set-key [?*] 'mdw-rexx-electric-*)
   (setq mdw-auto-indent nil)
   (local-set-key [?\C-m] 'mdw-rexx-indent-newline-indent)
   (local-set-key [?*] 'mdw-rexx-electric-*)
-  (mapcar #'(lambda (ch) (modify-syntax-entry ch "w"))
-         '(?! ?? ?# ?@ ?$))
-  (mapcar #'(lambda (ch) (modify-syntax-entry ch "."))
-         '(?¬))
+  (dolist (ch '(?! ?? ?# ?@ ?$)) (modify-syntax-entry ch "w"))
+  (dolist (ch '(?¬)) (modify-syntax-entry ch "."))
   (mdw-standard-fill-prefix "\\([ \t]*/?\*[ \t]*\\)")
 
   ;; Set up keywords and things for fontification.
   (mdw-standard-fill-prefix "\\([ \t]*/?\*[ \t]*\\)")
 
   ;; Set up keywords and things for fontification.
@@ -3208,24 +3906,33 @@ (defun mdw-fontify-rexx ()
                      "x2d")))
 
     (setq font-lock-keywords
                      "x2d")))
 
     (setq font-lock-keywords
-         (list
+           (list
 
 
-          ;; Set up the keywords defined above.
-          (list (concat "\\<\\(" rexx-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
+            ;; Set up the keywords defined above.
+            (list (concat "\\<\\(" rexx-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
 
 
-          ;; Fontify all symbols the same way.
-          (list (concat "\\<\\([0-9.][A-Za-z0-9.!?_#@$]*[Ee][+-]?[0-9]+\\|"
-                        "[A-Za-z0-9.!?_#@$]+\\)")
-                '(0 font-lock-variable-name-face))
+            ;; Fontify all symbols the same way.
+            (list (concat "\\<\\([0-9.][A-Za-z0-9.!?_#@$]*[Ee][+-]?[0-9]+\\|"
+                          "[A-Za-z0-9.!?_#@$]+\\)")
+                  '(0 font-lock-variable-name-face))
 
 
-          ;; And everything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+            ;; And everything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'rexx-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'rexx-mode-hook 'mdw-fontify-rexx t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Standard ML programming style.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Standard ML programming style.
 
+(setq-default sml-nested-if-indent t
+             sml-case-indent nil
+             sml-indent-level 4
+             sml-type-of-indent nil)
+
 (defun mdw-fontify-sml ()
 
   ;; Make underscore an honorary letter.
 (defun mdw-fontify-sml ()
 
   ;; Make underscore an honorary letter.
@@ -3254,28 +3961,34 @@ (defun mdw-fontify-sml ()
                      "where" "while" "with" "withtype")))
 
     (setq font-lock-keywords
                      "where" "while" "with" "withtype")))
 
     (setq font-lock-keywords
-         (list
+           (list
 
 
-          ;; Set up the keywords defined above.
-          (list (concat "\\<\\(" sml-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
+            ;; Set up the keywords defined above.
+            (list (concat "\\<\\(" sml-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
 
 
-          ;; At least numbers are simpler than C.
-          (list (concat "\\<\\(\\~\\|\\)"
-                           "\\(0\\(\\([wW]\\|\\)[xX][0-9a-fA-F]+\\|"
-                                  "[wW][0-9]+\\)\\|"
-                               "\\([0-9]+\\(\\.[0-9]+\\|\\)"
-                                        "\\([eE]\\(\\~\\|\\)"
-                                               "[0-9]+\\|\\)\\)\\)")
-                '(0 mdw-number-face))
+            ;; At least numbers are simpler than C.
+            (list (concat "\\<\\~?"
+                             "\\(0\\([wW]?[xX][0-9a-fA-F]+\\|"
+                                    "[wW][0-9]+\\)\\|"
+                                 "\\([0-9]+\\(\\.[0-9]+\\)?"
+                                          "\\([eE]\\~?"
+                                                 "[0-9]+\\)?\\)\\)")
+                  '(0 mdw-number-face))
 
 
-          ;; And anything else is punctuation.
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+            ;; And anything else is punctuation.
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'sml-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'sml-mode-hook 'mdw-fontify-sml t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Haskell configuration.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Haskell configuration.
 
+(setq-default haskell-indent-offset 2)
+
 (defun mdw-fontify-haskell ()
 
   ;; Fiddle with syntax table to get comments right.
 (defun mdw-fontify-haskell ()
 
   ;; Fiddle with syntax table to get comments right.
@@ -3320,41 +4033,45 @@ (defun mdw-fontify-haskell ()
                      "SP" "STX" "SUB" "SYN" "US" "VT")))
 
     (setq font-lock-keywords
                      "SP" "STX" "SUB" "SYN" "US" "VT")))
 
     (setq font-lock-keywords
-         (list
-          (list (concat "{-" "[^-]*" "\\(-+[^-}][^-]*\\)*"
-                             "\\(-+}\\|-*\\'\\)"
-                        "\\|"
-                        "--.*$")
-                '(0 font-lock-comment-face))
-          (list (concat "\\_<\\(" haskell-keywords "\\)\\_>")
-                '(0 font-lock-keyword-face))
-          (list (concat "'\\("
-                        "[^\\]"
-                        "\\|"
-                        "\\\\"
-                        "\\(" "[abfnrtv\\\"']" "\\|"
-                              "^" "\\(" control-sequences "\\|"
-                                        "[]A-Z@[\\^_]" "\\)" "\\|"
-                              "\\|"
-                              "[0-9]+" "\\|"
-                              "[oO][0-7]+" "\\|"
-                              "[xX][0-9A-Fa-f]+"
-                        "\\)"
-                        "\\)'")
-                '(0 font-lock-string-face))
-          (list "\\_<[A-Z]\\(\\sw+\\|\\s_+\\)*\\_>"
-                '(0 font-lock-variable-name-face))
-          (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO][0-7]+\\)\\|"
-                        "\\_<[0-9]+\\(\\.[0-9]*\\|\\)"
-                        "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
-                '(0 mdw-number-face))
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+           (list
+            (list (concat "{-" "[^-]*" "\\(-+[^-}][^-]*\\)*"
+                               "\\(-+}\\|-*\\'\\)"
+                          "\\|"
+                          "--.*$")
+                  '(0 font-lock-comment-face))
+            (list (concat "\\_<\\(" haskell-keywords "\\)\\_>")
+                  '(0 font-lock-keyword-face))
+            (list (concat "'\\("
+                          "[^\\]"
+                          "\\|"
+                          "\\\\"
+                          "\\(" "[abfnrtv\\\"']" "\\|"
+                                "^" "\\(" control-sequences "\\|"
+                                          "[]A-Z@[\\^_]" "\\)" "\\|"
+                                "\\|"
+                                "[0-9]+" "\\|"
+                                "[oO][0-7]+" "\\|"
+                                "[xX][0-9A-Fa-f]+"
+                          "\\)"
+                          "\\)'")
+                  '(0 font-lock-string-face))
+            (list "\\_<[A-Z]\\(\\sw+\\|\\s_+\\)*\\_>"
+                  '(0 font-lock-variable-name-face))
+            (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO][0-7]+\\)\\|"
+                          "\\_<[0-9]+\\(\\.[0-9]*\\)?"
+                          "\\([eE][-+]?[0-9]+\\)?")
+                  '(0 mdw-number-face))
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'haskell-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'haskell-mode-hook 'mdw-fontify-haskell t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Erlang configuration.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; Erlang configuration.
 
-(setq erlang-electric-commands nil)
+(setq-default erlang-electric-commands nil)
 
 (defun mdw-fontify-erlang ()
 
 
 (defun mdw-fontify-erlang ()
 
@@ -3372,17 +4089,21 @@ (defun mdw-fontify-erlang ()
                      "query" "receive" "rem" "try" "when" "xor")))
 
     (setq font-lock-keywords
                      "query" "receive" "rem" "try" "when" "xor")))
 
     (setq font-lock-keywords
-         (list
-          (list "%.*$"
-                '(0 font-lock-comment-face))
-          (list (concat "\\<\\(" erlang-keywords "\\)\\>")
-                '(0 font-lock-keyword-face))
-          (list (concat "^-\\sw+\\>")
-                '(0 font-lock-keyword-face))
-          (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>"
-                '(0 mdw-number-face))
-          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+           (list
+            (list "%.*$"
+                  '(0 font-lock-comment-face))
+            (list (concat "\\<\\(" erlang-keywords "\\)\\>")
+                  '(0 font-lock-keyword-face))
+            (list (concat "^-\\sw+\\>")
+                  '(0 font-lock-keyword-face))
+            (list "\\<[0-9]+\\(#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)?\\>"
+                  '(0 mdw-number-face))
+            (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                  '(0 mdw-punct-face))))))
+
+(progn
+  (add-hook 'erlang-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'erlang-mode-hook 'mdw-fontify-erlang t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Texinfo configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Texinfo configuration.
@@ -3395,32 +4116,41 @@ (defun mdw-fontify-texinfo ()
   ;; Real fontification things.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
   ;; Real fontification things.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
-       (list
+         (list
+
+          ;; Environment names are keywords.
+          (list "@\\(end\\)  *\\([a-zA-Z]*\\)?"
+                '(2 font-lock-keyword-face))
 
 
-        ;; Environment names are keywords.
-        (list "@\\(end\\)  *\\([a-zA-Z]*\\)?"
-              '(2 font-lock-keyword-face))
+          ;; Unmark escaped magic characters.
+          (list "\\(@\\)\\([@{}]\\)"
+                '(1 font-lock-keyword-face)
+                '(2 font-lock-variable-name-face))
 
 
-        ;; Unmark escaped magic characters.
-        (list "\\(@\\)\\([@{}]\\)"
-              '(1 font-lock-keyword-face)
-              '(2 font-lock-variable-name-face))
+          ;; Make sure we get comments properly.
+          (list "@c\\(omment\\)?\\( .*\\)?$"
+                '(0 font-lock-comment-face))
 
 
-        ;; Make sure we get comments properly.
-        (list "@c\\(\\|omment\\)\\( .*\\)?$"
-              '(0 font-lock-comment-face))
+          ;; Command names are keywords.
+          (list "@\\([^a-zA-Z@]\\|[a-zA-Z@]*\\)"
+                '(0 font-lock-keyword-face))
 
 
-        ;; Command names are keywords.
-        (list "@\\([^a-zA-Z@]\\|[a-zA-Z@]*\\)"
-              '(0 font-lock-keyword-face))
+          ;; Fontify TeX special characters as punctuation.
+          (list "[{}]+"
+                '(0 mdw-punct-face)))))
 
 
-        ;; Fontify TeX special characters as punctuation.
-        (list "[{}]+"
-              '(0 mdw-punct-face)))))
+(dolist (hook '(texinfo-mode-hook TeXinfo-mode-hook))
+  (add-hook hook 'mdw-misc-mode-config t)
+  (add-hook hook 'mdw-fontify-texinfo t))
 
 ;;;--------------------------------------------------------------------------
 ;;; TeX and LaTeX configuration.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; TeX and LaTeX configuration.
 
+(setq-default LaTeX-table-label "tbl:"
+             TeX-auto-untabify nil
+             LaTeX-syntactic-comments nil
+             LaTeX-fill-break-at-separators '(\\\[))
+
 (defun mdw-fontify-tex ()
   (setq ispell-parser 'tex)
   (turn-on-reftex)
 (defun mdw-fontify-tex ()
   (setq ispell-parser 'tex)
   (turn-on-reftex)
@@ -3440,53 +4170,53 @@ (defun mdw-fontify-tex ()
   ;; Real fontification things.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
   ;; Real fontification things.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
-       (list
-
-        ;; Environment names are keywords.
-        (list (concat "\\\\\\(begin\\|end\\|newenvironment\\)"
-                      "{\\([^}\n]*\\)}")
-              '(2 font-lock-keyword-face))
-
-        ;; Suspended environment names are keywords too.
-        (list (concat "\\\\\\(suspend\\|resume\\)\\(\\[[^]]*\\]\\)?"
-                      "{\\([^}\n]*\\)}")
-              '(3 font-lock-keyword-face))
-
-        ;; Command names are keywords.
-        (list "\\\\\\([^a-zA-Z@]\\|[a-zA-Z@]*\\)"
-              '(0 font-lock-keyword-face))
-
-        ;; Handle @/.../ for italics.
-        ;; (list "\\(@/\\)\\([^/]*\\)\\(/\\)"
-        ;;       '(1 font-lock-keyword-face)
-        ;;       '(3 font-lock-keyword-face))
-
-        ;; Handle @*...* for boldness.
-        ;; (list "\\(@\\*\\)\\([^*]*\\)\\(\\*\\)"
-        ;;       '(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))
-
-        ;; Handle @<...> for nonterminals.
-        ;; (list "\\(@<\\)\\([^>]*\\)\\(>\\)"
-        ;;       '(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))
-
-        ;; Make sure we get comments properly.
-        (list "%.*"
-              '(0 font-lock-comment-face))
-
-        ;; Fontify TeX special characters as punctuation.
-        (list "[$^_{}#&]"
-              '(0 mdw-punct-face)))))
+         (list
+
+          ;; Environment names are keywords.
+          (list (concat "\\\\\\(begin\\|end\\|newenvironment\\)"
+                        "{\\([^}\n]*\\)}")
+                '(2 font-lock-keyword-face))
+
+          ;; Suspended environment names are keywords too.
+          (list (concat "\\\\\\(suspend\\|resume\\)\\(\\[[^]]*\\]\\)?"
+                        "{\\([^}\n]*\\)}")
+                '(3 font-lock-keyword-face))
+
+          ;; Command names are keywords.
+          (list "\\\\\\([^a-zA-Z@]\\|[a-zA-Z@]*\\)"
+                '(0 font-lock-keyword-face))
+
+          ;; Handle @/.../ for italics.
+          ;; (list "\\(@/\\)\\([^/]*\\)\\(/\\)"
+          ;;     '(1 font-lock-keyword-face)
+          ;;     '(3 font-lock-keyword-face))
+
+          ;; Handle @*...* for boldness.
+          ;; (list "\\(@\\*\\)\\([^*]*\\)\\(\\*\\)"
+          ;;     '(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))
+
+          ;; Handle @<...> for nonterminals.
+          ;; (list "\\(@<\\)\\([^>]*\\)\\(>\\)"
+          ;;     '(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))
+
+          ;; Make sure we get comments properly.
+          (list "%.*"
+                '(0 font-lock-comment-face))
+
+          ;; Fontify TeX special characters as punctuation.
+          (list "[$^_{}#&]"
+                '(0 mdw-punct-face)))))
 
 (setq TeX-install-font-lock 'tex-font-setup)
 
 
 (setq TeX-install-font-lock 'tex-font-setup)
 
@@ -3509,31 +4239,106 @@ (eval-after-load 'font-latex
           (unless modified
             (restore-buffer-modified-p nil)))))))
 
           (unless modified
             (restore-buffer-modified-p nil)))))))
 
-(setq LaTeX-syntactic-comments nil
-      LaTeX-fill-break-at-separators '(\\\[))
+(setq TeX-output-view-style
+       '(("^dvi$"
+          ("^landscape$" "^pstricks$\\|^pst-\\|^psfrag$")
+          "%(o?)dvips -t landscape %d -o && xdg-open %f")
+         ("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$"
+          "%(o?)dvips %d -o && xdg-open %f")
+         ("^dvi$"
+          ("^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "^landscape$")
+          "%(o?)xdvi %dS -paper a4r -s 0 %d")
+         ("^dvi$" "^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$"
+          "%(o?)xdvi %dS -paper a4 %d")
+         ("^dvi$"
+          ("^a5\\(?:comb\\|paper\\)$" "^landscape$")
+          "%(o?)xdvi %dS -paper a5r -s 0 %d")
+         ("^dvi$" "^a5\\(?:comb\\|paper\\)$" "%(o?)xdvi %dS -paper a5 %d")
+         ("^dvi$" "^b5paper$" "%(o?)xdvi %dS -paper b5 %d")
+         ("^dvi$" "^letterpaper$" "%(o?)xdvi %dS -paper us %d")
+         ("^dvi$" "^legalpaper$" "%(o?)xdvi %dS -paper legal %d")
+         ("^dvi$" "^executivepaper$" "%(o?)xdvi %dS -paper 7.25x10.5in %d")
+         ("^dvi$" "." "%(o?)xdvi %dS %d")
+         ("^pdf$" "." "xdg-open %o")
+         ("^html?$" "." "sensible-browser %o")))
+
+(setq TeX-view-program-list
+       '(("mupdf" ("mupdf %o" (mode-io-correlate " %(outpage)")))))
+
+(setq TeX-view-program-selection
+       '(((output-dvi style-pstricks) "dvips and gv")
+         (output-dvi "xdvi")
+         (output-pdf "mupdf")
+         (output-html "sensible-browser")))
+
+(setq TeX-open-quote "\""
+      TeX-close-quote "\"")
+
+(setq reftex-use-external-file-finders t
+      reftex-auto-recenter-toc t)
+
+(setq reftex-label-alist
+       '(("theorem" ?T "th:" "~\\ref{%s}" t ("theorems?" "th\\.") -2)
+         ("axiom" ?A "ax:" "~\\ref{%s}" t ("axioms?" "ax\\.") -2)
+         ("definition" ?D "def:" "~\\ref{%s}" t ("definitions?" "def\\.") -2)
+         ("proposition" ?P "prop:" "~\\ref{%s}" t
+          ("propositions?" "prop\\.") -2)
+         ("lemma" ?L "lem:" "~\\ref{%s}" t ("lemmas?" "lem\\.") -2)
+         ("example" ?X "eg:" "~\\ref{%s}" t ("examples?") -2)
+         ("exercise" ?E "ex:" "~\\ref{%s}" t ("exercises?" "ex\\.") -2)
+         ("enumerate" ?i "i:" "~\\ref{%s}" item ("items?"))))
+(setq reftex-section-prefixes
+       '((0 . "part:")
+         (1 . "ch:")
+         (t . "sec:")))
+
+(setq bibtex-field-delimiters 'double-quotes
+      bibtex-align-at-equal-sign t
+      bibtex-entry-format '(realign opts-or-alts required-fields
+                           numerical-fields last-comma delimiters
+                           unify-case sort-fields braces)
+      bibtex-sort-ignore-string-entries nil
+      bibtex-maintain-sorted-entries 'entry-class
+      bibtex-include-OPTkey t
+      bibtex-autokey-names-stretch 1
+      bibtex-autokey-expand-strings t
+      bibtex-autokey-name-separator "-"
+      bibtex-autokey-year-length 4
+      bibtex-autokey-titleword-separator "-"
+      bibtex-autokey-name-year-separator "-"
+      bibtex-autokey-year-title-separator ":")
+
+(progn
+  (dolist (hook '(tex-mode-hook latex-mode-hook
+                               TeX-mode-hook LaTeX-mode-hook))
+    (add-hook hook 'mdw-misc-mode-config t)
+    (add-hook hook 'mdw-fontify-tex t))
+  (add-hook 'bibtex-mode-hook (lambda () (setq fill-column 76))))
 
 ;;;--------------------------------------------------------------------------
 ;;; HTML, CSS, and other web foolishness.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; HTML, CSS, and other web foolishness.
 
-(setq css-indent-offset 2)
+(setq-default css-indent-offset 8)
 
 ;;;--------------------------------------------------------------------------
 ;;; SGML hacking.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; SGML hacking.
 
+(setq-default psgml-html-build-new-buffer nil)
+
 (defun mdw-sgml-mode ()
   (interactive)
   (sgml-mode)
   (mdw-standard-fill-prefix "")
   (make-local-variable 'sgml-delimiters)
   (setq sgml-delimiters
 (defun mdw-sgml-mode ()
   (interactive)
   (sgml-mode)
   (mdw-standard-fill-prefix "")
   (make-local-variable '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" ""))
+         '("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))
   (setq major-mode 'mdw-sgml-mode)
   (setq mode-name "[mdw] SGML")
   (run-hooks 'mdw-sgml-mode-hook))
@@ -3541,21 +4346,21 @@ (defun mdw-sgml-mode ()
 ;;;--------------------------------------------------------------------------
 ;;; Configuration files.
 
 ;;;--------------------------------------------------------------------------
 ;;; Configuration files.
 
-(defvar mdw-conf-quote-normal nil
-  "*Control syntax category of quote characters `\"' and `''.
+(defcustom mdw-conf-quote-normal nil
+  "Control syntax category of quote characters `\"' and `''.
 If this is `t', consider quote characters to be normal
 punctuation, as for `conf-quote-normal'.  If this is `nil' then
 leave quote characters as quotes.  If this is a list, then
 consider the quote characters in the list to be normal
 punctuation.  If this is a single quote character, then consider
 If this is `t', consider quote characters to be normal
 punctuation, as for `conf-quote-normal'.  If this is `nil' then
 leave quote characters as quotes.  If this is a list, then
 consider the quote characters in the list to be normal
 punctuation.  If this is a single quote character, then consider
-that character only to be normal punctuation.")
+that character only to be normal punctuation."
+  :type '(choice boolean character (repeat character))
+  :safe 'mdw-conf-quote-normal-acceptable-value-p)
 (defun mdw-conf-quote-normal-acceptable-value-p (value)
   "Is the VALUE is an acceptable value for `mdw-conf-quote-normal'?"
   (or (booleanp value)
       (every (lambda (v) (memq v '(?\" ?')))
             (if (listp value) value (list value)))))
 (defun mdw-conf-quote-normal-acceptable-value-p (value)
   "Is the VALUE is an acceptable value for `mdw-conf-quote-normal'?"
   (or (booleanp value)
       (every (lambda (v) (memq v '(?\" ?')))
             (if (listp value) value (list value)))))
-(put 'mdw-conf-quote-normal 'safe-local-variable
-     'mdw-conf-quote-normal-acceptable-value-p)
 
 (defun mdw-fix-up-quote ()
   "Apply the setting of `mdw-conf-quote-normal'."
 
 (defun mdw-fix-up-quote ()
   "Apply the setting of `mdw-conf-quote-normal'."
@@ -3566,11 +4371,14 @@ (defun mdw-fix-up-quote ()
           nil)
          (t
           (let ((table (copy-syntax-table (syntax-table))))
           nil)
          (t
           (let ((table (copy-syntax-table (syntax-table))))
-            (mapc (lambda (ch) (modify-syntax-entry ch "." table))
-                  (if (listp flag) flag (list flag)))
+            (dolist (ch (if (listp flag) flag (list flag)))
+              (modify-syntax-entry ch "." table))
             (set-syntax-table table)
             (and font-lock-mode (font-lock-fontify-buffer)))))))
             (set-syntax-table table)
             (and font-lock-mode (font-lock-fontify-buffer)))))))
-(add-hook 'conf-mode-local-variables-hook 'mdw-fix-up-quote t t)
+
+(progn
+  (add-hook 'conf-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'conf-mode-local-variables-hook 'mdw-fix-up-quote t t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Shell scripts.
 
 ;;;--------------------------------------------------------------------------
 ;;; Shell scripts.
@@ -3637,8 +4445,12 @@ (eval-after-load "sh-script"
         (if assoc
             (rplacd assoc frag)
           (setq sh-mode-syntax-table-input
         (if assoc
             (rplacd assoc frag)
           (setq sh-mode-syntax-table-input
-                (cons (cons 'rc frag)
-                      sh-mode-syntax-table-input))))))
+                  (cons (cons 'rc frag)
+                        sh-mode-syntax-table-input))))))
+
+(progn
+  (add-hook 'sh-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'sh-mode-hook 'mdw-setup-sh-script-mode t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Emacs shell mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; Emacs shell mode.
@@ -3660,8 +4472,8 @@ (defun mdw-eshell-prompt ()
                  (concat "~" (substring pwd (length home)))
                pwd))
            right)))
                  (concat "~" (substring pwd (length home)))
                pwd))
            right)))
-(setq eshell-prompt-function 'mdw-eshell-prompt)
-(setq eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
+(setq-default eshell-prompt-function 'mdw-eshell-prompt)
+(setq-default eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
 
 (defun eshell/e (file) (find-file file) nil)
 (defun eshell/ee (file) (find-file-other-window file) nil)
 
 (defun eshell/e (file) (find-file file) nil)
 (defun eshell/ee (file) (find-file-other-window file) nil)
@@ -3712,17 +4524,17 @@ (defun messages-mode-guts ()
                      "set" "table" "tagged-optional"   "union"
                      "variadic" "vector" "version" "version-tag")))
     (setq messages-mode-keywords
                      "set" "table" "tagged-optional"   "union"
                      "variadic" "vector" "version" "version-tag")))
     (setq messages-mode-keywords
-         (list
-          (list (concat "\\<\\(" keywords "\\)\\>:")
-                '(0 font-lock-keyword-face))
-          '("\\([-a-zA-Z0-9]+:\\)" (0 font-lock-warning-face))
-          '("\\(\\<[a-z][-_a-zA-Z0-9]*\\)"
-            (0 font-lock-variable-name-face))
-          '("\\<\\([0-9]+\\)\\>" (0 mdw-number-face))
-          '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-            (0 mdw-punct-face)))))
+           (list
+            (list (concat "\\<\\(" keywords "\\)\\>:")
+                  '(0 font-lock-keyword-face))
+            '("\\([-a-zA-Z0-9]+:\\)" (0 font-lock-warning-face))
+            '("\\(\\<[a-z][-_a-zA-Z0-9]*\\)"
+              (0 font-lock-variable-name-face))
+            '("\\<\\([0-9]+\\)\\>" (0 mdw-number-face))
+            '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+              (0 mdw-punct-face)))))
   (setq font-lock-defaults
   (setq font-lock-defaults
-       '(messages-mode-keywords nil nil nil nil))
+         '(messages-mode-keywords nil nil nil nil))
   (run-hooks 'messages-file-hook))
 
 (defun messages-mode ()
   (run-hooks 'messages-file-hook))
 
 (defun messages-mode ()
@@ -3752,20 +4564,22 @@ (defun cpp-messages-mode ()
                      "ident" "if" "ifdef" "ifndef" "import" "include"
                      "line" "pragma" "unassert" "undef" "warning")))
     (setq messages-mode-keywords
                      "ident" "if" "ifdef" "ifndef" "import" "include"
                      "line" "pragma" "unassert" "undef" "warning")))
     (setq messages-mode-keywords
-         (append (list (list (concat "^[ \t]*\\#[ \t]*"
-                                     "\\(include\\|import\\)"
-                                     "[ \t]*\\(<[^>]+\\(>\\|\\)\\)")
-                             '(2 font-lock-string-face))
-                       (list (concat "^\\([ \t]*#[ \t]*\\(\\("
-                                     preprocessor-keywords
-                                     "\\)\\>\\|[0-9]+\\|$\\)\\)")
-                             '(1 font-lock-keyword-face)))
-                 messages-mode-keywords)))
+           (append (list (list (concat "^[ \t]*\\#[ \t]*"
+                                       "\\(include\\|import\\)"
+                                       "[ \t]*\\(<[^>]+\\(>\\)?\\)")
+                               '(2 font-lock-string-face))
+                         (list (concat "^\\([ \t]*#[ \t]*\\(\\("
+                                       preprocessor-keywords
+                                       "\\)\\>\\|[0-9]+\\|$\\)\\)")
+                               '(1 font-lock-keyword-face)))
+                   messages-mode-keywords)))
   (run-hooks 'cpp-messages-mode-hook))
 
   (run-hooks 'cpp-messages-mode-hook))
 
-(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)
+(progn
+  (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.
 
 ;;;--------------------------------------------------------------------------
 ;;; Messages-file mode.
@@ -3795,16 +4609,16 @@ (defun mallow-driver-mode ()
         (mdw-regexps "each" "divert" "file" "if"
                      "perl" "set" "string" "type" "write")))
     (setq mallow-driver-mode-keywords
         (mdw-regexps "each" "divert" "file" "if"
                      "perl" "set" "string" "type" "write")))
     (setq mallow-driver-mode-keywords
-         (list
-          (list (concat "^%\\s *\\(}\\|\\(" keywords "\\)\\>\\).*$")
-                '(0 font-lock-keyword-face))
-          (list "^%\\s *\\(#.*\\|\\)$"
-                '(0 font-lock-comment-face))
-          (list "^%"
-                '(0 font-lock-keyword-face))
-          (list "^|?\\(.+\\)$" '(1 mallow-driver-text-face))
-          (list "\\${[^}]*}"
-                '(0 mallow-driver-substitution-face t)))))
+           (list
+            (list (concat "^%\\s *\\(}\\|\\(" keywords "\\)\\>\\).*$")
+                  '(0 font-lock-keyword-face))
+            (list "^%\\s *\\(#.*\\)?$"
+                  '(0 font-lock-comment-face))
+            (list "^%"
+                  '(0 font-lock-keyword-face))
+            (list "^|?\\(.+\\)$" '(1 mallow-driver-text-face))
+            (list "\\${[^}]*}"
+                  '(0 mallow-driver-substitution-face t)))))
   (setq font-lock-defaults
        '(mallow-driver-mode-keywords nil nil nil nil))
   (modify-syntax-entry ?\" "_" mallow-driver-mode-syntax-table)
   (setq font-lock-defaults
        '(mallow-driver-mode-keywords nil nil nil nil))
   (modify-syntax-entry ?\" "_" mallow-driver-mode-syntax-table)
@@ -3813,7 +4627,8 @@ (defun mallow-driver-mode ()
   (setq comment-end "")
   (run-hooks 'mallow-driver-mode-hook))
 
   (setq comment-end "")
   (run-hooks 'mallow-driver-mode-hook))
 
-(add-hook 'mallow-driver-hook 'mdw-misc-mode-config t)
+(progn
+  (add-hook 'mallow-driver-hook 'mdw-misc-mode-config t))
 
 ;;;--------------------------------------------------------------------------
 ;;; NFast debugs.
 
 ;;;--------------------------------------------------------------------------
 ;;; NFast debugs.
@@ -3829,58 +4644,34 @@ (defun nfast-debug-mode ()
   (make-local-variable 'nfast-debug-mode-keywords)
   (setq truncate-lines t)
   (setq nfast-debug-mode-keywords
   (make-local-variable 'nfast-debug-mode-keywords)
   (setq truncate-lines t)
   (setq nfast-debug-mode-keywords
-       (list
-        '("^\\(NFast_\\(Connect\\|Disconnect\\|Submit\\|Wait\\)\\)"
-          (0 font-lock-keyword-face))
-        (list (concat "^[ \t]+\\(\\("
-                      "[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
-                      "[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
-                      "[ \t]+\\)*"
-                      "[0-9a-fA-F]+\\)[ \t]*$")
-          '(0 mdw-number-face))
-        '("^[ \t]+\.status=[ \t]+\\<\\(OK\\)\\>"
-          (1 font-lock-keyword-face))
-        '("^[ \t]+\.status=[ \t]+\\<\\([a-zA-Z][0-9a-zA-Z]*\\)\\>"
-          (1 font-lock-warning-face))
-        '("^[ \t]+\.status[ \t]+\\<\\(zero\\)\\>"
-          (1 nil))
-        (list (concat "^[ \t]+\\.cmd=[ \t]+"
-                      "\\<\\([a-zA-Z][0-9a-zA-Z]*\\)\\>")
-          '(1 font-lock-keyword-face))
-        '("-?\\<\\([0-9]+\\|0x[0-9a-fA-F]+\\)\\>" (0 mdw-number-face))
-        '("^\\([ \t]+[a-z0-9.]+\\)" (0 font-lock-variable-name-face))
-        '("\\<\\([a-z][a-z0-9.]+\\)\\>=" (1 font-lock-variable-name-face))
-        '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" (0 mdw-punct-face))))
+         (list
+          '("^\\(NFast_\\(Connect\\|Disconnect\\|Submit\\|Wait\\)\\)"
+            (0 font-lock-keyword-face))
+          (list (concat "^[ \t]+\\(\\("
+                        "[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
+                        "[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]"
+                        "[ \t]+\\)*"
+                        "[0-9a-fA-F]+\\)[ \t]*$")
+                '(0 mdw-number-face))
+          '("^[ \t]+\.status=[ \t]+\\<\\(OK\\)\\>"
+            (1 font-lock-keyword-face))
+          '("^[ \t]+\.status=[ \t]+\\<\\([a-zA-Z][0-9a-zA-Z]*\\)\\>"
+            (1 font-lock-warning-face))
+          '("^[ \t]+\.status[ \t]+\\<\\(zero\\)\\>"
+            (1 nil))
+          (list (concat "^[ \t]+\\.cmd=[ \t]+"
+                        "\\<\\([a-zA-Z][0-9a-zA-Z]*\\)\\>")
+                '(1 font-lock-keyword-face))
+          '("-?\\<\\([0-9]+\\|0x[0-9a-fA-F]+\\)\\>" (0 mdw-number-face))
+          '("^\\([ \t]+[a-z0-9.]+\\)" (0 font-lock-variable-name-face))
+          '("\\<\\([a-z][a-z0-9.]+\\)\\>=" (1 font-lock-variable-name-face))
+          '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" (0 mdw-punct-face))))
   (setq font-lock-defaults
   (setq font-lock-defaults
-       '(nfast-debug-mode-keywords nil nil nil nil))
+         '(nfast-debug-mode-keywords nil nil nil nil))
   (run-hooks 'nfast-debug-mode-hook))
 
 ;;;--------------------------------------------------------------------------
   (run-hooks 'nfast-debug-mode-hook))
 
 ;;;--------------------------------------------------------------------------
-;;; Other languages.
-
-;; Smalltalk.
-
-(defun mdw-setup-smalltalk ()
-  (and mdw-auto-indent
-       (local-set-key "\C-m" 'smalltalk-newline-and-indent))
-  (make-local-variable 'mdw-auto-indent)
-  (setq mdw-auto-indent nil)
-  (local-set-key "\C-i" 'smalltalk-reindent))
-
-(defun mdw-fontify-smalltalk ()
-  (make-local-variable 'font-lock-keywords)
-  (setq font-lock-keywords
-       (list
-        (list "\\<[A-Z][a-zA-Z0-9]*\\>"
-              '(0 font-lock-keyword-face))
-        (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
-                      "[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
-                      "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
-              '(0 mdw-number-face))
-        (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face)))))
-
-;; Lispy languages.
+;;; Lispy languages.
 
 ;; Unpleasant bodge.
 (unless (boundp 'slime-repl-mode-map)
 
 ;; Unpleasant bodge.
 (unless (boundp 'slime-repl-mode-map)
@@ -3904,9 +4695,15 @@ (defun mdw-common-lisp-indent ()
   (make-local-variable 'lisp-indent-function)
   (setq lisp-indent-function 'common-lisp-indent-function))
 
   (make-local-variable 'lisp-indent-function)
   (setq lisp-indent-function 'common-lisp-indent-function))
 
-(setq lisp-simple-loop-indentation 2
-      lisp-loop-keyword-indentation 6
-      lisp-loop-forms-indentation 6)
+(defmacro mdw-advise-hyperspec-lookup (func args)
+  `(defadvice ,func (around mdw-browse-w3m ,args activate compile)
+     (if (fboundp 'w3m)
+        (let ((browse-url-browser-function #'mdw-w3m-browse-url))
+          ad-do-it)
+       ad-do-it)))
+(mdw-advise-hyperspec-lookup common-lisp-hyperspec (symbol))
+(mdw-advise-hyperspec-lookup common-lisp-hyperspec-format (char))
+(mdw-advise-hyperspec-lookup common-lisp-hyperspec-lookup-reader-macro (char))
 
 (defun mdw-fontify-lispy ()
 
 
 (defun mdw-fontify-lispy ()
 
@@ -3915,42 +4712,243 @@ (defun mdw-fontify-lispy ()
 
   ;; Not much fontification needed.
   (make-local-variable 'font-lock-keywords)
 
   ;; Not much fontification needed.
   (make-local-variable 'font-lock-keywords)
-  (setq font-lock-keywords
-       (list (list (concat "\\("
-                           "\\_<[-+]?"
-                           "\\(" "[0-9]+/[0-9]+"
-                           "\\|" "\\(" "[0-9]+" "\\(\\.[0-9]*\\)?" "\\|"
-                                       "\\.[0-9]+" "\\)"
-                                 "\\([dDeEfFlLsS][-+]?[0-9]+\\)?"
-                           "\\)"
-                           "\\|"
-                           "#"
-                           "\\(" "x" "[-+]?"
-                                 "[0-9A-Fa-f]+" "\\(/[0-9A-Fa-f]+\\)?"
-                           "\\|" "o" "[-+]?" "[0-7]+" "\\(/[0-7]+\\)?"
-                           "\\|" "b" "[-+]?" "[01]+" "\\(/[01]+\\)?"
-                           "\\|" "[0-9]+" "r" "[-+]?"
-                                 "[0-9a-zA-Z]+" "\\(/[0-9a-zA-Z]+\\)?"
-                           "\\)"
-                           "\\)\\_>")
-                   '(0 mdw-number-face))
-             (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                   '(0 mdw-punct-face)))))
+    (setq font-lock-keywords
+         (list (list (concat "\\("
+                             "\\_<[-+]?"
+                             "\\(" "[0-9]+/[0-9]+"
+                             "\\|" "\\(" "[0-9]+" "\\(\\.[0-9]*\\)?" "\\|"
+                                         "\\.[0-9]+" "\\)"
+                                   "\\([dDeEfFlLsS][-+]?[0-9]+\\)?"
+                             "\\)"
+                             "\\|"
+                             "#"
+                             "\\(" "x" "[-+]?"
+                                   "[0-9A-Fa-f]+" "\\(/[0-9A-Fa-f]+\\)?"
+                             "\\|" "o" "[-+]?" "[0-7]+" "\\(/[0-7]+\\)?"
+                             "\\|" "b" "[-+]?" "[01]+" "\\(/[01]+\\)?"
+                             "\\|" "[0-9]+" "r" "[-+]?"
+                                   "[0-9a-zA-Z]+" "\\(/[0-9a-zA-Z]+\\)?"
+                             "\\)"
+                             "\\)\\_>")
+                     '(0 mdw-number-face))
+               (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                     '(0 mdw-punct-face)))))
+
+;; Special indentation.
+
+(defcustom mdw-lisp-loop-default-indent 2
+  "Default indent for simple `loop' body."
+  :type 'integer
+  :safe 'integerp)
+(defcustom mdw-lisp-setf-value-indent 2
+  "Default extra indent for `setf' values."
+  :type 'integer :safe 'integerp)
+
+(setq lisp-simple-loop-indentation 0
+      lisp-loop-keyword-indentation 0
+      lisp-loop-forms-indentation 2
+      lisp-lambda-list-keyword-parameter-alignment t)
+
+(defun mdw-indent-funcall
+    (path state &optional indent-point sexp-column normal-indent)
+  "Indent `funcall' more usefully.
+Essentially, treat `funcall foo' as a function name, and align the arguments
+to `foo'."
+  (and (or (not (consp path)) (null (cadr path)))
+       (save-excursion
+        (goto-char (cadr state))
+        (forward-char 1)
+        (let ((start-line (line-number-at-pos)))
+          (and (condition-case nil (progn (forward-sexp 3) t)
+                 (scan-error nil))
+               (progn
+                 (forward-sexp -1)
+                 (and (= start-line (line-number-at-pos))
+                      (current-column))))))))
+(progn
+  (put 'funcall 'common-lisp-indent-function 'mdw-indent-funcall)
+  (put 'funcall 'lisp-indent-function 'mdw-indent-funcall))
+
+(defun mdw-indent-setf
+    (path state &optional indent-point sexp-column normal-indent)
+  "Indent `setf' more usefully.
+If the values aren't on the same lines as their variables then indent them
+by `mdw-lisp-setf-value-indent' spaces."
+  (and (or (not (consp path)) (null (cadr path)))
+       (let ((basic-indent (save-excursion
+                            (goto-char (cadr state))
+                            (forward-char 1)
+                            (and (condition-case nil
+                                     (progn (forward-sexp 2) t)
+                                   (scan-error nil))
+                                 (progn
+                                   (forward-sexp -1)
+                                   (current-column)))))
+            (offset (if (consp path) (car path)
+                      (catch 'done
+                        (save-excursion
+                          (let ((start path)
+                                (count 0))
+                            (goto-char (cadr state))
+                            (forward-char 1)
+                            (while (< (point) start)
+                              (condition-case nil (forward-sexp 1)
+                                (scan-error (throw 'done nil)))
+                              (incf count))
+                            (1- count)))))))
+        (and basic-indent offset
+             (list (+ basic-indent
+                      (if (oddp offset) 0
+                        mdw-lisp-setf-value-indent))
+                   basic-indent)))))
+(progn
+  (put 'setf 'common-lisp-indent-functopion 'mdw-indent-setf)
+  (put 'psetf 'common-lisp-indent-function 'mdw-indent-setf)
+  (put 'setq 'common-lisp-indent-function 'mdw-indent-setf)
+  (put 'setf 'lisp-indent-function 'mdw-indent-setf)
+  (put 'setq 'lisp-indent-function 'mdw-indent-setf)
+  (put 'setq-local 'lisp-indent-function 'mdw-indent-setf)
+  (put 'setq-default 'lisp-indent-function 'mdw-indent-setf))
+
+(defadvice common-lisp-loop-part-indentation
+    (around mdw-fix-loop-indentation (indent-point state) activate compile)
+  "Improve `loop' indentation.
+If the first subform is on the same line as the `loop' keyword, then
+align the other subforms beneath it.  Otherwise, indent them
+`mdw-lisp-loop-default-indent' columns in from the opening parenthesis."
+
+  (let* ((loop-indentation (save-excursion
+                            (goto-char (elt state 1))
+                            (current-column))))
+
+    ;; Don't really care about this.
+    (when (and (boundp 'lisp-indent-backquote-substitution-mode)
+              (eq lisp-indent-backquote-substitution-mode 'corrected))
+      (save-excursion
+       (goto-char (elt state 1))
+       (cl-incf loop-indentation
+                (cond ((eq (char-before) ?,) -1)
+                      ((and (eq (char-before) ?@)
+                            (progn (backward-char)
+                                   (eq (char-before) ?,)))
+                       -2)
+                      (t 0)))))
+
+    ;; If the first loop item is on the same line as the `loop' itself then
+    ;; use that as the baseline.  Otherwise advance by the default indent.
+    (goto-char (cadr state))
+    (forward-char 1)
+    (let ((baseline-indent
+          (if (= (line-number-at-pos)
+                 (if (condition-case nil (progn (forward-sexp 2) t)
+                       (scan-error nil))
+                     (progn (forward-sexp -1) (line-number-at-pos))
+                   -1))
+              (current-column)
+            (+ loop-indentation mdw-lisp-loop-default-indent))))
+
+      (goto-char indent-point)
+      (beginning-of-line)
 
 
-(defun comint-send-and-indent ()
-  (interactive)
-  (comint-send-input)
+      (setq ad-return-value
+             (list
+              (cond ((condition-case ()
+                         (save-excursion
+                           (goto-char (elt state 1))
+                           (forward-char 1)
+                           (forward-sexp 2)
+                           (backward-sexp 1)
+                           (not (looking-at "\\(:\\|\\sw\\)")))
+                       (error nil))
+                     (+ baseline-indent lisp-simple-loop-indentation))
+                    ((looking-at "^\\s-*\\(:?\\sw+\\|;\\)")
+                     (+ baseline-indent lisp-loop-keyword-indentation))
+                    (t
+                     (+ baseline-indent lisp-loop-forms-indentation)))
+
+              ;; Tell the caller that the next line needs recomputation,
+              ;; even though it doesn't start a sexp.
+              loop-indentation)))))
+
+;; SLIME setup.
+
+(defcustom mdw-friendly-name "[mdw]"
+  "How I want to be addressed."
+  :type 'string
+  :safe 'stringp)
+(defadvice slime-user-first-name
+    (around mdw-use-friendly-name compile activate)
+  (if mdw-friendly-name (setq ad-return-value mdw-friendly-name)
+    ad-do-it))
+
+(eval-and-compile
+  (trap
+    (if (not mdw-fast-startup)
+       (progn
+         (require 'slime-autoloads)
+         (slime-setup '(slime-autodoc slime-c-p-c))))))
+
+(let ((stuff '((cmucl ("cmucl"))
+              (sbcl ("sbcl") :coding-system utf-8-unix)
+              (clisp ("clisp") :coding-system utf-8-unix))))
+  (or (boundp 'slime-lisp-implementations)
+      (setq slime-lisp-implementations nil))
+  (while stuff
+    (let* ((head (car stuff))
+          (found (assq (car head) slime-lisp-implementations)))
+      (setq stuff (cdr stuff))
+      (if found
+         (rplacd found (cdr head))
+       (setq slime-lisp-implementations
+               (cons head slime-lisp-implementations))))))
+(setq slime-default-lisp 'sbcl)
+
+;; Hooks.
+
+(progn
+  (dolist (hook '(emacs-lisp-mode-hook
+                 scheme-mode-hook
+                 lisp-mode-hook
+                 inferior-lisp-mode-hook
+                 lisp-interaction-mode-hook
+                 ielm-mode-hook
+                 slime-repl-mode-hook))
+    (add-hook hook 'mdw-misc-mode-config t)
+    (add-hook hook 'mdw-fontify-lispy t))
+  (add-hook 'lisp-mode-hook 'mdw-common-lisp-indent t)
+  (add-hook 'inferior-lisp-mode-hook
+           #'(lambda () (local-set-key "\C-m" 'comint-send-and-indent)) t))
+
+;;;--------------------------------------------------------------------------
+;;; Other languages.
+
+;; Smalltalk.
+
+(defun mdw-setup-smalltalk ()
   (and mdw-auto-indent
   (and mdw-auto-indent
-       (indent-for-tab-command)))
+       (local-set-key "\C-m" 'smalltalk-newline-and-indent))
+  (make-local-variable 'mdw-auto-indent)
+  (setq mdw-auto-indent nil)
+  (local-set-key "\C-i" 'smalltalk-reindent))
 
 
-(defadvice comint-line-beginning-position
-    (around mdw-calculate-it-properly () activate compile)
-  "Calculate the actual line start for multi-line input."
-  (if (or comint-use-prompt-regexp
-         (eq (field-at-pos (point)) 'output))
-      ad-do-it
-    (setq ad-return-value
-         (constrain-to-field (line-beginning-position) (point)))))
+(defun mdw-fontify-smalltalk ()
+  (make-local-variable 'font-lock-keywords)
+  (setq font-lock-keywords
+         (list
+          (list "\\<[A-Z][a-zA-Z0-9]*\\>"
+                '(0 font-lock-keyword-face))
+          (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
+                        "[0-9][0-9_]*\\(\\.[0-9_]*\\)?"
+                        "\\([eE][-+]?[0-9_]+\\)?")
+                '(0 mdw-number-face))
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face)))))
+
+(progn
+  (add-hook 'smalltalk-mode 'mdw-misc-mode-config t)
+  (add-hook 'smalltalk-mode 'mdw-fontify-smalltalk t))
+
+;; m4.
 
 (defun mdw-setup-m4 ()
 
 
 (defun mdw-setup-m4 ()
 
@@ -3962,6 +4960,15 @@ (defun mdw-setup-m4 ()
   ;; Fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
 
   ;; Fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
 
+(dolist (hook '(m4-mode-hook autoconf-mode-hook autotest-mode-hook))
+  (add-hook hook #'mdw-misc-mode-config t)
+  (add-hook hook #'mdw-setup-m4 t))
+
+;; Make.
+
+(progn
+  (add-hook 'makefile-mode-hook 'mdw-misc-mode-config t))
+
 ;;;--------------------------------------------------------------------------
 ;;; Text mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; Text mode.
 
@@ -3975,6 +4982,9 @@ (defun mdw-text-mode ()
 (eval-after-load "flyspell"
   '(define-key flyspell-mode-map "\C-\M-i" nil))
 
 (eval-after-load "flyspell"
   '(define-key flyspell-mode-map "\C-\M-i" nil))
 
+(progn
+  (add-hook 'text-mode-hook 'mdw-text-mode t))
+
 ;;;--------------------------------------------------------------------------
 ;;; Outline and hide/show modes.
 
 ;;;--------------------------------------------------------------------------
 ;;; Outline and hide/show modes.
 
@@ -4008,6 +5018,21 @@ (defun mdw-term-mode-setup ()
   (auto-fill-mode -1)
   (setq tab-width 8))
 
   (auto-fill-mode -1)
   (setq tab-width 8))
 
+(defun comint-send-and-indent ()
+  (interactive)
+  (comint-send-input)
+  (and mdw-auto-indent
+       (indent-for-tab-command)))
+
+(defadvice comint-line-beginning-position
+    (around mdw-calculate-it-properly () activate compile)
+  "Calculate the actual line start for multi-line input."
+  (if (or comint-use-prompt-regexp
+         (eq (field-at-pos (point)) 'output))
+      ad-do-it
+    (setq ad-return-value
+           (constrain-to-field (line-beginning-position) (point)))))
+
 (defun term-send-meta-right () (interactive) (term-send-raw-string "\e\e[C"))
 (defun term-send-meta-left  () (interactive) (term-send-raw-string "\e\e[D"))
 (defun term-send-ctrl-uscore () (interactive) (term-send-raw-string "\C-_"))
 (defun term-send-meta-right () (interactive) (term-send-raw-string "\e\e[C"))
 (defun term-send-meta-left  () (interactive) (term-send-raw-string "\e\e[D"))
 (defun term-send-ctrl-uscore () (interactive) (term-send-raw-string "\C-_"))
@@ -4036,13 +5061,13 @@ (defadvice term-exec (before program-args-list compile activate)
 
 (defadvice term-exec-1 (around hack-environment compile activate)
   "Hack the environment inherited by inferiors in the terminal."
 
 (defadvice term-exec-1 (around hack-environment compile activate)
   "Hack the environment inherited by inferiors in the terminal."
-  (let ((process-environment process-environment))
+  (let ((process-environment (copy-tree process-environment)))
     (setenv "LD_PRELOAD" nil)
     ad-do-it))
 
 (defadvice shell (around hack-environment compile activate)
   "Hack the environment inherited by inferiors in the shell."
     (setenv "LD_PRELOAD" nil)
     ad-do-it))
 
 (defadvice shell (around hack-environment compile activate)
   "Hack the environment inherited by inferiors in the shell."
-  (let ((process-environment process-environment))
+  (let ((process-environment (copy-tree process-environment)))
     (setenv "LD_PRELOAD" nil)
     ad-do-it))
 
     (setenv "LD_PRELOAD" nil)
     ad-do-it))
 
@@ -4051,9 +5076,10 @@ (defun ssh (host)
   (interactive "sHost: ")
   (ansi-term (list "ssh" host) (format "ssh@%s" host)))
 
   (interactive "sHost: ")
   (ansi-term (list "ssh" host) (format "ssh@%s" host)))
 
-(defvar git-grep-command
+(defcustom git-grep-command
   "env GIT_PAGER=cat git grep --no-color -nH -e "
   "env GIT_PAGER=cat git grep --no-color -nH -e "
-  "*The default command for \\[git-grep].")
+  "The default command for \\[git-grep]."
+  :type 'string)
 
 (defvar git-grep-history nil)
 
 
 (defvar git-grep-history nil)
 
@@ -4068,7 +5094,7 @@ (defun git-grep (command-args)
 ;;;--------------------------------------------------------------------------
 ;;; Magit configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Magit configuration.
 
-(setq magit-diff-refine-hunk 'all
+(setq magit-diff-refine-hunk 't
       magit-view-git-manual-method 'man
       magit-log-margin '(nil age magit-log-margin-width t 18)
       magit-wip-after-save-local-mode-lighter ""
       magit-view-git-manual-method 'man
       magit-log-margin '(nil age magit-log-margin-width t 18)
       magit-wip-after-save-local-mode-lighter ""
@@ -4093,7 +5119,9 @@ (eval-after-load "magit"
                           magit-diff-refresh-popup
                           magit-diff-mode-refresh-popup
                           magit-revision-mode-refresh-popup))
                           magit-diff-refresh-popup
                           magit-diff-mode-refresh-popup
                           magit-revision-mode-refresh-popup))
-           (magit-define-popup-switch popup ?R "Reverse diff" "-R"))))
+           (magit-define-popup-switch popup ?R "Reverse diff" "-R"))
+         (magit-define-popup-switch 'magit-rebase-popup ?r
+                                    "Rebase merges" "--rebase-merges")))
 
 (defadvice magit-wip-commit-buffer-file
     (around mdw-just-this-buffer activate compile)
 
 (defadvice magit-wip-commit-buffer-file
     (around mdw-just-this-buffer activate compile)
@@ -4107,12 +5135,12 @@ (defadvice magit-discard
     ad-do-it))
 
 (setq magit-repolist-columns
     ad-do-it))
 
 (setq magit-repolist-columns
-      '(("Name" 16 magit-repolist-column-ident nil)
-       ("Version" 18 magit-repolist-column-version nil)
-       ("St" 2 magit-repolist-column-dirty nil)
-       ("L<U" 3 mdw-repolist-column-unpulled-from-upstream nil)
-       ("L>U" 3 mdw-repolist-column-unpushed-to-upstream nil)
-       ("Path" 32 magit-repolist-column-path nil)))
+       '(("Name" 16 magit-repolist-column-ident nil)
+         ("Version" 18 magit-repolist-column-version nil)
+         ("St" 2 magit-repolist-column-dirty nil)
+         ("L<U" 3 mdw-repolist-column-unpulled-from-upstream nil)
+         ("L>U" 3 mdw-repolist-column-unpushed-to-upstream nil)
+         ("Path" 32 magit-repolist-column-path nil)))
 
 (setq magit-repository-directories '(("~/etc/profile" . 0)
                                     ("~/src/" . 1)))
 
 (setq magit-repository-directories '(("~/etc/profile" . 0)
                                     ("~/src/" . 1)))
@@ -4146,6 +5174,29 @@ (defun mdw-try-smerge ()
       (smerge-mode 1))))
 (add-hook 'find-file-hook 'mdw-try-smerge t)
 
       (smerge-mode 1))))
 (add-hook 'find-file-hook 'mdw-try-smerge t)
 
+(defcustom mdw-magit-new-window-modes
+  '(magit-diff-mode
+    magit-log-mode
+    magit-process-mode
+    magit-revision-mode
+    magit-stash-mode
+    magit-status-mode)
+  "Magit modes which should cause a new window to be used."
+  :type '(repeat symbol))
+
+(defun mdw-display-magit-buffer (buffer)
+  "Like `magit-display-buffer-traditional'.
+But uses `mdw-magit-new-window-modes' for its list of modes
+rather than baking the list into the function."
+  (display-buffer buffer
+                 (if (and (not mdw-designated-window)
+                          (derived-mode-p 'magit-mode)
+                          (not (memq (with-current-buffer buffer major-mode)
+                                     mdw-magit-new-window-modes)))
+                     '(display-buffer-same-window . nil)
+                   nil)))
+(setq magit-display-buffer-function 'mdw-display-magit-buffer)
+
 ;;;--------------------------------------------------------------------------
 ;;; GUD, and especially GDB.
 
 ;;;--------------------------------------------------------------------------
 ;;; GUD, and especially GDB.
 
@@ -4159,6 +5210,51 @@ (defadvice gdb-set-window-buffer
   "Don't make windows dedicated.  Seriously."
   (set-window-dedicated-p (or window (selected-window)) nil))
 
   "Don't make windows dedicated.  Seriously."
   (set-window-dedicated-p (or window (selected-window)) nil))
 
+;;;--------------------------------------------------------------------------
+;;; SQL stuff.
+
+(setq sql-postgres-options '("-n" "-P" "pager=off")
+      sql-postgres-login-params
+       '((user :default "mdw")
+         (database :default "mdw")
+         (server :default "db.distorted.org.uk")))
+
+;;;--------------------------------------------------------------------------
+;;; Man pages.
+
+;; Turn off `noip' when running `man': it interferes with `man-db''s own
+;; seccomp(2)-based sandboxing, which is (in this case, at least) strictly
+;; better.
+(defadvice Man-getpage-in-background
+    (around mdw-inhibit-noip (topic) compile activate)
+  "Inhibit the `noip' preload hack when invoking `man'."
+  (let* ((old-preload (getenv "LD_PRELOAD"))
+        (preloads (and old-preload
+                       (save-match-data (split-string old-preload ":"))))
+        (any nil)
+        (filtered nil))
+    (save-match-data
+      (while preloads
+       (let ((item (pop preloads)))
+         (if (string-match  "\\(/\\|^\\)noip\.so\\(:\\|$\\)" item)
+             (setq any t)
+           (push item filtered)))))
+    (if any
+       (unwind-protect
+           (progn
+             (setenv "LD_PRELOAD"
+                     (and filtered
+                          (with-output-to-string
+                            (setq filtered (nreverse filtered))
+                            (let ((first t))
+                              (while filtered
+                                (if first (setq first nil)
+                                  (write-char ?:))
+                                (write-string (pop filtered)))))))
+             ad-do-it)
+         (setenv "LD_PRELOAD" old-preload))
+      ad-do-it)))
+
 ;;;--------------------------------------------------------------------------
 ;;; MPC configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; MPC configuration.
 
@@ -4320,9 +5416,9 @@ (defun mdw-mpc-playlist-delete (&optional arg interactivep)
 
 (defun mdw-mpc-hack-tagbrowsers ()
   (setq-local mode-line-format
 
 (defun mdw-mpc-hack-tagbrowsers ()
   (setq-local mode-line-format
-             '("%e"
-               mode-line-frame-identification
-               mode-line-buffer-identification)))
+               '("%e"
+                 mode-line-frame-identification
+                 mode-line-buffer-identification)))
 (add-hook 'mpc-tagbrowser-mode-hook 'mdw-mpc-hack-tagbrowsers)
 
 (defun mdw-mpc-hack-songs ()
 (add-hook 'mpc-tagbrowser-mode-hook 'mdw-mpc-hack-tagbrowsers)
 
 (defun mdw-mpc-hack-songs ()