el/dot-emacs.el: Show italic characters in manpages correctly where possible.
[profile] / el / dot-emacs.el
index 80f0f81..a9e2d72 100644 (file)
 ;;;--------------------------------------------------------------------------
 ;;; Check command-line.
 
 ;;;--------------------------------------------------------------------------
 ;;; Check command-line.
 
+(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.
 
 ;;;--------------------------------------------------------------------------
 ;;; Some general utilities.
@@ -52,6 +61,17 @@ This may be at the expense of cool features.")
           (debug 0))
   `',(make-regexp list))
 
           (debug 0))
   `',(make-regexp list))
 
+(defun mdw-wrong ()
+  "This is not the key sequence you're looking for."
+  (interactive)
+  (error "wrong button"))
+
+(defun mdw-emacs-version-p (major &optional minor)
+  "Return non-nil if the running Emacs is at least version MAJOR.MINOR."
+  (or (> emacs-major-version major)
+      (and (= emacs-major-version major)
+          (>= emacs-minor-version (or minor 0)))))
+
 ;; Some error trapping.
 ;;
 ;; If individual bits of this file go tits-up, we don't particularly want
 ;; Some error trapping.
 ;;
 ;; If individual bits of this file go tits-up, we don't particularly want
@@ -91,6 +111,23 @@ This may be at the expense of cool features.")
                    (concat "(" (buffer-string) ")")))))))
   (cdr (assq sym mdw-config)))
 
                    (concat "(" (buffer-string) ")")))))))
   (cdr (assq sym mdw-config)))
 
+;; Width configuration.
+
+(defvar mdw-column-width
+  (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)
+
+;; Local variables hacking.
+
+(defun run-local-vars-mode-hook ()
+  "Run a hook for the major-mode after local variables have been processed."
+  (run-hooks (intern (concat (symbol-name major-mode)
+                            "-local-variables-hook"))))
+(add-hook 'hack-local-variables-hook 'run-local-vars-mode-hook)
+
 ;; Set up the load path convincingly.
 
 (dolist (dir (append (and (boundp 'debian-emacs-flavor)
 ;; Set up the load path convincingly.
 
 (dolist (dir (append (and (boundp 'debian-emacs-flavor)
@@ -172,14 +209,16 @@ fringes is not taken out of the allowance for WIDTH, unlike
         ((>= width 0) (+ width (mdw-horizontal-window-overhead)))
         ((< width 0) width))))
 
         ((>= width 0) (+ width (mdw-horizontal-window-overhead)))
         ((< width 0) width))))
 
+(defun mdw-preferred-column-width ()
+  "Return the preferred column width."
+  (if (and window-system (mdw-emacs-version-p 22)) mdw-column-width
+    (1+ mdw-column-width)))
+
 (defun mdw-divvy-window (&optional width)
   "Split a wide window into appropriate widths."
   (interactive "P")
 (defun mdw-divvy-window (&optional width)
   "Split a wide window into appropriate widths."
   (interactive "P")
-  (setq width (cond (width (prefix-numeric-value width))
-                   ((and window-system
-                         (>= emacs-major-version 22))
-                    77)
-                   (t 78)))
+  (setq width (if width (prefix-numeric-value width)
+               (mdw-preferred-column-width)))
   (let* ((win (selected-window))
         (sb-width (mdw-horizontal-window-overhead))
         (c (/ (+ (window-width) sb-width)
   (let* ((win (selected-window))
         (sb-width (mdw-horizontal-window-overhead))
         (c (/ (+ (window-width) sb-width)
@@ -190,6 +229,17 @@ fringes is not taken out of the allowance for WIDTH, unlike
       (other-window 1))
     (select-window win)))
 
       (other-window 1))
     (select-window win)))
 
+(defun mdw-set-frame-width (columns &optional width)
+  (interactive "nColumns: 
+P")
+  (setq width (if width (prefix-numeric-value width)
+               (mdw-preferred-column-width)))
+  (let ((sb-width (mdw-horizontal-window-overhead)))
+    (set-frame-width (selected-frame)
+                    (- (* columns (+ width sb-width))
+                       sb-width))
+    (mdw-divvy-window width)))
+
 ;; Don't raise windows unless I say so.
 
 (defvar mdw-inhibit-raise-frame nil
 ;; Don't raise windows unless I say so.
 
 (defvar mdw-inhibit-raise-frame nil
@@ -212,6 +262,41 @@ frame is actually mapped on the screen."
        ad-do-it)))
 
 (mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus)
        ad-do-it)))
 
 (mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus)
+(mdw-advise-to-inhibit-raise-frame appt-disp-window)
+(mdw-advise-to-inhibit-raise-frame mouse-select-window)
+
+;; Bug fix for markdown-mode, which breaks point positioning during
+;; `query-replace'.
+(defadvice markdown-check-change-for-wiki-link
+    (around mdw-save-match activate compile)
+  "Save match data around the `markdown-mode' `after-change-functions' hook."
+  (save-match-data ad-do-it))
+
+;; Bug fix for `bbdb-canonicalize-address': on Emacs 24, `run-hook-with-args'
+;; always returns nil, with the result that all email addresses are lost.
+;; Replace the function entirely.
+(defadvice bbdb-canonicalize-address
+    (around mdw-bug-fix activate compile)
+  "Don't use `run-hook-with-args', because that doesn't work."
+  (let ((net (ad-get-arg 0)))
+
+    ;; Make sure this is a proper hook list.
+    (if (functionp bbdb-canonicalize-net-hook)
+       (setq bbdb-canonicalize-net-hook (list bbdb-canonicalize-net-hook)))
+
+    ;; Iterate over the hooks until things converge.
+    (let ((donep nil))
+      (while (not donep)
+       (let (next (changep nil)
+             hook (hooks bbdb-canonicalize-net-hook))
+         (while hooks
+           (setq hook (pop hooks))
+           (setq next (funcall hook net))
+           (if (not (equal next net))
+               (setq changep t
+                     net next)))
+         (setq donep (not changep)))))
+    (setq ad-return-value net)))
 
 ;; Transient mark mode hacks.
 
 
 ;; Transient mark mode hacks.
 
@@ -234,6 +319,11 @@ it's currently off."
 
 ;; Functions for sexp diary entries.
 
 
 ;; Functions for sexp diary entries.
 
+(defun mdw-not-org-mode (form)
+  "As FORM, but not in Org mode agenda."
+  (and (not mdw-diary-for-org-mode-p)
+       (eval form)))
+
 (defun mdw-weekday (l)
   "Return non-nil if `date' falls on one of the days of the week in L.
 L is a list of day numbers (from 0 to 6 for Sunday through to
 (defun mdw-weekday (l)
   "Return non-nil if `date' falls on one of the days of the week in L.
 L is a list of day numbers (from 0 to 6 for Sunday through to
@@ -245,6 +335,50 @@ function returns non-nil."
        (memq (nth d '(sunday monday tuesday wednesday
                              thursday friday saturday)) l))))
 
        (memq (nth d '(sunday monday tuesday wednesday
                              thursday friday saturday)) l))))
 
+(defun mdw-discordian-date (date)
+  "Return the Discordian calendar date corresponding to DATE.
+
+The return value is (YOLD . st-tibs-day) or (YOLD SEASON DAYNUM DOW).
+
+The original is by David Pearson.  I modified it to produce date components
+as output rather than a string."
+  (let* ((days ["Sweetmorn" "Boomtime" "Pungenday"
+               "Prickle-Prickle" "Setting Orange"])
+        (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)))
+        (julian (+ (aref day-count month) day))
+        (dyear (+ year 3066)))
+    (if (and (= month 1) (= day 28))
+       (cons dyear 'st-tibs-day)
+      (list dyear
+           (aref months (floor (/ julian 73)))
+           (1+ (mod julian 73))
+           (aref days (mod julian 5))))))
+
+(defun mdw-diary-discordian-date ()
+  "Convert the date in `date' to a string giving the Discordian date."
+  (let* ((ddate (mdw-discordian-date date))
+        (tail (format "in the YOLD %d" (car ddate))))
+    (if (eq (cdr ddate) 'st-tibs-day)
+       (format "St Tib's Day %s" tail)
+      (let ((season (cadr ddate))
+           (daynum (caddr ddate))
+           (dayname (cadddr ddate)))
+      (format "%s, the %d%s day of %s %s"
+             dayname
+             daynum
+             (let ((ldig (mod daynum 10)))
+               (cond ((= ldig 1) "st")
+                     ((= ldig 2) "nd")
+                     ((= ldig 3) "rd")
+                     (t "th")))
+             season
+             tail)))))
+
 (defun mdw-todo (&optional when)
   "Return non-nil today, or on WHEN, whichever is later."
   (let ((w (calendar-absolute-from-gregorian (calendar-current-date)))
 (defun mdw-todo (&optional when)
   "Return non-nil today, or on WHEN, whichever is later."
   (let ((w (calendar-absolute-from-gregorian (calendar-current-date)))
@@ -264,6 +398,52 @@ function returns non-nil."
                                (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 diary-add-to-list (before mdw-trim-leading-space compile activate)
+  "Trim leading space from the diary entry string."
+  (save-match-data
+    (let ((str (ad-get-arg 1))
+         (done nil) old)
+      (while (not done)
+       (setq old str)
+       (setq str (cond ((null str) nil)
+                       ((string-match "\\(^\\|\n\\)[ \t]+" str)
+                        (replace-match "\\1" nil nil str))
+                       ((and mdw-diary-for-org-mode-p
+                             (string-match (concat
+                                            "\\(^\\|\n\\)"
+                                            "\\(" diary-time-regexp
+                                            "\\(-" diary-time-regexp "\\)?"
+                                            "\\)"
+                                            "\\(\t[ \t]*\\| [ \t]+\\)")
+                                           str))
+                        (replace-match "\\1\\2 " nil nil str))
+                       ((and (not mdw-diary-for-org-mode-p)
+                             (string-match "\\[\\[[^][]*]\\[\\([^][]*\\)]]"
+                                           str))
+                        (replace-match "\\1" nil nil str))
+                       (t str)))
+       (if (equal str old) (setq done t)))
+      (ad-set-arg 1 str))))
+
+(defadvice org-bbdb-anniversaries (after mdw-fixup-list compile activate)
+  "Return a string rather than a list."
+  (with-temp-buffer
+    (let ((anyp nil))
+      (dolist (e (let ((ee ad-return-value))
+                  (if (atom ee) (list ee) ee)))
+       (when e
+         (when anyp (insert ?\n))
+         (insert e)
+         (setq anyp t)))
+      (setq ad-return-value
+           (and anyp (buffer-string))))))
+
 ;; Fighting with Org-mode's evil key maps.
 
 (defvar mdw-evil-keymap-keys
 ;; Fighting with Org-mode's evil key maps.
 
 (defvar mdw-evil-keymap-keys
@@ -301,26 +481,200 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'."
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
-(eval-after-load "org-latex"
-  '(progn
-     (push '("strayman"
-            "\\documentclass{strayman}
+(defvar mdw-org-latex-defs
+  '(("strayman"
+     "\\documentclass{strayman}
 \\usepackage[utf8]{inputenc}
 \\usepackage[palatino, helvetica, courier, maths=cmr]{mdwfonts}
 \\usepackage[utf8]{inputenc}
 \\usepackage[palatino, helvetica, courier, maths=cmr]{mdwfonts}
-\\usepackage[T1]{fontenc}
 \\usepackage{graphicx, tikz, mdwtab, mdwmath, crypto, longtable}"
 \\usepackage{graphicx, tikz, mdwtab, mdwmath, crypto, longtable}"
-            ("\\section{%s}" . "\\section*{%s}")
-            ("\\subsection{%s}" . "\\subsection*{%s}")
-            ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
-            ("\\paragraph{%s}" . "\\paragraph*{%s}")
-            ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
-          org-export-latex-classes)))
+     ("\\section{%s}" . "\\section*{%s}")
+     ("\\subsection{%s}" . "\\subsection*{%s}")
+     ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
+     ("\\paragraph{%s}" . "\\paragraph*{%s}")
+     ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
+
+(eval-after-load "org-latex"
+  '(setq 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)
+        org-latex-default-packages-alist '(("AUTO" "inputenc" t)
+                                           ("T1" "fontenc" t)
+                                           ("" "fixltx2e" nil)
+                                           ("" "graphicx" t)
+                                           ("" "longtable" nil)
+                                           ("" "float" nil)
+                                           ("" "wrapfig" nil)
+                                           ("" "rotating" nil)
+                                           ("normalem" "ulem" t)
+                                           ("" "textcomp" t)
+                                           ("" "marvosym" t)
+                                           ("" "wasysym" t)
+                                           ("" "amssymb" t)
+                                           ("" "hyperref" nil)
+                                           "\\tolerance=1000")))
+
 
 (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")
 
 
 (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")
 
+;; Glasses.
+
+(setq glasses-separator "-"
+      glasses-separate-parentheses-p nil
+      glasses-uncapitalize-p t)
+
+;; Some hacks to do with window placement.
+
+(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*")))
+    (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.")
+
+(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)
+       ad-do-it))
+
+(defadvice switch-to-buffer-other-frame
+    (around mdw-always-new-frame activate)
+  "Always make a new frame.
+Even if an existing window in some random frame looks tempting."
+  (let ((mdw-inhibit-walk-windows t)) ad-do-it))
+
+(defadvice display-buffer (before mdw-inhibit-other-frames activate)
+  "Don't try to do anything fancy with other frames.
+Pretend they don't exist.  They might be on other display devices."
+  (ad-set-arg 2 nil))
+
+;;;--------------------------------------------------------------------------
+;;; 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))))
+
+(defun mdw-compilation-buffer-name (mode)
+  (concat "*" (downcase mode) ": "
+         (abbreviate-file-name default-directory) "*"))
+(setq compilation-buffer-name-function 'mdw-compilation-buffer-name)
+
+(eval-after-load "compile"
+  '(progn
+     (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."
+  (let ((process-environment (copy-tree process-environment)))
+    (setenv "LD_PRELOAD" nil)
+    ad-do-it))
+
+(defun mdw-compile (command &optional directory comint)
+  "Initiate a compilation COMMAND, maybe in a different DIRECTORY.
+The DIRECTORY may be nil to not change.  If COMINT is t, then
+start an interactive compilation.
+
+Interactively, prompt for the command if the variable
+`compilation-read-command' is non-nil, or if requested through
+the prefix argument.  Prompt for the directory, and run
+interactively, if requested through the prefix.
+
+Use a prefix of 4, 6, 12, or 14, or type C-u between one and three times, to
+force prompting for a directory.
+
+Use a prefix of 2, 6, 10, or 14, or type C-u three times, to force
+prompting for the command.
+
+Use a prefix of 8, 10, 12, or 14, or type C-u twice or three times,
+to force interactive compilation."
+  (interactive
+   (let* ((prefix (prefix-numeric-value current-prefix-arg))
+         (command (eval compile-command))
+         (dir (and (plusp (logand prefix #x54))
+                   (read-directory-name "Compile in directory: "))))
+     (list (if (or compilation-read-command
+                  (plusp (logand prefix #x42)))
+              (compilation-read-command command)
+            command)
+          dir
+          (plusp (logand prefix #x58)))))
+  (let ((default-directory (or directory default-directory)))
+    (compile command comint)))
+
+;; Flymake support.
+
+(defun mdw-find-build-dir (build-file)
+  (catch 'found
+    (let* ((src-dir (file-name-as-directory (expand-file-name ".")))
+          (dir src-dir))
+      (loop
+       (when (file-exists-p (concat dir build-file))
+         (throw 'found dir))
+       (let ((sub (expand-file-name (file-relative-name src-dir dir)
+                                    (concat dir "build/"))))
+         (catch 'give-up
+           (loop
+             (when (file-exists-p (concat sub build-file))
+               (throw 'found sub))
+             (when (string= sub dir) (throw 'give-up nil))
+             (setq sub (file-name-directory (directory-file-name sub))))))
+       (when (string= dir
+                      (setq dir (file-name-directory
+                                 (directory-file-name dir))))
+         (throw 'found nil))))))
+
+(defun mdw-flymake-make-init ()
+  (let ((build-dir (mdw-find-build-dir "Makefile")))
+    (and build-dir
+        (let ((tmp-src (flymake-init-create-temp-buffer-copy
+                        #'flymake-create-temp-inplace)))
+          (flymake-get-syntax-check-program-args
+           tmp-src build-dir t t
+           #'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)))
+
+(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))
+
 ;;;--------------------------------------------------------------------------
 ;;; Mail and news hacking.
 
 ;;;--------------------------------------------------------------------------
 ;;; Mail and news hacking.
 
@@ -394,8 +748,101 @@ so that it can be used for convenient filtering."
          (setenv "REAL_MOVEMAIL" try))
       (setq path (cdr path)))))
 
          (setenv "REAL_MOVEMAIL" try))
       (setq path (cdr path)))))
 
+;; AUTHINFO GENERIC kludge.
+
+(defvar nntp-authinfo-generic nil
+  "Set to the `NNTPAUTH' string to pass on to `authinfo-kludge'.
+
+Use this to arrange for per-server settings.")
+
+(defun nntp-open-authinfo-kludge (buffer)
+  "Open a connection to SERVER using `authinfo-kludge'."
+  (let ((proc (start-process "nntpd" buffer
+                            "env" (concat "NNTPAUTH="
+                                          (or nntp-authinfo-generic
+                                              (getenv "NNTPAUTH")
+                                              (error "NNTPAUTH unset")))
+                            "authinfo-kludge" nntp-address)))
+    (set-buffer buffer)
+    (nntp-wait-for-string "^\r*200")
+    (beginning-of-line)
+    (delete-region (point-min) (point))
+    proc))
+
 (eval-after-load "erc"
 (eval-after-load "erc"
-    '(load "~/.ercrc.el"))
+  '(load "~/.ercrc.el"))
+
+;; Heavy-duty Gnus patching.
+
+(defun mdw-nnimap-transform-headers ()
+  (goto-char (point-min))
+  (let (article lines size string)
+    (block nil
+      (while (not (eobp))
+       (while (not (looking-at "\\* [0-9]+ FETCH"))
+         (delete-region (point) (progn (forward-line 1) (point)))
+         (when (eobp)
+           (return)))
+       (goto-char (match-end 0))
+       ;; Unfold quoted {number} strings.
+       (while (re-search-forward
+               "[^]][ (]{\\([0-9]+\\)}\r?\n"
+               (save-excursion
+                 ;; Start of the header section.
+                 (or (re-search-forward "] {[0-9]+}\r?\n" nil t)
+                     ;; Start of the next FETCH.
+                     (re-search-forward "\\* [0-9]+ FETCH" nil t)
+                     (point-max)))
+               t)
+         (setq size (string-to-number (match-string 1)))
+         (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)))
+         ;; [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)))
+       (setq lines nil)
+       (setq size
+             (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
+                            (read (current-buffer)))))
+           (while (and (consp structure)
+                       (not (atom (car structure))))
+             (setq structure (car structure)))
+           (setq lines (if (and
+                            (stringp (car structure))
+                            (equal (upcase (nth 0 structure)) "MESSAGE")
+                            (equal (upcase (nth 1 structure)) "RFC822"))
+                           (nth 9 structure)
+                         (nth 7 structure)))))
+       (delete-region (line-beginning-position) (line-end-position))
+       (insert (format "211 %s Article retrieved." article))
+       (forward-line 1)
+       (when size
+         (insert (format "Chars: %s\n" size)))
+       (when lines
+         (insert (format "Lines: %s\n" lines)))
+       ;; Most servers have a blank line after the headers, but
+       ;; Davmail doesn't.
+       (unless (re-search-forward "^\r$\\|^)\r?$" nil t)
+         (goto-char (point-max)))
+       (delete-region (line-beginning-position) (line-end-position))
+       (insert ".")
+       (forward-line 1)))))
+
+(eval-after-load 'nnimap
+  '(defalias 'nnimap-transform-headers
+     (symbol-function 'mdw-nnimap-transform-headers)))
 
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
 
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
@@ -464,7 +911,7 @@ in REST."
                                     (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))))))
 
@@ -507,7 +954,8 @@ sequences separated by `.'."
        (cond ((null la) (throw 'done lb))
              ((null lb) (throw 'done nil))
              ((< (car la) (car lb)) (throw 'done t))
        (cond ((null la) (throw 'done lb))
              ((null lb) (throw 'done nil))
              ((< (car la) (car lb)) (throw 'done t))
-             ((= (car la) (car lb)) (setq la (cdr la) lb (cdr lb))))))))
+             ((= (car la) (car lb)) (setq la (cdr la) lb (cdr lb)))
+             (t (throw 'done nil)))))))
 
 (defun mdw-check-autorevert ()
   "Sets global-auto-revert-ignore-buffer appropriately for this buffer.
 
 (defun mdw-check-autorevert ()
   "Sets global-auto-revert-ignore-buffer appropriately for this buffer.
@@ -528,6 +976,27 @@ tramp, which seems to get itself into a twist."
 (defadvice write-file (after mdw-autorevert activate)
   (mdw-check-autorevert))
 
 (defadvice write-file (after mdw-autorevert activate)
   (mdw-check-autorevert))
 
+(defun mdw-auto-revert ()
+  "Recheck all of the autorevertable buffers, and update VC modelines."
+  (interactive)
+  (let ((auto-revert-check-vc-info t))
+    (auto-revert-buffers)))
+
+(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)))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Dired hacking.
 
 ;;;--------------------------------------------------------------------------
 ;;; Dired hacking.
 
@@ -553,6 +1022,23 @@ options."
       (ad-set-arg 0 dir)
       ad-do-it)))
 
       (ad-set-arg 0 dir)
       ad-do-it)))
 
+(defun mdw-dired-run (args &optional syncp)
+  (interactive (let ((file (dired-get-filename t)))
+                (list (read-string (format "Arguments for %s: " file))
+                      current-prefix-arg)))
+  (funcall (if syncp 'shell-command 'async-shell-command)
+          (concat (shell-quote-argument (dired-get-filename nil))
+                  " " args)))
+
+(defadvice dired-do-flagged-delete
+    (around mdw-delete-if-prefix-argument activate compile)
+  (let ((delete-by-moving-to-trash (and (null current-prefix-arg)
+                                       delete-by-moving-to-trash)))
+    ad-do-it))
+
+(eval-after-load "dired"
+  '(define-key dired-mode-map "X" 'mdw-dired-run))
+
 ;;;--------------------------------------------------------------------------
 ;;; URL viewing.
 
 ;;;--------------------------------------------------------------------------
 ;;; URL viewing.
 
@@ -572,11 +1058,14 @@ If NEW-SESSION-P, start a new session."
            (w3m-browse-url url new-session-p))
        (select-window window)))))
 
            (w3m-browse-url url new-session-p))
        (select-window window)))))
 
+(eval-after-load 'w3m
+  '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session))
+
 (defvar mdw-good-url-browsers
 (defvar mdw-good-url-browsers
-  '(browse-url-generic
+  '(browse-url-mozilla
+    browse-url-generic
     (w3m . mdw-w3m-browse-url)
     (w3m . mdw-w3m-browse-url)
-    browse-url-w3
-    browse-url-mozilla)
+    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).")
   "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).")
@@ -662,10 +1151,6 @@ It in turn is a list of things:
   "*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'.")
 
-;; Setting things up.
-
-(fset 'mdw-do-auto-fill (symbol-function 'do-auto-fill))
-
 ;; Utility functions.
 
 (defun mdw-maybe-tabify (s)
 ;; Utility functions.
 
 (defun mdw-maybe-tabify (s)
@@ -683,11 +1168,11 @@ This is mainly useful in `auto-fill-mode'.")
 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)
 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)))))
+       ((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-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."
@@ -706,26 +1191,26 @@ at the start of a line, and match data must be saved."
   "Expand a dynamic prefix match element.
 See `mdw-fill-prefix' for details."
   (cond ((not (consp m)) (format "%s" m))
   "Expand a dynamic prefix match element.
 See `mdw-fill-prefix' for details."
   (cond ((not (consp m)) (format "%s" m))
-          ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m))))
-          ((eq (car m) 'pad) (mdw-padding (match-string
-                                           (mdw-maybe-car (cdr m)))))
-          ((eq (car m) 'eval) (eval (cdr m)))
-          (t "")))
+       ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m))))
+       ((eq (car m) 'pad) (mdw-padding (match-string
+                                        (mdw-maybe-car (cdr m)))))
+       ((eq (car m) 'eval) (eval (cdr m)))
+       (t "")))
 
 (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)
-          ((not mdw-fill-prefix) fill-prefix)
-          (t (save-excursion
-               (beginning-of-line)
-               (save-match-data
-                 (mdw-examine-fill-prefixes mdw-fill-prefix))))))
+       ((not mdw-fill-prefix) fill-prefix)
+       (t (save-excursion
+            (beginning-of-line)
+            (save-match-data
+              (mdw-examine-fill-prefixes mdw-fill-prefix))))))
 
 
-(defun do-auto-fill ()
+(defadvice do-auto-fill (around mdw-dynamic-fill-prefix () activate compile)
   "Handle auto-filling, working out a dynamic fill prefix in the
 case where there isn't a sensible static one."
   (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
   "Handle auto-filling, working out a dynamic fill prefix in the
 case where there isn't a sensible static one."
   (let ((fill-prefix (mdw-choose-dynamic-fill-prefix)))
-    (mdw-do-auto-fill)))
+    ad-do-it))
 
 (defun mdw-fill-paragraph ()
   "Fill paragraph, getting a dynamic fill prefix."
 
 (defun mdw-fill-paragraph ()
   "Fill paragraph, getting a dynamic fill prefix."
@@ -739,9 +1224,9 @@ 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
 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))))))
+       `((,(concat rx mdw-hanging-indents)
+          (match . 1)
+          (pad . ,(or mat 2))))))
 
 ;;;--------------------------------------------------------------------------
 ;;; Other common declarations.
 
 ;;;--------------------------------------------------------------------------
 ;;; Other common declarations.
@@ -760,23 +1245,23 @@ case."
       (whitespace-mode arg))
     (setq show-trailing-whitespace whitespace-mode)))
 
       (whitespace-mode arg))
     (setq show-trailing-whitespace whitespace-mode)))
 
+(defvar mdw-do-misc-mode-hacking nil)
+
 (defun mdw-misc-mode-config ()
   (and mdw-auto-indent
        (cond ((eq major-mode 'lisp-mode)
              (local-set-key "\C-m" 'mdw-indent-newline-and-indent))
 (defun mdw-misc-mode-config ()
   (and mdw-auto-indent
        (cond ((eq major-mode 'lisp-mode)
              (local-set-key "\C-m" 'mdw-indent-newline-and-indent))
-            ((or (eq major-mode 'slime-repl-mode)
-                 (eq major-mode 'asm-mode))
+            ((derived-mode-p 'slime-repl-mode 'asm-mode 'comint-mode)
              nil)
             (t
              (local-set-key "\C-m" 'newline-and-indent))))
              nil)
             (t
              (local-set-key "\C-m" 'newline-and-indent))))
+  (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 comment-column 40)
   (auto-fill-mode 1)
   (local-set-key [C-return] 'newline)
   (make-local-variable 'page-delimiter)
   (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
   (setq comment-column 40)
   (auto-fill-mode 1)
-  (setq fill-column 77)
-  (setq show-trailing-whitespace t)
-  (mdw-whitespace-mode 1)
+  (setq fill-column mdw-text-width)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (if (fboundp 'hs-minor-mode)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (if (fboundp 'hs-minor-mode)
@@ -785,8 +1270,28 @@ case."
   (reveal-mode t)
   (trap (turn-on-font-lock)))
 
   (reveal-mode t)
   (trap (turn-on-font-lock)))
 
-(defun mdw-post-config-mode-hack ()
-  (mdw-whitespace-mode 1))
+(defun mdw-post-local-vars-misc-mode-config ()
+  (setq whitespace-line-column mdw-text-width)
+  (when (and mdw-do-misc-mode-hacking
+            (not buffer-read-only))
+    (setq show-trailing-whitespace t)
+    (mdw-whitespace-mode 1)))
+(add-hook 'hack-local-variables-hook 'mdw-post-local-vars-misc-mode-config)
+
+(defmacro mdw-advise-update-angry-fruit-salad (&rest funcs)
+  `(progn ,@(mapcar (lambda (func)
+                     `(defadvice ,func
+                          (after mdw-angry-fruit-salad activate)
+                        (when mdw-do-misc-mode-hacking
+                          (setq show-trailing-whitespace
+                                (not buffer-read-only))
+                          (mdw-whitespace-mode (if buffer-read-only 0 1)))))
+                   funcs)))
+(mdw-advise-update-angry-fruit-salad toggle-read-only
+                                    read-only-mode
+                                    view-mode
+                                    view-mode-enable
+                                    view-mode-disable)
 
 (eval-after-load 'gtags
   '(progn
 
 (eval-after-load 'gtags
   '(progn
@@ -835,14 +1340,51 @@ doesn't match any of the regular expressions in
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
 ;;;--------------------------------------------------------------------------
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
 ;;;--------------------------------------------------------------------------
+;;; Fullscreen-ness.
+
+(defvar mdw-full-screen-parameters
+  '((menu-bar-lines . 0)
+    ;(vertical-scroll-bars . nil)
+    )
+  "Frame parameters to set when making a frame fullscreen.")
+
+(defvar mdw-full-screen-save
+  '(width height)
+  "Extra frame parameters to save when setting fullscreen.")
+
+(defun mdw-toggle-full-screen (&optional frame)
+  "Show the FRAME fullscreen."
+  (interactive)
+  (when window-system
+    (cond ((frame-parameter frame 'fullscreen)
+          (set-frame-parameter frame 'fullscreen nil)
+          (modify-frame-parameters
+           nil
+           (or (frame-parameter frame 'mdw-full-screen-saved)
+               (mapcar (lambda (assoc)
+                         (assq (car assoc) default-frame-alist))
+                       mdw-full-screen-parameters))))
+         (t
+          (let ((saved (mapcar (lambda (param)
+                                 (cons param (frame-parameter frame param)))
+                               (append (mapcar #'car
+                                               mdw-full-screen-parameters)
+                                       mdw-full-screen-save))))
+            (set-frame-parameter frame 'mdw-full-screen-saved saved))
+          (modify-frame-parameters frame mdw-full-screen-parameters)
+          (set-frame-parameter frame 'fullscreen 'fullboth)))))
+
+;;;--------------------------------------------------------------------------
 ;;; General fontification.
 
 ;;; General fontification.
 
+(make-face 'mdw-virgin-face)
+
 (defmacro mdw-define-face (name &rest body)
   "Define a face, and make sure it's actually set as the definition."
   (declare (indent 1)
           (debug 0))
   `(progn
 (defmacro mdw-define-face (name &rest body)
   "Define a face, and make sure it's actually set as the definition."
   (declare (indent 1)
           (debug 0))
   `(progn
-     (make-face ',name)
+     (copy-face 'mdw-virgin-face ',name)
      (defvar ,name ',name)
      (put ',name 'face-defface-spec ',body)
      (face-spec-set ',name ',body nil)))
      (defvar ,name ',name)
      (put ',name 'face-defface-spec ',body)
      (face-spec-set ',name ',body nil)))
@@ -856,15 +1398,21 @@ doesn't match any of the regular expressions in
   (((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 (>= emacs-major-version 23)
+(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 region
     (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 region
-  (((type tty) (class color)) :background "blue")
-  (((type tty) (class mono)) :inverse-video t)
-  (t :background "grey30"))
+  (((min-colors 64)) :background "grey30")
+  (((class color)) :background "blue")
+  (t :inverse-video t))
+(mdw-define-face match
+  (((class color)) :background "blue")
+  (t :inverse-video t))
+(mdw-define-face mc/cursor-face
+  (((class color)) :background "red")
+  (t :inverse-video t))
 (mdw-define-face minibuffer-prompt
   (t :weight bold))
 (mdw-define-face mode-line
 (mdw-define-face minibuffer-prompt
   (t :weight bold))
 (mdw-define-face mode-line
@@ -875,19 +1423,23 @@ doesn't match any of the regular expressions in
   (((class color)) :foreground "yellow" :background "blue"
                   :box (:line-width 1 :style released-button))
   (t :inverse-video t))
   (((class color)) :foreground "yellow" :background "blue"
                   :box (:line-width 1 :style released-button))
   (t :inverse-video t))
+(mdw-define-face nobreak-space
+  (((type tty)))
+  (t :inherit escape-glyph :underline t))
 (mdw-define-face scroll-bar
   (t :foreground "black" :background "lightgrey"))
 (mdw-define-face fringe
   (t :foreground "yellow"))
 (mdw-define-face show-paren-match
 (mdw-define-face scroll-bar
   (t :foreground "black" :background "lightgrey"))
 (mdw-define-face fringe
   (t :foreground "yellow"))
 (mdw-define-face show-paren-match
-  (((class color)) :background "darkgreen")
+  (((min-colors 64)) :background "darkgreen")
+  (((class color)) :background "green")
   (t :underline t))
 (mdw-define-face show-paren-mismatch
   (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face highlight
   (t :underline t))
 (mdw-define-face show-paren-mismatch
   (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face highlight
-  (((type x) (class color)) :background "DarkSeaGreen4")
-  (((type tty) (class color)) :background "cyan")
+  (((min-colors 64)) :background "DarkSeaGreen4")
+  (((class color)) :background "cyan")
   (t :inverse-video t))
 
 (mdw-define-face holiday-face
   (t :inverse-video t))
 
 (mdw-define-face holiday-face
@@ -900,6 +1452,13 @@ doesn't match any of the regular expressions in
 (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 dired-directory
   (t :foreground "cyan" :weight bold))
 (mdw-define-face dired-symlink
 (mdw-define-face dired-directory
   (t :foreground "cyan" :weight bold))
 (mdw-define-face dired-symlink
@@ -910,10 +1469,15 @@ doesn't match any of the regular expressions in
 (mdw-define-face trailing-whitespace
   (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face trailing-whitespace
   (((class color)) :background "red")
   (t :inverse-video t))
+(mdw-define-face whitespace-line
+  (((class color)) :background "darkred")
+  (t :inverse-video t))
 (mdw-define-face mdw-punct-face
 (mdw-define-face mdw-punct-face
-  (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+  (((min-colors 64)) :foreground "burlywood2")
+  (((class color)) :foreground "yellow"))
 (mdw-define-face mdw-number-face
   (t :foreground "yellow"))
 (mdw-define-face mdw-number-face
   (t :foreground "yellow"))
+(mdw-define-face mdw-trivial-face)
 (mdw-define-face font-lock-function-name-face
   (t :slant italic))
 (mdw-define-face font-lock-keyword-face
 (mdw-define-face font-lock-function-name-face
   (t :slant italic))
 (mdw-define-face font-lock-keyword-face
@@ -929,45 +1493,105 @@ doesn't match any of the regular expressions in
 (mdw-define-face font-lock-variable-name-face
   (t :slant italic))
 (mdw-define-face font-lock-comment-delimiter-face
 (mdw-define-face font-lock-variable-name-face
   (t :slant italic))
 (mdw-define-face font-lock-comment-delimiter-face
-  (((class mono)) :weight bold)
-  (((type tty) (class color)) :foreground "green")
-  (t :slant italic :foreground "SeaGreen1"))
+  (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+  (((class color)) :foreground "green")
+  (t :weight bold))
 (mdw-define-face font-lock-comment-face
 (mdw-define-face font-lock-comment-face
-  (((class mono)) :weight bold)
-  (((type tty) (class color)) :foreground "green")
-  (t :slant italic :foreground "SeaGreen1"))
+  (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+  (((class color)) :foreground "green")
+  (t :weight bold))
 (mdw-define-face font-lock-string-face
 (mdw-define-face font-lock-string-face
-  (((class mono)) :weight bold)
-  (((class color)) :foreground "SkyBlue1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan")
+  (t :weight bold))
 
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
   (default :slant italic)
 
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
   (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face message-header-cc
 (mdw-define-face message-header-cc
-  (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (default :slant italic)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-newsgroups
 (mdw-define-face message-header-newsgroups
-  (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (default :slant italic)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-subject
 (mdw-define-face message-header-subject
-  (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-to
 (mdw-define-face message-header-to
-  (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-xheader
 (mdw-define-face message-header-xheader
-  (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (default :slant italic)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-other
 (mdw-define-face message-header-other
-  (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (default :slant italic)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-name
 (mdw-define-face message-header-name
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (default :weight bold)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+
 (mdw-define-face which-func
   (t nil))
 
 (mdw-define-face which-func
   (t nil))
 
+(mdw-define-face gnus-header-name
+  (default :weight bold)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+(mdw-define-face gnus-header-subject
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+(mdw-define-face gnus-header-from
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+(mdw-define-face gnus-header-to
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+(mdw-define-face gnus-header-content
+  (default :slant italic)
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+
+(mdw-define-face gnus-cite-1
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
+(mdw-define-face gnus-cite-2
+  (((min-colors 64)) :foreground "RoyalBlue2")
+  (((class color)) :foreground "blue"))
+(mdw-define-face gnus-cite-3
+  (((min-colors 64)) :foreground "MediumOrchid")
+  (((class color)) :foreground "magenta"))
+(mdw-define-face gnus-cite-4
+  (((min-colors 64)) :foreground "firebrick2")
+  (((class color)) :foreground "red"))
+(mdw-define-face gnus-cite-5
+  (((min-colors 64)) :foreground "burlywood2")
+  (((class color)) :foreground "yellow"))
+(mdw-define-face gnus-cite-6
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
+(mdw-define-face gnus-cite-7
+  (((min-colors 64)) :foreground "SlateBlue1")
+  (((class color)) :foreground "cyan"))
+(mdw-define-face gnus-cite-8
+  (((min-colors 64)) :foreground "RoyalBlue2")
+  (((class color)) :foreground "blue"))
+(mdw-define-face gnus-cite-9
+  (((min-colors 64)) :foreground "purple2")
+  (((class color)) :foreground "magenta"))
+(mdw-define-face gnus-cite-10
+  (((min-colors 64)) :foreground "DarkOrange2")
+  (((class color)) :foreground "red"))
+(mdw-define-face gnus-cite-11
+  (t :foreground "grey"))
+
 (mdw-define-face diff-header
   (t nil))
 (mdw-define-face diff-index
 (mdw-define-face diff-header
   (t nil))
 (mdw-define-face diff-index
@@ -975,48 +1599,113 @@ doesn't match any of the regular expressions in
 (mdw-define-face diff-file-header
   (t :weight bold))
 (mdw-define-face diff-hunk-header
 (mdw-define-face diff-file-header
   (t :weight bold))
 (mdw-define-face diff-hunk-header
-  (t :foreground "SkyBlue1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face diff-function
 (mdw-define-face diff-function
-  (t :foreground "SkyBlue1" :weight bold))
+  (default :weight bold)
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face diff-header
 (mdw-define-face diff-header
-  (t :background "grey10"))
+  (((min-colors 64)) :background "grey10"))
 (mdw-define-face diff-added
 (mdw-define-face diff-added
-  (t :foreground "green"))
+  (((class color)) :foreground "green"))
 (mdw-define-face diff-removed
 (mdw-define-face diff-removed
-  (t :foreground "red"))
+  (((class color)) :foreground "red"))
 (mdw-define-face diff-context
   (t nil))
 (mdw-define-face diff-refine-change
 (mdw-define-face diff-context
   (t nil))
 (mdw-define-face diff-refine-change
-  (((class color) (type x)) :background "RoyalBlue4")
+  (((min-colors 64)) :background "RoyalBlue4")
+  (t :underline t))
+(mdw-define-face diff-refine-removed
+  (((min-colors 64)) :background "#500")
+  (t :underline t))
+(mdw-define-face diff-refine-added
+  (((min-colors 64)) :background "#050")
   (t :underline t))
 
   (t :underline t))
 
-(mdw-define-face dylan-header-background
-  (((class color) (type x)) :background "NavyBlue")
-  (t :background "blue"))
+(setq ediff-force-faces t)
+(mdw-define-face ediff-current-diff-A
+  (((min-colors 64)) :background "darkred")
+  (((class color)) :background "red")
+  (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-A
+  (((min-colors 64)) :background "red3")
+  (((class color)) :inverse-video t)
+  (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-A
+  (((min-colors 64)) :background "#300"))
+(mdw-define-face ediff-odd-diff-A
+  (((min-colors 64)) :background "#300"))
+(mdw-define-face ediff-current-diff-B
+  (((min-colors 64)) :background "darkgreen")
+  (((class color)) :background "magenta")
+  (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-B
+  (((min-colors 64)) :background "green4")
+  (((class color)) :inverse-video t)
+  (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-B
+  (((min-colors 64)) :background "#020"))
+(mdw-define-face ediff-odd-diff-B
+  (((min-colors 64)) :background "#020"))
+(mdw-define-face ediff-current-diff-C
+  (((min-colors 64)) :background "darkblue")
+  (((class color)) :background "blue")
+  (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-C
+  (((min-colors 64)) :background "blue1")
+  (((class color)) :inverse-video t)
+  (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-C
+  (((min-colors 64)) :background "#004"))
+(mdw-define-face ediff-odd-diff-C
+  (((min-colors 64)) :background "#004"))
+(mdw-define-face ediff-current-diff-Ancestor
+  (((min-colors 64)) :background "#630")
+  (((class color)) :background "blue")
+  (t :inverse-video t))
+(mdw-define-face ediff-even-diff-Ancestor
+  (((min-colors 64)) :background "#320"))
+(mdw-define-face ediff-odd-diff-Ancestor
+  (((min-colors 64)) :background "#320"))
+
+(mdw-define-face magit-hash
+  (((min-colors 64)) :foreground "grey40")
+  (((class color)) :foreground "blue"))
+(mdw-define-face magit-diff-hunk-heading
+  (((min-colors 64)) :foreground "grey70" :background "grey25")
+  (((class color)) :foreground "yellow"))
+(mdw-define-face magit-diff-hunk-heading-highlight
+  (((min-colors 64)) :foreground "grey70" :background "grey35")
+  (((class color)) :foreground "yellow" :background "blue"))
+(mdw-define-face magit-diff-added
+  (((min-colors 64)) :foreground "#ddffdd" :background "#335533")
+  (((class color)) :foreground "green"))
+(mdw-define-face magit-diff-added-highlight
+  (((min-colors 64)) :foreground "#cceecc" :background "#336633")
+  (((class color)) :foreground "green" :background "blue"))
+(mdw-define-face magit-diff-removed
+  (((min-colors 64)) :foreground "#ffdddd" :background "#553333")
+  (((class color)) :foreground "red"))
+(mdw-define-face magit-diff-removed-highlight
+  (((min-colors 64)) :foreground "#eecccc" :background "#663333")
+  (((class color)) :foreground "red" :background "blue"))
+(mdw-define-face magit-blame-heading
+  (((min-colors 64)) :foreground "white" :background "grey25"
+                    :weight normal :slant normal)
+  (((class color)) :foreground "white" :background "blue"
+                  :weight normal :slant normal))
+(mdw-define-face magit-blame-name
+  (t :inherit magit-blame-heading :slant italic))
+(mdw-define-face magit-blame-date
+  (((min-colors 64)) :inherit magit-blame-heading :foreground "grey60")
+  (((class color)) :inherit magit-blame-heading :foreground "cyan"))
+(mdw-define-face magit-blame-summary
+  (t :inherit magit-blame-heading :weight bold))
 
 
-(mdw-define-face magit-diff-add
-  (t :foreground "green"))
-(mdw-define-face magit-diff-del
-  (t :foreground "red"))
-(mdw-define-face magit-diff-file-header
-  (t :weight bold))
-(mdw-define-face magit-diff-hunk-header
-  (t :foreground "SkyBlue1"))
-(mdw-define-face magit-item-highlight
-  (((type tty)) :background "blue")
-  (t :background "DarkSeaGreen4"))
-(mdw-define-face magit-log-head-label-remote
-  (((type tty)) :background "cyan" :foreground "green")
-  (t :background "grey11" :foreground "DarkSeaGreen2" :box t))
-(mdw-define-face magit-log-head-label-local
-  (((type tty)) :background "cyan" :foreground "yellow")
-  (t :background "grey11" :foreground "LightSkyBlue1" :box t))
-(mdw-define-face magit-log-head-label-tags
-  (((type tty)) :background "red" :foreground "yellow")
-  (t :background "LemonChiffon1" :foreground "goldenrod4" :box t))
-(mdw-define-face magit-log-graph
-  (((type tty)) :foreground "magenta")
-  (t :foreground "grey80"))
+(mdw-define-face dylan-header-background
+  (((min-colors 64)) :background "NavyBlue")
+  (((class color)) :background "blue"))
 
 (mdw-define-face erc-input-face
   (t :foreground "red"))
 
 (mdw-define-face erc-input-face
   (t :foreground "red"))
@@ -1074,7 +1763,7 @@ doesn't match any of the regular expressions in
 (mdw-define-face mdw-ellipsis-face
   (((type tty)) :foreground "blue") (t :foreground "grey60"))
 (let ((dollar (make-glyph-code ?$ 'mdw-ellipsis-face))
 (mdw-define-face mdw-ellipsis-face
   (((type tty)) :foreground "blue") (t :foreground "grey60"))
 (let ((dollar (make-glyph-code ?$ 'mdw-ellipsis-face))
-      (backslash (make-glyph-code ?\ 'mdw-ellipsis-face))
+      (backslash (make-glyph-code ?\\ 'mdw-ellipsis-face))
       (dot (make-glyph-code ?. 'mdw-ellipsis-face))
       (bar (make-glyph-code ?| mdw-ellipsis-face)))
   (set-display-table-slot standard-display-table 0 dollar)
       (dot (make-glyph-code ?. 'mdw-ellipsis-face))
       (bar (make-glyph-code ?| mdw-ellipsis-face)))
   (set-display-table-slot standard-display-table 0 dollar)
@@ -1084,18 +1773,85 @@ doesn't match any of the regular expressions in
   (set-display-table-slot standard-display-table 5 bar))
 
 ;;;--------------------------------------------------------------------------
   (set-display-table-slot standard-display-table 5 bar))
 
 ;;;--------------------------------------------------------------------------
-;;; C programming configuration.
-
-;; Linux kernel hacking.
+;;; Where is point?
+
+(mdw-define-face mdw-point-overlay-face
+  (((type graphic)))
+  (((min-colors 64)) :background "darkblue")
+  (((class color)) :background "blue")
+  (((type tty) (class mono)) :inverse-video t))
+
+(defvar mdw-point-overlay-fringe-display '(vertical-bar . vertical-bar))
+
+(defun mdw-configure-point-overlay ()
+  (let ((ov (make-overlay 0 0)))
+    (overlay-put ov 'priority 0)
+    (let* ((fringe (or mdw-point-overlay-fringe-display (cons nil nil)))
+          (left (car fringe)) (right (cdr fringe))
+          (s ""))
+      (when left
+       (let ((ss "."))
+         (put-text-property 0 1 'display `(left-fringe ,left) ss)
+         (setq s (concat s ss))))
+      (when right
+       (let ((ss "."))
+         (put-text-property 0 1 'display `(right-fringe ,right) ss)
+         (setq s (concat s ss))))
+      (when (or left right)
+       (overlay-put ov 'before-string s)))
+    (overlay-put ov 'face 'mdw-point-overlay-face)
+    (delete-overlay ov)
+    ov))
+
+(defvar mdw-point-overlay (mdw-configure-point-overlay)
+  "An overlay used for showing where point is in the selected window.")
+(defun mdw-reconfigure-point-overlay ()
+  (interactive)
+  (setq mdw-point-overlay (mdw-configure-point-overlay)))
+
+(defun mdw-remove-point-overlay ()
+  "Remove the current-point overlay."
+  (delete-overlay mdw-point-overlay))
+
+(defun mdw-update-point-overlay ()
+  "Mark the current point position with an overlay."
+  (if (not mdw-point-overlay-mode)
+      (mdw-remove-point-overlay)
+    (overlay-put mdw-point-overlay 'window (selected-window))
+    (move-overlay mdw-point-overlay
+                 (line-beginning-position)
+                 (+ (line-end-position) 1))))
+
+(defvar mdw-point-overlay-buffers nil
+  "List of buffers using `mdw-point-overlay-mode'.")
+
+(define-minor-mode mdw-point-overlay-mode
+  "Indicate current line with an overlay."
+  :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))
+    (if mdw-point-overlay-mode
+       (setq 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))
+       (t
+        (mdw-remove-point-overlay)
+        (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
+        (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
 
 
-(defvar linux-c-mode-hook)
+(define-globalized-minor-mode mdw-global-point-overlay-mode
+  mdw-point-overlay-mode
+  (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
 
 
-(defun linux-c-mode ()
-  (interactive)
-  (c-mode)
-  (setq major-mode 'linux-c-mode)
-  (setq mode-name "Linux C")
-  (run-hooks 'linux-c-mode-hook))
+;;;--------------------------------------------------------------------------
+;;; C programming configuration.
 
 ;; Make C indentation nice.
 
 
 ;; Make C indentation nice.
 
@@ -1115,32 +1871,112 @@ doesn't match any of the regular expressions in
        c-basic-offset
       nil)))
 
        c-basic-offset
       nil)))
 
-(defun mdw-c-style ()
-  (c-add-style "[mdw] C and C++ style"
-              '((c-basic-offset . 2)
-                (comment-column . 40)
-                (c-class-key . "class")
-                (c-backslash-column . 72)
-                (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-lineup-arglist)
-                 (topmost-intro . mdw-c-indent-extern-mumble)
-                 (cpp-define-intro . 0)
-                 (knr-argdecl . 0)
-                 (inextern-lang . [0])
-                 (label . 0)
-                 (case-label . +)
-                 (access-label . -)
-                 (inclass . +)
-                 (inline-open . ++)
-                 (statement-cont . +)
-                 (statement-case-intro . +)))
-              t))
+(defun mdw-c-indent-arglist-nested (langelem)
+  "Indent continued argument lists.
+If we've nested more than one argument list, then only introduce a single
+indentation anyway."
+  (let ((context c-syntactic-context)
+       (pos (c-langelem-2nd-pos c-syntactic-element))
+       (should-indent-p t))
+    (while (and context
+               (eq (caar context) 'arglist-cont-nonempty))
+      (when (and (= (caddr (pop context)) pos)
+                context
+                (memq (caar context) '(arglist-intro
+                                       arglist-cont-nonempty)))
+       (setq should-indent-p nil)))
+    (if should-indent-p '+ 0)))
+
+(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.
+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))
+        (func (intern (concat "mdw-define-c-style/" name-string))))
+    `(progn
+       (defun ,func () (c-add-style ,name-string ',assocs))
+       (and (featurep 'cc-mode) (,func))
+       (add-hook 'mdw-define-c-styles-hook ',func))))
+
+(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
+  (c-basic-offset . 2)
+  (comment-column . 40)
+  (c-class-key . "class")
+  (c-backslash-column . 72)
+  (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-lineup-arglist)
+                  (topmost-intro . mdw-c-indent-extern-mumble)
+                  (cpp-define-intro . 0)
+                  (knr-argdecl . 0)
+                  (inextern-lang . [0])
+                  (label . 0)
+                  (case-label . +)
+                  (access-label . -)
+                  (inclass . +)
+                  (inline-open . ++)
+                  (statement-cont . +)
+                  (statement-case-intro . +)))
+
+(defun mdw-set-default-c-style (modes style)
+  "Update the default CC Mode style for MODES to be STYLE.
+
+MODES may be a list of major mode names or a singleton.  STYLE is a style
+name, as a symbol."
+  (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))))))))
+(setq c-default-style "mdw-c")
+
+(mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
 
 (defvar mdw-c-comment-fill-prefix
   `((,(concat "\\([ \t]*/?\\)"
 
 (defvar mdw-c-comment-fill-prefix
   `((,(concat "\\([ \t]*/?\\)"
-             "\\(\*\\|//]\\)"
+             "\\(\\*\\|//\\)"
              "\\([ \t]*\\)"
              "\\([A-Za-z]+:[ \t]*\\)?"
              mdw-hanging-indents)
              "\\([ \t]*\\)"
              "\\([A-Za-z]+:[ \t]*\\)?"
              mdw-hanging-indents)
@@ -1155,81 +1991,87 @@ doesn't match any of the regular expressions in
   (modify-syntax-entry ?\n "> b")
 
   ;; Other stuff.
   (modify-syntax-entry ?\n "> b")
 
   ;; Other stuff.
-  (mdw-c-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
-  (setq c-label-minimum-indentation 0)
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (mdw-regexps "and"             ;C++
-                     "and_eq"          ;C++
-                     "asm"             ;K&R, GCC
-                     "auto"            ;K&R, C89
-                     "bitand"          ;C++
-                     "bitor"           ;C++
-                     "bool"            ;C++, C9X macro
-                     "break"           ;K&R, C89
-                     "case"            ;K&R, C89
-                     "catch"           ;C++
-                     "char"            ;K&R, C89
-                     "class"           ;C++
-                     "complex"         ;C9X macro, C++ template type
-                     "compl"           ;C++
-                     "const"           ;C89
-                     "const_cast"      ;C++
-                     "continue"        ;K&R, C89
-                     "defined"         ;C89 preprocessor
-                     "default"         ;K&R, C89
-                     "delete"          ;C++
-                     "do"              ;K&R, C89
-                     "double"          ;K&R, C89
-                     "dynamic_cast"    ;C++
-                     "else"            ;K&R, C89
-                     ;; "entry"        ;K&R -- never used
-                     "enum"            ;C89
-                     "explicit"        ;C++
-                     "export"          ;C++
-                     "extern"          ;K&R, C89
-                     "false"           ;C++, C9X macro
-                     "float"           ;K&R, C89
-                     "for"             ;K&R, C89
-                     ;; "fortran"      ;K&R
-                     "friend"          ;C++
-                     "goto"            ;K&R, C89
-                     "if"              ;K&R, C89
-                     "imaginary"       ;C9X macro
-                     "inline"          ;C++, C9X, GCC
-                     "int"             ;K&R, C89
-                     "long"            ;K&R, C89
-                     "mutable"         ;C++
-                     "namespace"       ;C++
-                     "new"             ;C++
-                     "operator"        ;C++
-                     "or"              ;C++
-                     "or_eq"           ;C++
-                     "private"         ;C++
-                     "protected"       ;C++
-                     "public"          ;C++
-                     "register"        ;K&R, C89
+        (mdw-regexps "alignas"          ;C11 macro, C++11
+                     "alignof"          ;C++11
+                     "and"              ;C++, C95 macro
+                     "and_eq"           ;C++, C95 macro
+                     "asm"              ;K&R, C++, GCC
+                     "atomic"           ;C11 macro, C++11 template type
+                     "auto"             ;K&R, C89
+                     "bitand"           ;C++, C95 macro
+                     "bitor"            ;C++, C95 macro
+                     "bool"             ;C++, C99 macro
+                     "break"            ;K&R, C89
+                     "case"             ;K&R, C89
+                     "catch"            ;C++
+                     "char"             ;K&R, C89
+                     "char16_t"         ;C++11, C11 library type
+                     "char32_t"         ;C++11, C11 library type
+                     "class"            ;C++
+                     "complex"          ;C99 macro, C++ template type
+                     "compl"            ;C++, C95 macro
+                     "const"            ;C89
+                     "constexpr"        ;C++11
+                     "const_cast"       ;C++
+                     "continue"         ;K&R, C89
+                     "decltype"         ;C++11
+                     "defined"          ;C89 preprocessor
+                     "default"          ;K&R, C89
+                     "delete"           ;C++
+                     "do"               ;K&R, C89
+                     "double"           ;K&R, C89
+                     "dynamic_cast"     ;C++
+                     "else"             ;K&R, C89
+                     ;; "entry"         ;K&R -- never used
+                     "enum"             ;C89
+                     "explicit"         ;C++
+                     "export"           ;C++
+                     "extern"           ;K&R, C89
+                     "float"            ;K&R, C89
+                     "for"              ;K&R, C89
+                     ;; "fortran"       ;K&R
+                     "friend"           ;C++
+                     "goto"             ;K&R, C89
+                     "if"               ;K&R, C89
+                     "imaginary"        ;C99 macro
+                     "inline"           ;C++, C99, GCC
+                     "int"              ;K&R, C89
+                     "long"             ;K&R, C89
+                     "mutable"          ;C++
+                     "namespace"        ;C++
+                     "new"              ;C++
+                     "noexcept"         ;C++11
+                     "noreturn"         ;C11 macro
+                     "not"              ;C++, C95 macro
+                     "not_eq"           ;C++, C95 macro
+                     "nullptr"          ;C++11
+                     "operator"         ;C++
+                     "or"               ;C++, C95 macro
+                     "or_eq"            ;C++, C95 macro
+                     "private"          ;C++
+                     "protected"        ;C++
+                     "public"           ;C++
+                     "register"         ;K&R, C89
                      "reinterpret_cast" ;C++
                      "reinterpret_cast" ;C++
-                     "restrict"         ;C9X
+                     "restrict"         ;C99
                      "return"           ;K&R, C89
                      "short"            ;K&R, C89
                      "signed"           ;C89
                      "sizeof"           ;K&R, C89
                      "static"           ;K&R, C89
                      "return"           ;K&R, C89
                      "short"            ;K&R, C89
                      "signed"           ;C89
                      "sizeof"           ;K&R, C89
                      "static"           ;K&R, C89
+                     "static_assert"    ;C11 macro, C++11
                      "static_cast"      ;C++
                      "struct"           ;K&R, C89
                      "switch"           ;K&R, C89
                      "template"         ;C++
                      "static_cast"      ;C++
                      "struct"           ;K&R, C89
                      "switch"           ;K&R, C89
                      "template"         ;C++
-                     "this"             ;C++
                      "throw"            ;C++
                      "throw"            ;C++
-                     "true"             ;C++, C9X macro
                      "try"              ;C++
                      "try"              ;C++
-                     "this"             ;C++
+                     "thread_local"     ;C11 macro, C++11
                      "typedef"          ;C89
                      "typeid"           ;C++
                      "typeof"           ;GCC
                      "typedef"          ;C89
                      "typeid"           ;C++
                      "typeof"           ;GCC
@@ -1242,12 +2084,19 @@ doesn't match any of the regular expressions in
                      "volatile"         ;C89
                      "wchar_t"          ;C++, C89 library type
                      "while"            ;K&R, C89
                      "volatile"         ;C89
                      "wchar_t"          ;C++, C89 library type
                      "while"            ;K&R, C89
-                     "xor"              ;C++
-                     "xor_eq"           ;C++
-                     "_Bool"            ;C9X
-                     "_Complex"         ;C9X
-                     "_Imaginary"       ;C9X
-                     "_Pragma"          ;C9X preprocessor
+                     "xor"              ;C++, C95 macro
+                     "xor_eq"           ;C++, C95 macro
+                     "_Alignas"         ;C11
+                     "_Alignof"         ;C11
+                     "_Atomic"          ;C11
+                     "_Bool"            ;C99
+                     "_Complex"         ;C99
+                     "_Generic"         ;C11
+                     "_Imaginary"       ;C99
+                     "_Noreturn"        ;C11
+                     "_Pragma"          ;C99 preprocessor
+                     "_Static_assert"   ;C11
+                     "_Thread_local"    ;C11
                      "__alignof__"      ;GCC
                      "__asm__"          ;GCC
                      "__attribute__"    ;GCC
                      "__alignof__"      ;GCC
                      "__asm__"          ;GCC
                      "__attribute__"    ;GCC
@@ -1262,6 +2111,11 @@ doesn't match any of the regular expressions in
                      "__typeof__"       ;GCC
                      "__volatile__"     ;GCC
                      ))
                      "__typeof__"       ;GCC
                      "__volatile__"     ;GCC
                      ))
+       (c-builtins
+        (mdw-regexps "false"            ;C++, C99 macro
+                     "this"             ;C++
+                     "true"             ;C++, C99 macro
+                     ))
        (preprocessor-keywords
         (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
                      "ident" "if" "ifdef" "ifndef" "import" "include"
        (preprocessor-keywords
         (mdw-regexps "assert" "define" "elif" "else" "endif" "error"
                      "ident" "if" "ifdef" "ifndef" "import" "include"
@@ -1293,6 +2147,9 @@ doesn't match any of the regular expressions in
           (list (concat "\\<\\(" c-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
           ;; Handle numbers too.
           ;;
           ;; This looks strange, I know.  It corresponds to the
@@ -1304,19 +2161,21 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))
+                '(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)
 
 
-    (mdw-post-config-mode-hack)))
+(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.
 
-(defun apcalc-mode ()
-  (interactive)
-  (c-mode)
-  (setq major-mode 'apcalc-mode)
-  (setq mode-name "AP Calc")
-  (run-hooks 'apcalc-mode-hook))
+(define-derived-mode apcalc-mode c-mode "AP Calc"
+  "Major mode for editing Calc code.")
 
 (defun mdw-fontify-apcalc ()
 
 
 (defun mdw-fontify-apcalc ()
 
@@ -1325,9 +2184,6 @@ doesn't match any of the regular expressions in
   (modify-syntax-entry ?/ ". 14")
 
   ;; Other stuff.
   (modify-syntax-entry ?/ ". 14")
 
   ;; Other stuff.
-  (mdw-c-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
   (setq comment-start "/* ")
   (setq comment-end " */")
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
   (setq comment-start "/* ")
   (setq comment-end " */")
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
@@ -1358,50 +2214,62 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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.
 
-(defun mdw-java-style ()
-  (c-add-style "[mdw] Java style"
-              '((c-basic-offset . 2)
-                (c-offsets-alist (substatement-open . 0)
-                                 (label . +)
-                                 (case-label . +)
-                                 (access-label . 0)
-                                 (inclass . +)
-                                 (statement-case-intro . +)))
-              t))
+(mdw-define-c-style mdw-java
+  (c-basic-offset . 2)
+  (c-backslash-column . 72)
+  (c-offsets-alist (substatement-open . 0)
+                  (label . +)
+                  (case-label . +)
+                  (access-label . 0)
+                  (inclass . +)
+                  (statement-case-intro . +)))
+(mdw-set-default-c-style 'java-mode 'mdw-java)
 
 ;; Declare Java fontification style.
 
 (defun mdw-fontify-java ()
 
 
 ;; Declare Java fontification style.
 
 (defun mdw-fontify-java ()
 
+  ;; Fiddle with some syntax codes.
+  (modify-syntax-entry ?@ ".")
+  (modify-syntax-entry ?@ "." font-lock-syntax-table)
+
   ;; Other stuff.
   ;; Other stuff.
-  (mdw-java-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((java-keywords
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((java-keywords
-        (mdw-regexps "abstract" "boolean" "break" "byte" "case" "catch"
-                     "char" "class" "const" "continue" "default" "do"
-                     "double" "else" "extends" "final" "finally" "float"
-                     "for" "goto" "if" "implements" "import" "instanceof"
-                     "int" "interface" "long" "native" "new" "package"
-                     "private" "protected" "public" "return" "short"
-                     "static" "super" "switch" "synchronized" "this"
-                     "throw" "throws" "transient" "try" "void" "volatile"
-                     "while"
-
-                     "false" "null" "true")))
+        (mdw-regexps "abstract" "assert"
+                     "boolean" "break" "byte"
+                     "case" "catch" "char" "class" "const" "continue"
+                     "default" "do" "double"
+                     "else" "enum" "extends"
+                     "final" "finally" "float" "for"
+                     "goto"
+                     "if" "implements" "import" "instanceof" "int"
+                     "interface"
+                     "long"
+                     "native" "new"
+                     "package" "private" "protected" "public"
+                     "return"
+                     "short" "static" "strictfp" "switch" "synchronized"
+                     "throw" "throws" "transient" "try"
+                     "void" "volatile"
+                     "while"))
+
+       (java-builtins
+        (mdw-regexps "false" "null" "super" "this" "true")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1410,6 +2278,10 @@ doesn't match any of the regular expressions in
           (list (concat "\\<\\(" java-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
           (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.
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
@@ -1422,9 +2294,11 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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.
@@ -1451,11 +2325,8 @@ doesn't match any of the regular expressions in
                      "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"))
-       (javascript-constants
+                     "volatile" "while" "with" "yield"))
+       (javascript-builtins
         (mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
                      "arguments" "this")))
 
         (mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
                      "arguments" "this")))
 
@@ -1466,8 +2337,8 @@ doesn't match any of the regular expressions in
           (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
                 '(0 font-lock-keyword-face))
 
           (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
                 '(0 font-lock-keyword-face))
 
-          ;; Handle the predefined constants defined above.
-          (list (concat "\\_<\\(" javascript-constants "\\)\\_>")
+          ;; Handle the predefined builtins defined above.
+          (list (concat "\\_<\\(" javascript-builtins "\\)\\_>")
                 '(0 font-lock-variable-name-face))
 
           ;; Handle numbers too.
                 '(0 font-lock-variable-name-face))
 
           ;; Handle numbers too.
@@ -1482,55 +2353,127 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(progn
+  (add-hook 'js-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'js-mode-hook 'mdw-fontify-javascript t))
+
+;;;--------------------------------------------------------------------------
+;;; Scala programming configuration.
+
+(defun mdw-fontify-scala ()
+
+  ;; Comment filling.
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
+
+  ;; Define things to be fontified.
+  (make-local-variable 'font-lock-keywords)
+  (let ((scala-keywords
+        (mdw-regexps "abstract" "case" "catch" "class" "def" "do" "else"
+                     "extends" "final" "finally" "for" "forSome" "if"
+                     "implicit" "import" "lazy" "match" "new" "object"
+                     "override" "package" "private" "protected" "return"
+                     "sealed" "throw" "trait" "try" "type" "val"
+                     "var" "while" "with" "yield"))
+       (scala-constants
+        (mdw-regexps "false" "null" "super" "this" "true"))
+       (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)))
+
+         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 "\""))))))
+
+(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.
 
-(defun mdw-csharp-style ()
-  (c-add-style "[mdw] C# style"
-              '((c-basic-offset . 2)
-                (c-offsets-alist (substatement-open . 0)
-                                 (label . 0)
-                                 (case-label . +)
-                                 (access-label . 0)
-                                 (inclass . +)
-                                 (statement-case-intro . +)))
-              t))
+(mdw-define-c-style mdw-csharp
+  (c-basic-offset . 2)
+  (c-backslash-column . 72)
+  (c-offsets-alist (substatement-open . 0)
+                  (label . 0)
+                  (case-label . +)
+                  (access-label . 0)
+                  (inclass . +)
+                  (statement-case-intro . +)))
+(mdw-set-default-c-style 'csharp-mode 'mdw-csharp)
 
 ;; Declare C# fontification style.
 
 (defun mdw-fontify-csharp ()
 
   ;; Other stuff.
 
 ;; Declare C# fontification style.
 
 (defun mdw-fontify-csharp ()
 
   ;; Other stuff.
-  (mdw-csharp-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((csharp-keywords
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
   (let ((csharp-keywords
-        (mdw-regexps "abstract" "as" "base" "bool" "break"
-                     "byte" "case" "catch" "char" "checked"
-                     "class" "const" "continue" "decimal" "default"
-                     "delegate" "do" "double" "else" "enum"
-                     "event" "explicit" "extern" "false" "finally"
-                     "fixed" "float" "for" "foreach" "goto"
-                     "if" "implicit" "in" "int" "interface"
-                     "internal" "is" "lock" "long" "namespace"
-                     "new" "null" "object" "operator" "out"
-                     "override" "params" "private" "protected" "public"
-                     "readonly" "ref" "return" "sbyte" "sealed"
-                     "short" "sizeof" "stackalloc" "static" "string"
-                     "struct" "switch" "this" "throw" "true"
-                     "try" "typeof" "uint" "ulong" "unchecked"
-                     "unsafe" "ushort" "using" "virtual" "void"
-                     "volatile" "while" "yield")))
+        (mdw-regexps "abstract" "as" "bool" "break" "byte" "case" "catch"
+                     "char" "checked" "class" "const" "continue" "decimal"
+                     "default" "delegate" "do" "double" "else" "enum"
+                     "event" "explicit" "extern" "finally" "fixed" "float"
+                     "for" "foreach" "goto" "if" "implicit" "in" "int"
+                     "interface" "internal" "is" "lock" "long" "namespace"
+                     "new" "object" "operator" "out" "override" "params"
+                     "private" "protected" "public" "readonly" "ref"
+                     "return" "sbyte" "sealed" "short" "sizeof"
+                     "stackalloc" "static" "string" "struct" "switch"
+                     "throw" "try" "typeof" "uint" "ulong" "unchecked"
+                     "unsafe" "ushort" "using" "virtual" "void" "volatile"
+                     "while" "yield"))
+
+       (csharp-builtins
+        (mdw-regexps "base" "false" "null" "this" "true")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1539,6 +2482,10 @@ doesn't match any of the regular expressions in
           (list (concat "\\<\\(" csharp-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
 
           (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.
           ;; Handle numbers too.
           ;;
           ;; The following isn't quite right, but it's close enough.
@@ -1551,13 +2498,13 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
-
-  (mdw-post-config-mode-hack))
+                '(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.
 
@@ -1578,12 +2525,12 @@ doesn't match any of the regular expressions in
 
   (let ((fsharp-keywords
         (mdw-regexps "abstract" "and" "as" "assert" "atomic"
 
   (let ((fsharp-keywords
         (mdw-regexps "abstract" "and" "as" "assert" "atomic"
-                     "base" "begin" "break"
+                     "begin" "break"
                      "checked" "class" "component" "const" "constraint"
                      "constructor" "continue"
                      "default" "delegate" "do" "done" "downcast" "downto"
                      "eager" "elif" "else" "end" "exception" "extern"
                      "checked" "class" "component" "const" "constraint"
                      "constructor" "continue"
                      "default" "delegate" "do" "done" "downcast" "downto"
                      "eager" "elif" "else" "end" "exception" "extern"
-                     "false" "finally" "fixed" "for" "fori" "fun" "function"
+                     "finally" "fixed" "for" "fori" "fun" "function"
                      "functor"
                      "global"
                      "if" "in" "include" "inherit" "inline" "interface"
                      "functor"
                      "global"
                      "if" "in" "include" "inherit" "inline" "interface"
@@ -1591,20 +2538,21 @@ doesn't match any of the regular expressions in
                      "lazy" "let"
                      "match" "measure" "member" "method" "mixin" "module"
                      "mutable"
                      "lazy" "let"
                      "match" "measure" "member" "method" "mixin" "module"
                      "mutable"
-                     "namespace" "new" "null"
-                     "object""of" "open" "or" "override"
+                     "namespace" "new"
+                     "object" "of" "open" "or" "override"
                      "parallel" "params" "private" "process" "protected"
                      "public" "pure"
                      "rec" "recursive" "return"
                      "sealed" "sig" "static" "struct"
                      "parallel" "params" "private" "process" "protected"
                      "public" "pure"
                      "rec" "recursive" "return"
                      "sealed" "sig" "static" "struct"
-                     "tailcall" "then" "to" "trait" "true" "try" "type"
+                     "tailcall" "then" "to" "trait" "try" "type"
                      "upcast" "use"
                      "val" "virtual" "void" "volatile"
                      "when" "while" "with"
                      "yield"))
 
        (fsharp-builtins
                      "upcast" "use"
                      "val" "virtual" "void" "volatile"
                      "when" "while" "with"
                      "yield"))
 
        (fsharp-builtins
-        (mdw-regexps "asr" "land" "lor" "lsl" "lsr" "lxor" "mod"))
+        (mdw-regexps "asr" "land" "lor" "lsl" "lsr" "lxor" "mod"
+                     "base" "false" "null" "true"))
 
        (bang-keywords
         (mdw-regexps "do" "let" "return" "use" "yield"))
 
        (bang-keywords
         (mdw-regexps "do" "let" "return" "use" "yield"))
@@ -1667,9 +2615,7 @@ doesn't match any of the regular expressions in
                      '(0 mdw-number-face))
 
                (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                      '(0 mdw-number-face))
 
                (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                     '(0 mdw-punct-face)))))
-
-  (mdw-post-config-mode-hack))
+                     '(0 mdw-punct-face))))))
 
 (defun mdw-fontify-inferior-fsharp ()
   (mdw-fontify-fsharp)
 
 (defun mdw-fontify-inferior-fsharp ()
   (mdw-fontify-fsharp)
@@ -1678,6 +2624,11 @@ doesn't match any of the regular expressions in
                      (list "^>" '(0 font-lock-keyword-face)))
                font-lock-keywords)))
 
                      (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.
 
@@ -1738,30 +2689,112 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; 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.
+
+(setq-default rust-indent-offset 2)
+
+(defun mdw-self-insert-and-indent (count)
+  (interactive "p")
+  (self-insert-command count)
+  (indent-according-to-mode))
+
+(defun mdw-fontify-rust ()
+
+  ;; Hack syntax categories.
+  (modify-syntax-entry ?$ ".")
+  (modify-syntax-entry ?% ".")
+  (modify-syntax-entry ?= ".")
+
+  ;; Fontify keywords and things.
+  (make-local-variable 'font-lock-keywords)
+  (let ((rust-keywords
+        (mdw-regexps "abstract" "alignof" "as" "async" "await"
+                     "become" "box" "break"
+                     "const" "continue" "crate"
+                     "do" "dyn"
+                     "else" "enum" "extern"
+                     "final" "fn" "for"
+                     "if" "impl" "in"
+                     "let" "loop"
+                     "macro" "match" "mod" "move" "mut"
+                     "offsetof" "override"
+                     "priv" "proc" "pub" "pure"
+                     "ref" "return"
+                     "sizeof" "static" "struct" "super"
+                     "trait" "try" "type" "typeof"
+                     "union" "unsafe" "unsized" "use"
+                     "virtual"
+                     "where" "while"
+                     "yield"))
+       (rust-builtins
+        (mdw-regexps "array" "pointer" "slice" "tuple"
+                     "bool" "true" "false"
+                     "f32" "f64"
+                     "i8" "i16" "i32" "i64" "isize"
+                     "u8" "u16" "u32" "u64" "usize"
+                     "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)))))
 
                 '(0 mdw-punct-face)))))
 
-  (mdw-post-config-mode-hack))
+  ;; 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.
 
-(defun mdw-awk-style ()
-  (c-add-style "[mdw] Awk style"
-              '((c-basic-offset . 2)
-                (c-offsets-alist (substatement-open . 0)
-                                 (statement-cont . 0)
-                                 (statement-case-intro . +)))
-              t))
+(mdw-define-c-style mdw-awk
+  (c-basic-offset . 2)
+  (c-offsets-alist (substatement-open . 0)
+                  (c-backslash-column . 72)
+                  (statement-cont . 0)
+                  (statement-case-intro . +)))
+(mdw-set-default-c-style 'awk-mode 'mdw-awk)
 
 ;; Declare Awk fontification style.
 
 (defun mdw-fontify-awk ()
 
   ;; Miscellaneous fiddling.
 
 ;; Declare Awk fontification style.
 
 (defun mdw-fontify-awk ()
 
   ;; Miscellaneous fiddling.
-  (mdw-awk-style)
-  (setq c-backslash-column 72)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; Now define things to be fontified.
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; Now define things to be fontified.
@@ -1798,22 +2831,25 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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.
 
-(fset 'perl-mode 'cperl-mode)
-(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 perl-indent-level 2)
+
+(setq-default cperl-indent-level 2
+             cperl-continued-statement-offset 2
+             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.
 
@@ -1822,16 +2858,29 @@ doesn't match any of the regular expressions in
   ;; Miscellaneous fiddling.
   (modify-syntax-entry ?$ "\\")
   (modify-syntax-entry ?$ "\\" font-lock-syntax-table)
   ;; Miscellaneous fiddling.
   (modify-syntax-entry ?$ "\\")
   (modify-syntax-entry ?$ "\\" font-lock-syntax-table)
+  (modify-syntax-entry ?: "." font-lock-syntax-table)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
-        (mdw-regexps "and" "break" "cmp" "continue" "do" "else" "elsif" "eq"
-                     "for" "foreach" "ge" "given" "gt" "goto" "if"
-                     "last" "le" "lt" "local" "my" "ne" "next" "or"
-                     "our" "package" "redo" "require" "return" "sub"
-                     "undef" "unless" "until" "use" "when" "while")))
+        (mdw-regexps "and"
+                     "break"
+                     "cmp" "continue"
+                     "default" "do"
+                     "else" "elsif" "eq"
+                     "for" "foreach"
+                     "ge" "given" "gt" "goto"
+                     "if"
+                     "last" "le" "local" "lt"
+                     "my"
+                     "ne" "next"
+                     "or" "our"
+                     "package"
+                     "redo" "require" "return"
+                     "sub"
+                     "undef" "unless" "until" "use"
+                     "when" "while")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1848,9 +2897,7 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
-
-  (mdw-post-config-mode-hack))
+                '(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,
@@ -1867,9 +2914,18 @@ strip numbers instead."
       (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.
 (defun mdw-fontify-pythonic (keywords)
 
   ;; Miscellaneous fiddling.
@@ -1886,16 +2942,14 @@ strip numbers instead."
               '(0 font-lock-keyword-face))
 
         ;; At least numbers are simpler than C.
               '(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_]+\\|[lL]\\|\\)")
+        (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-number-face))
 
         ;; And anything else is punctuation.
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face))))
-
-  (mdw-post-config-mode-hack))
+              '(0 mdw-punct-face)))))
 
 ;; Define Python fontification styles.
 
 
 ;; Define Python fontification styles.
 
@@ -1910,21 +2964,81 @@ strip numbers instead."
 (defun mdw-fontify-pyrex ()
   (mdw-fontify-pythonic
    (mdw-regexps "and" "as" "assert" "break" "cdef" "class" "continue"
 (defun mdw-fontify-pyrex ()
   (mdw-fontify-pythonic
    (mdw-regexps "and" "as" "assert" "break" "cdef" "class" "continue"
-               "ctypedef" "def" "del" "elif" "else" "except" "exec"
+               "ctypedef" "def" "del" "elif" "else" "enum" "except" "exec"
                "extern" "finally" "for" "from" "global" "if"
                "import" "in" "is" "lambda" "not" "or" "pass" "print"
                "extern" "finally" "for" "from" "global" "if"
                "import" "in" "is" "lambda" "not" "or" "pass" "print"
-               "raise" "return" "struct" "try" "while" "with"
+               "property" "raise" "return" "struct" "try" "while" "with"
                "yield")))
 
                "yield")))
 
+(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))
+
+(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.
+
+(setq-default lua-indent-level 2)
+
+(defun mdw-fontify-lua ()
+
+  ;; Miscellaneous fiddling.
+  (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
+
+  ;; Now define fontification things.
+  (make-local-variable 'font-lock-keywords)
+  (let ((lua-keywords
+        (mdw-regexps "and" "break" "do" "else" "elseif" "end"
+                     "false" "for" "function" "goto" "if" "in" "local"
+                     "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))))))
+
+(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.
 
@@ -1969,94 +3083,11 @@ strip numbers instead."
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
-
-;;;--------------------------------------------------------------------------
-;;; ARM assembler programming configuration.
-
-;; There doesn't appear to be an Emacs mode for this yet.
-;;
-;; Better do something about that, I suppose.
-
-(defvar arm-assembler-mode-map nil)
-(defvar arm-assembler-abbrev-table nil)
-(defvar arm-assembler-mode-syntax-table (make-syntax-table))
-
-(or arm-assembler-mode-map
-    (progn
-      (setq arm-assembler-mode-map (make-sparse-keymap))
-      (define-key arm-assembler-mode-map "\C-m" 'arm-assembler-newline)
-      (define-key arm-assembler-mode-map [C-return] 'newline)
-      (define-key arm-assembler-mode-map "\t" 'tab-to-tab-stop)))
-
-(defun arm-assembler-mode ()
-  "Major mode for ARM assembler programs"
-  (interactive)
-
-  ;; Do standard major mode things.
-  (kill-all-local-variables)
-  (use-local-map arm-assembler-mode-map)
-  (setq local-abbrev-table arm-assembler-abbrev-table)
-  (setq major-mode 'arm-assembler-mode)
-  (setq mode-name "ARM assembler")
-
-  ;; Set up syntax table.
-  (set-syntax-table arm-assembler-mode-syntax-table)
-  (modify-syntax-entry ?;   ; Nasty hack
-                      "<" arm-assembler-mode-syntax-table)
-  (modify-syntax-entry ?\n ">" arm-assembler-mode-syntax-table)
-  (modify-syntax-entry ?_ "_" arm-assembler-mode-syntax-table)
-  (modify-syntax-entry ?' "\"'" arm-assembler-mode-syntax-table)
-
-  (make-local-variable 'comment-start)
-  (setq comment-start ";")
-  (make-local-variable 'comment-end)
-  (setq comment-end "")
-  (make-local-variable 'comment-column)
-  (setq comment-column 48)
-  (make-local-variable 'comment-start-skip)
-  (setq comment-start-skip ";+[ \t]*")
-
-  ;; Play with indentation.
-  (make-local-variable 'indent-line-function)
-  (setq indent-line-function 'indent-relative-maybe)
-
-  ;; Set fill prefix.
-  (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)")
-
-  ;; Fiddle with fontification.
-  (make-local-variable 'font-lock-keywords)
-  (setq font-lock-keywords
-       (list
-
-        ;; Handle numbers too.
-        ;;
-        ;; The following isn't quite right, but it's close enough.
-        (list (concat "\\("
-                      "&[0-9a-fA-F]+\\|"
-                      "\\<[0-9]+\\(\\.[0-9]*\\|_[0-9a-zA-Z]+\\|\\)"
-                      "\\)")
-              '(0 mdw-number-face))
-
-        ;; Do something about operators.
-        (list "^[^ \t]*[ \t]+\\(GET\\|LNK\\)[ \t]+\\([^;\n]*\\)"
-              '(1 font-lock-keyword-face)
-              '(2 font-lock-string-face))
-        (list ":[a-zA-Z]+:"
-              '(0 font-lock-keyword-face))
-
-        ;; Do menemonics and directives.
-        (list "^[^ \t]*[ \t]+\\([a-zA-Z]+\\)"
-              '(1 font-lock-keyword-face))
-
-        ;; And anything else is punctuation.
-        (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face))))
-
-  (mdw-post-config-mode-hack)
-  (run-hooks 'arm-assembler-mode-hook))
+(progn
+  (add-hook 'icon-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'icon-mode-hook 'mdw-fontify-icon t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Assembler mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; Assembler mode.
@@ -2064,14 +3095,35 @@ strip numbers instead."
 (defun mdw-fontify-asm ()
   (modify-syntax-entry ?' "\"")
   (modify-syntax-entry ?. "w")
 (defun mdw-fontify-asm ()
   (modify-syntax-entry ?' "\"")
   (modify-syntax-entry ?. "w")
+  (modify-syntax-entry ?\n ">")
   (setf fill-prefix nil)
   (setf fill-prefix nil)
+  (modify-syntax-entry ?. "_")
+  (modify-syntax-entry ?* ". 23")
+  (modify-syntax-entry ?/ ". 124b")
+  (modify-syntax-entry ?\n "> b")
+  (local-set-key ";" 'self-insert-command)
   (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
 
   (mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
 
+(defun mdw-asm-set-comment ()
+  (modify-syntax-entry ?; "."
+                      )
+  (modify-syntax-entry asm-comment-char "< b")
+  (setq comment-start (string asm-comment-char ? )))
+(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
@@ -2081,8 +3133,11 @@ strip numbers instead."
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
               '(0 mdw-number-face))
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
               '(0 mdw-number-face))
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face))))
-  (mdw-post-config-mode-hack))
+              '(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.
@@ -2148,14 +3203,16 @@ strip numbers instead."
                              "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|"
                              "\\_<[-+*/=<>:&|]+\\_>"
                              "\\)")
                              "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|"
                              "\\_<[-+*/=<>:&|]+\\_>"
                              "\\)")
-                     '(0 mdw-punct-face)))))
+                     '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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 ()
 
@@ -2192,9 +3249,11 @@ strip numbers instead."
                              "\\>")
                      '(0 mdw-number-face))
                (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
                              "\\>")
                      '(0 mdw-number-face))
                (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
-                     '(0 mdw-punct-face)))))
+                     '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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.
@@ -2216,8 +3275,8 @@ strip numbers instead."
   (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"))
-         '(?! ?? ?# ?@ ?$))
+  (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.
@@ -2267,13 +3326,20 @@ strip numbers instead."
 
           ;; And everything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And everything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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.
@@ -2319,13 +3385,17 @@ strip numbers instead."
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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.
@@ -2399,14 +3469,16 @@ strip numbers instead."
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(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 ()
 
@@ -2434,9 +3506,11 @@ strip numbers instead."
           (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>"
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
           (list "\\<[0-9]+\\(\\|#[0-9a-zA-Z]+\\|[eE][+-]?[0-9]+\\)\\>"
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face)))))
+                '(0 mdw-punct-face))))))
 
 
-  (mdw-post-config-mode-hack))
+(progn
+  (add-hook 'erlang-mode-hook 'mdw-misc-mode-config t)
+  (add-hook 'erlang-mode-hook 'mdw-fontify-erlang t))
 
 ;;;--------------------------------------------------------------------------
 ;;; Texinfo configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Texinfo configuration.
@@ -2470,13 +3544,20 @@ strip numbers instead."
 
         ;; Fontify TeX special characters as punctuation.
         (list "[{}]+"
 
         ;; Fontify TeX special characters as punctuation.
         (list "[{}]+"
-              '(0 mdw-punct-face))))
+              '(0 mdw-punct-face)))))
 
 
-  (mdw-post-config-mode-hack))
+(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)
@@ -2486,6 +3567,10 @@ strip numbers instead."
   (modify-syntax-entry ?$ "." font-lock-syntax-table)
   (local-set-key [?$] 'self-insert-command)
 
   (modify-syntax-entry ?$ "." font-lock-syntax-table)
   (local-set-key [?$] 'self-insert-command)
 
+  ;; Make `tab' be useful, given that tab stops in TeX don't work well.
+  (local-set-key "\C-\M-i" 'indent-relative)
+  (setq indent-tabs-mode nil)
+
   ;; Set fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*%+[ \t]*\\)")
 
   ;; Set fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*%+[ \t]*\\)")
 
@@ -2538,13 +3623,115 @@ strip numbers instead."
 
         ;; Fontify TeX special characters as punctuation.
         (list "[$^_{}#&]"
 
         ;; Fontify TeX special characters as punctuation.
         (list "[$^_{}#&]"
-              '(0 mdw-punct-face))))
+              '(0 mdw-punct-face)))))
+
+(setq TeX-install-font-lock 'tex-font-setup)
+
+(eval-after-load 'font-latex
+  '(defun font-latex-jit-lock-force-redisplay (buf start end)
+     "Compatibility for Emacsen not offering `jit-lock-force-redisplay'."
+     ;; The following block is an expansion of `jit-lock-force-redisplay'
+     ;; and involved macros taken from CVS Emacs on 2007-04-28.
+     (with-current-buffer buf
+       (let ((modified (buffer-modified-p)))
+        (unwind-protect
+            (let ((buffer-undo-list t)
+                  (inhibit-read-only t)
+                  (inhibit-point-motion-hooks t)
+                  (inhibit-modification-hooks t)
+                  deactivate-mark
+                  buffer-file-name
+                  buffer-file-truename)
+              (put-text-property start end 'fontified t))
+          (unless modified
+            (restore-buffer-modified-p nil)))))))
+
+(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))))
 
 
-  (mdw-post-config-mode-hack))
+;;;--------------------------------------------------------------------------
+;;; HTML, CSS, and other web foolishness.
+
+(setq-default css-indent-offset 2)
 
 ;;;--------------------------------------------------------------------------
 ;;; SGML hacking.
 
 
 ;;;--------------------------------------------------------------------------
 ;;; SGML hacking.
 
+(setq-default psgml-html-build-new-buffer nil)
+
 (defun mdw-sgml-mode ()
   (interactive)
   (sgml-mode)
 (defun mdw-sgml-mode ()
   (interactive)
   (sgml-mode)
@@ -2579,8 +3766,8 @@ that character only to be normal punctuation.")
   (or (booleanp value)
       (every (lambda (v) (memq v '(?\" ?')))
             (if (listp value) value (list value)))))
   (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)
+(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'."
@@ -2591,19 +3778,14 @@ that character only to be normal punctuation.")
           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)))))))
-(defun mdw-fix-up-quote-hack ()
-  "Unpleasant hack to call `mdw-fix-up-quote' at the right time.
-Annoyingly, `hack-local-variables' is done after `set-auto-mode'
-so we wouldn't see a local-variable setting of
-`mdw-conf-quote-normal' in `conf-mode-hook'.  Instead, wire
-ourselves onto `hack-local-variables-hook' here, and check the
-setting once it's actually been made."
-  (add-hook 'hack-local-variables-hook 'mdw-fix-up-quote t t))
-(add-hook 'conf-mode-hook 'mdw-fix-up-quote-hack 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.
@@ -2625,6 +3807,9 @@ setting once it's actually been made."
     (let ((executable-set-magic #'(lambda (s &rest r) s)))
       (sh-set-shell shell-name)))
 
     (let ((executable-set-magic #'(lambda (s &rest r) s)))
       (sh-set-shell shell-name)))
 
+  ;; Don't insert here-document scaffolding automatically.
+  (local-set-key "<" 'self-insert-command)
+
   ;; Now enable my keys and the fontification.
   (mdw-misc-mode-config)
 
   ;; Now enable my keys and the fontification.
   (mdw-misc-mode-config)
 
@@ -2670,6 +3855,10 @@ setting once it's actually been made."
                 (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.
 
@@ -2690,8 +3879,8 @@ setting once it's actually been made."
                  (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)
@@ -2707,6 +3896,9 @@ setting once it's actually been made."
 (mdw-define-face eshell-ls-readonly (t nil))
 (mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
 
 (mdw-define-face eshell-ls-readonly (t nil))
 (mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
 
+(defun mdw-eshell-hack () (setenv "LD_PRELOAD" nil))
+(add-hook 'eshell-mode-hook 'mdw-eshell-hack)
+
 ;;;--------------------------------------------------------------------------
 ;;; Messages-file mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; Messages-file mode.
 
@@ -2790,9 +3982,11 @@ setting once it's actually been made."
                  messages-mode-keywords)))
   (run-hooks 'cpp-messages-mode-hook))
 
                  messages-mode-keywords)))
   (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.
@@ -2840,7 +4034,8 @@ setting once it's actually been made."
   (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.
@@ -2883,32 +4078,7 @@ setting once it's actually been made."
   (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))))
-  (mdw-post-config-mode-hack))
-
-;; Lispy languages.
+;;; Lispy languages.
 
 ;; Unpleasant bodge.
 (unless (boundp 'slime-repl-mode-map)
 
 ;; Unpleasant bodge.
 (unless (boundp 'slime-repl-mode-map)
@@ -2932,9 +4102,19 @@ setting once it's actually been made."
   (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)
+(setq-default 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 ()
 
@@ -2963,15 +4143,77 @@ setting once it's actually been made."
                            "\\)\\_>")
                    '(0 mdw-number-face))
              (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                            "\\)\\_>")
                    '(0 mdw-number-face))
              (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                   '(0 mdw-punct-face))))
+                   '(0 mdw-punct-face)))))
+
+;; SLIME setup.
+
+(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))
 
 
-  (mdw-post-config-mode-hack))
+;;;--------------------------------------------------------------------------
+;;; Other languages.
 
 
-(defun comint-send-and-indent ()
-  (interactive)
-  (comint-send-input)
+;; 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))
+
+(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 ()
 
@@ -2983,6 +4225,15 @@ setting once it's actually been made."
   ;; 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.
 
@@ -2993,6 +4244,12 @@ setting once it's actually been made."
    "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
   (auto-fill-mode 1))
 
    "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
   (auto-fill-mode 1))
 
+(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.
 
@@ -3052,11 +4309,330 @@ This allows you to pass a list of arguments through `ansi-term'."
          (ad-set-arg 2 (car program))
          (ad-set-arg 4 (cdr program))))))
 
          (ad-set-arg 2 (car program))
          (ad-set-arg 4 (cdr program))))))
 
+(defadvice term-exec-1 (around hack-environment compile activate)
+  "Hack the environment inherited by inferiors in the terminal."
+  (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."
+  (let ((process-environment (copy-tree process-environment)))
+    (setenv "LD_PRELOAD" nil)
+    ad-do-it))
+
 (defun ssh (host)
   "Open a terminal containing an ssh session to the HOST."
   (interactive "sHost: ")
   (ansi-term (list "ssh" host) (format "ssh@%s" host)))
 
 (defun ssh (host)
   "Open a terminal containing an ssh session to the HOST."
   (interactive "sHost: ")
   (ansi-term (list "ssh" host) (format "ssh@%s" host)))
 
+(defvar git-grep-command
+  "env GIT_PAGER=cat git grep --no-color -nH -e "
+  "*The default command for \\[git-grep].")
+
+(defvar git-grep-history nil)
+
+(defun git-grep (command-args)
+  "Run `git grep' with user-specified args and collect output in a buffer."
+  (interactive
+   (list (read-shell-command "Run git grep (like this): "
+                            git-grep-command 'git-grep-history)))
+  (let ((grep-use-null-device nil))
+    (grep command-args)))
+
+;;;--------------------------------------------------------------------------
+;;; Magit configuration.
+
+(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-wip-after-apply-mode-lighter ""
+      magit-wip-before-change-mode-lighter "")
+(eval-after-load "magit"
+  '(progn (global-magit-file-mode 1)
+         (magit-wip-after-save-mode 1)
+         (magit-wip-after-apply-mode 1)
+         (magit-wip-before-change-mode 1)
+         (add-to-list 'magit-no-confirm 'safe-with-wip)
+         (add-to-list 'magit-no-confirm 'trash)
+         (push '(:eval (if (or magit-wip-after-save-local-mode
+                               magit-wip-after-apply-mode
+                               magit-wip-before-change-mode)
+                           (format " wip:%s%s%s"
+                                   (if magit-wip-after-apply-mode "A" "")
+                                   (if magit-wip-before-change-mode "C" "")
+                                   (if magit-wip-after-save-local-mode "S" ""))))
+               minor-mode-alist)
+         (dolist (popup '(magit-diff-popup
+                          magit-diff-refresh-popup
+                          magit-diff-mode-refresh-popup
+                          magit-revision-mode-refresh-popup))
+           (magit-define-popup-switch popup ?R "Reverse diff" "-R"))))
+
+(defadvice magit-wip-commit-buffer-file
+    (around mdw-just-this-buffer activate compile)
+  (let ((magit-save-repository-buffers nil)) ad-do-it))
+
+(defadvice magit-discard
+    (around mdw-delete-if-prefix-argument activate compile)
+  (let ((magit-delete-by-moving-to-trash
+        (and (null current-prefix-arg)
+             magit-delete-by-moving-to-trash)))
+    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)))
+
+(setq magit-repository-directories '(("~/etc/profile" . 0)
+                                    ("~/src/" . 1)))
+
+(defadvice magit-list-repos (around mdw-dirname () activate compile)
+  "Make sure the returned names are directory names.
+Otherwise child processes get started in the wrong directory and
+there is sadness."
+  (setq ad-return-value (mapcar #'file-name-as-directory ad-do-it)))
+
+(defun mdw-repolist-column-unpulled-from-upstream (_id)
+  "Insert number of upstream commits not in the current branch."
+  (let ((upstream (magit-get-upstream-branch (magit-get-current-branch) t)))
+    (and upstream
+        (let ((n (cadr (magit-rev-diff-count "HEAD" upstream))))
+          (propertize (number-to-string n) 'face
+                      (if (> n 0) 'bold 'shadow))))))
+
+(defun mdw-repolist-column-unpushed-to-upstream (_id)
+  "Insert number of commits in the current branch but not its upstream."
+  (let ((upstream (magit-get-upstream-branch (magit-get-current-branch) t)))
+    (and upstream
+        (let ((n (car (magit-rev-diff-count "HEAD" upstream))))
+          (propertize (number-to-string n) 'face
+                      (if (> n 0) 'bold 'shadow))))))
+
+(defun mdw-try-smerge ()
+  (save-excursion
+    (goto-char (point-min))
+    (when (re-search-forward "^<<<<<<< " nil t)
+      (smerge-mode 1))))
+(add-hook 'find-file-hook 'mdw-try-smerge t)
+
+;;;--------------------------------------------------------------------------
+;;; GUD, and especially GDB.
+
+;; Inhibit window dedication.  I mean, seriously, wtf?
+(defadvice gdb-display-buffer (after mdw-undedicated (buf) compile activate)
+  "Don't make windows dedicated.  Seriously."
+  (set-window-dedicated-p ad-return-value nil))
+(defadvice gdb-set-window-buffer
+    (after mdw-undedicated (name &optional ignore-dedicated window)
+     compile activate)
+  "Don't make windows dedicated.  Seriously."
+  (set-window-dedicated-p (or window (selected-window)) nil))
+
+;;;--------------------------------------------------------------------------
+;;; MPC configuration.
+
+(eval-when-compile (trap (require 'mpc)))
+
+(setq mpc-browser-tags '(Artist|Composer|Performer Album|Playlist))
+
+(defun mdw-mpc-now-playing ()
+  (interactive)
+  (require 'mpc)
+  (save-excursion
+    (set-buffer (mpc-proc-cmd (mpc-proc-cmd-list '("status" "currentsong"))))
+    (mpc--status-callback))
+  (let ((state (cdr (assq 'state mpc-status))))
+    (cond ((member state '("stop"))
+          (message "mpd stopped."))
+         ((member state '("play" "pause"))
+          (let* ((artist (cdr (assq 'Artist mpc-status)))
+                 (album (cdr (assq 'Album mpc-status)))
+                 (title (cdr (assq 'Title mpc-status)))
+                 (file (cdr (assq 'file mpc-status)))
+                 (duration-string (cdr (assq 'Time mpc-status)))
+                 (time-string (cdr (assq 'time mpc-status)))
+                 (time (and time-string
+                            (string-to-number
+                             (if (string-match ":" time-string)
+                                 (substring time-string
+                                            0 (match-beginning 0))
+                               (time-string)))))
+                 (duration (and duration-string
+                                (string-to-number duration-string)))
+                 (pos (and time duration
+                           (format " [%d:%02d/%d:%02d]"
+                                   (/ time 60) (mod time 60)
+                                   (/ duration 60) (mod duration 60))))
+                 (fmt (cond ((and artist title)
+                             (format "`%s' by %s%s" title artist
+                                     (if album (format ", from `%s'" album)
+                                       "")))
+                            (file
+                             (format "`%s' (no tags)" file))
+                            (t
+                             "(no idea what's playing!)"))))
+            (if (string= state "play")
+                (message "mpd playing %s%s" fmt (or pos ""))
+              (message "mpd paused in %s%s" fmt (or pos "")))))
+         (t
+          (message "mpd in unknown state `%s'" state)))))
+
+(defmacro mdw-define-mpc-wrapper (func bvl interactive &rest body)
+  `(defun ,func ,bvl
+     (interactive ,@interactive)
+     (require 'mpc)
+     ,@body
+     (mdw-mpc-now-playing)))
+
+(mdw-define-mpc-wrapper mdw-mpc-play-or-pause () nil
+  (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
+      (mpc-pause)
+    (mpc-play)))
+
+(mdw-define-mpc-wrapper mdw-mpc-next () nil (mpc-next))
+(mdw-define-mpc-wrapper mdw-mpc-prev () nil (mpc-prev))
+(mdw-define-mpc-wrapper mdw-mpc-stop () nil (mpc-stop))
+
+(defun mdw-mpc-louder (step)
+  (interactive (list (if current-prefix-arg
+                        (prefix-numeric-value current-prefix-arg)
+                      +10)))
+  (mpc-proc-cmd (format "volume %+d" step)))
+
+(defun mdw-mpc-quieter (step)
+  (interactive (list (if current-prefix-arg
+                        (prefix-numeric-value current-prefix-arg)
+                      +10)))
+  (mpc-proc-cmd (format "volume %+d" (- step))))
+
+(defun mdw-mpc-hack-lines (arg interactivep func)
+  (if (and interactivep (use-region-p))
+      (let ((from (region-beginning)) (to (region-end)))
+       (goto-char from)
+       (beginning-of-line)
+       (funcall func)
+       (forward-line)
+       (while (< (point) to)
+         (funcall func)
+         (forward-line)))
+    (let ((n (prefix-numeric-value arg)))
+      (cond ((minusp n)
+            (unless (bolp)
+              (beginning-of-line)
+              (funcall func)
+              (incf n))
+            (while (minusp n)
+              (forward-line -1)
+              (funcall func)
+              (incf n)))
+           (t
+            (beginning-of-line)
+            (while (plusp n)
+              (funcall func)
+              (forward-line)
+              (decf n)))))))
+
+(defun mdw-mpc-select-one ()
+  (when (and (get-char-property (point) 'mpc-file)
+            (not (get-char-property (point) 'mpc-select)))
+    (mpc-select-toggle)))
+
+(defun mdw-mpc-unselect-one ()
+  (when (get-char-property (point) 'mpc-select)
+    (mpc-select-toggle)))
+
+(defun mdw-mpc-select (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+
+(defun mdw-mpc-unselect (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-backwards (arg)
+  (interactive "p")
+  (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-all ()
+  (interactive)
+  (setq mpc-select nil)
+  (mpc-selection-refresh))
+
+(defun mdw-mpc-next-line (arg)
+  (interactive "p")
+  (beginning-of-line)
+  (forward-line arg))
+
+(defun mdw-mpc-previous-line (arg)
+  (interactive "p")
+  (beginning-of-line)
+  (forward-line (- arg)))
+
+(defun mdw-mpc-playlist-add (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (let ((mpc-select mpc-select))
+    (when (or arg (and interactivep (use-region-p)))
+      (setq mpc-select nil)
+      (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+    (setq mpc-select (reverse mpc-select))
+    (mpc-playlist-add)))
+
+(defun mdw-mpc-playlist-delete (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (setq mpc-select (nreverse mpc-select))
+  (mpc-select-save
+    (when (or arg (and interactivep (use-region-p)))
+      (setq mpc-select nil)
+      (mpc-selection-refresh)
+      (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+      (mpc-playlist-delete)))
+
+(defun mdw-mpc-hack-tagbrowsers ()
+  (setq-local mode-line-format
+             '("%e"
+               mode-line-frame-identification
+               mode-line-buffer-identification)))
+(add-hook 'mpc-tagbrowser-mode-hook 'mdw-mpc-hack-tagbrowsers)
+
+(defun mdw-mpc-hack-songs ()
+  (setq-local header-line-format
+             ;; '("MPC " mpc-volume " " mpc-current-song)
+             (list (propertize " " 'display '(space :align-to 0))
+                   ;; 'mpc-songs-format-description
+                   '(:eval
+                     (let ((deactivate-mark) (hscroll (window-hscroll)))
+                       (with-temp-buffer
+                         (mpc-format mpc-songs-format 'self hscroll)
+                         ;; That would be simpler than the hscroll handling in
+                         ;; mpc-format, but currently move-to-column does not
+                         ;; recognize :space display properties.
+                         ;; (move-to-column hscroll)
+                         ;; (delete-region (point-min) (point))
+                         (buffer-string)))))))
+(add-hook 'mpc-songs-mode-hook 'mdw-mpc-hack-songs)
+
+(eval-after-load "mpc"
+  '(progn
+     (define-key mpc-mode-map "m" 'mdw-mpc-select)
+     (define-key mpc-mode-map "u" 'mdw-mpc-unselect)
+     (define-key mpc-mode-map "\177" 'mdw-mpc-unselect-backwards)
+     (define-key mpc-mode-map "\e\177" 'mdw-mpc-unselect-all)
+     (define-key mpc-mode-map "n" 'mdw-mpc-next-line)
+     (define-key mpc-mode-map "p" 'mdw-mpc-previous-line)
+     (define-key mpc-mode-map "/" 'mpc-songs-search)
+     (setq mpc-songs-mode-map (make-sparse-keymap))
+     (set-keymap-parent mpc-songs-mode-map mpc-mode-map)
+     (define-key mpc-songs-mode-map "l" 'mpc-playlist)
+     (define-key mpc-songs-mode-map "+" 'mdw-mpc-playlist-add)
+     (define-key mpc-songs-mode-map "-" 'mdw-mpc-playlist-delete)
+     (define-key mpc-songs-mode-map "\r" 'mpc-songs-jump-to)))
+
 ;;;--------------------------------------------------------------------------
 ;;; Inferior Emacs Lisp.
 
 ;;;--------------------------------------------------------------------------
 ;;; Inferior Emacs Lisp.