el/dot-emacs.el: Fix Scala keywords.
[profile] / el / dot-emacs.el
index 797c7dc..e341b93 100644 (file)
@@ -124,6 +124,14 @@ library."
   (and (library-exists-p file)
        (autoload symbol file docstring interactivep type)))
 
   (and (library-exists-p file)
        (autoload symbol file docstring interactivep type)))
 
+(defun mdw-kick-menu-bar (&optional frame)
+  "Regenerate FRAME's menu bar so it doesn't have empty menus."
+  (interactive)
+  (unless frame (setq frame (selected-frame)))
+  (let ((old (frame-parameter frame 'menu-bar-lines)))
+    (set-frame-parameter frame 'menu-bar-lines 0)
+    (set-frame-parameter frame 'menu-bar-lines old)))
+
 ;; Splitting windows.
 
 (unless (fboundp 'scroll-bar-columns)
 ;; Splitting windows.
 
 (unless (fboundp 'scroll-bar-columns)
@@ -137,6 +145,33 @@ library."
          ((eq side 'left) 1)
          (t 2))))
 
          ((eq side 'left) 1)
          (t 2))))
 
+(defun mdw-horizontal-window-overhead ()
+  "Computes the horizontal window overhead.
+This is the number of columns used by fringes, scroll bars and other such
+cruft."
+  (if (not window-system)
+      1
+    (let ((tot 0))
+      (dolist (what '(scroll-bar fringe))
+       (dolist (side '(left right))
+         (incf tot (funcall (intern (concat (symbol-name what) "-columns"))
+                            side))))
+      tot)))
+
+(defun mdw-split-window-horizontally (&optional width)
+  "Split a window horizontally.
+Without a numeric argument, split the window approximately in
+half.  With a numeric argument WIDTH, allocate WIDTH columns to
+the left-hand window (if positive) or -WIDTH columns to the
+right-hand window (if negative).  Space for scroll bars and
+fringes is not taken out of the allowance for WIDTH, unlike
+\\[split-window-horizontally]."
+  (interactive "P")
+  (split-window-horizontally
+   (cond ((null width) nil)
+        ((>= width 0) (+ width (mdw-horizontal-window-overhead)))
+        ((< width 0) 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")
@@ -146,16 +181,7 @@ library."
                     77)
                    (t 78)))
   (let* ((win (selected-window))
                     77)
                    (t 78)))
   (let* ((win (selected-window))
-        (sb-width (if (not window-system)
-                      1
-                    (let ((tot 0))
-                      (dolist (what '(scroll-bar fringe))
-                        (dolist (side '(left right))
-                          (incf tot
-                                (funcall (intern (concat (symbol-name what)
-                                                         "-columns"))
-                                         side))))
-                      tot)))
+        (sb-width (mdw-horizontal-window-overhead))
         (c (/ (+ (window-width) sb-width)
               (+ width sb-width))))
     (while (> c 1)
         (c (/ (+ (window-width) sb-width)
               (+ width sb-width))))
     (while (> c 1)
@@ -164,6 +190,48 @@ library."
       (other-window 1))
     (select-window win)))
 
       (other-window 1))
     (select-window win)))
 
+;; Don't raise windows unless I say so.
+
+(defvar mdw-inhibit-raise-frame nil
+  "*Whether `raise-frame' should do nothing when the frame is mapped.")
+
+(defadvice raise-frame
+    (around mdw-inhibit (&optional frame) activate compile)
+  "Don't actually do anything if `mdw-inhibit-raise-frame' is true, and the
+frame is actually mapped on the screen."
+  (if mdw-inhibit-raise-frame
+      (make-frame-visible frame)
+    ad-do-it))
+
+(defmacro mdw-advise-to-inhibit-raise-frame (function)
+  "Advise the FUNCTION not to raise frames, even if it wants to."
+  `(defadvice ,function
+       (around mdw-inhibit-raise (&rest hunoz) activate compile)
+     "Don't raise the window unless you have to."
+     (let ((mdw-inhibit-raise-frame t))
+       ad-do-it)))
+
+(mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus)
+
+;; Transient mark mode hacks.
+
+(defadvice exchange-point-and-mark
+    (around mdw-highlight (&optional arg) activate compile)
+  "Maybe don't actually exchange point and mark.
+If `transient-mark-mode' is on and the mark is inactive, then
+just activate it.  A non-trivial prefix argument will force the
+usual behaviour.  A trivial prefix argument (i.e., just C-u) will
+activate the mark and temporarily enable `transient-mark-mode' if
+it's currently off."
+  (cond ((or mark-active
+            (and (not transient-mark-mode) (not arg))
+            (and arg (or (not (consp arg))
+                         (not (= (car arg) 4)))))
+        ad-do-it)
+       (t
+        (or transient-mark-mode (setq transient-mark-mode 'only))
+        (set-mark (mark t)))))
+
 ;; Functions for sexp diary entries.
 
 (defun mdw-weekday (l)
 ;; Functions for sexp diary entries.
 
 (defun mdw-weekday (l)
@@ -248,6 +316,11 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'."
             ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
           org-export-latex-classes)))
 
             ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))
           org-export-latex-classes)))
 
+(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")
+
 ;;;--------------------------------------------------------------------------
 ;;; Mail and news hacking.
 
 ;;;--------------------------------------------------------------------------
 ;;; Mail and news hacking.
 
@@ -321,6 +394,9 @@ 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)))))
 
+(eval-after-load "erc"
+    '(load "~/.ercrc.el"))
+
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
 
 ;;;--------------------------------------------------------------------------
 ;;; Utility functions.
 
@@ -418,6 +494,21 @@ in REST."
              (insert "\nNP: ")
              (insert-file-contents np-file)))))
 
              (insert "\nNP: ")
              (insert-file-contents np-file)))))
 
+(defun mdw-version-< (ver-a ver-b)
+  "Answer whether VER-A is strictly earlier than VER-B.
+VER-A and VER-B are version numbers, which are strings containing digit
+sequences separated by `.'."
+  (let* ((la (mapcar (lambda (x) (car (read-from-string x)))
+                    (split-string ver-a "\\.")))
+        (lb (mapcar (lambda (x) (car (read-from-string x)))
+                    (split-string ver-b "\\."))))
+    (catch 'done
+      (while 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))))))))
+
 (defun mdw-check-autorevert ()
   "Sets global-auto-revert-ignore-buffer appropriately for this buffer.
 This takes into consideration whether it's been found using
 (defun mdw-check-autorevert ()
   "Sets global-auto-revert-ignore-buffer appropriately for this buffer.
 This takes into consideration whether it's been found using
@@ -482,7 +573,8 @@ If NEW-SESSION-P, start a new session."
        (select-window window)))))
 
 (defvar mdw-good-url-browsers
        (select-window window)))))
 
 (defvar mdw-good-url-browsers
-  '((w3m . mdw-w3m-browse-url)
+  '(browse-url-generic
+    (w3m . mdw-w3m-browse-url)
     browse-url-w3
     browse-url-mozilla)
   "List of good browsers for mdw-good-url-browsers.
     browse-url-w3
     browse-url-mozilla)
   "List of good browsers for mdw-good-url-browsers.
@@ -564,7 +656,7 @@ It in turn is a list of things:
 
 (defvar mdw-hanging-indents
   (concat "\\(\\("
 
 (defvar mdw-hanging-indents
   (concat "\\(\\("
-           "\\([*o]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
+           "\\([*o+]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
            "[ \t]+"
          "\\)?\\)")
   "*Standard regexp matching parts of a hanging indent.
            "[ \t]+"
          "\\)?\\)")
   "*Standard regexp matching parts of a hanging indent.
@@ -576,21 +668,15 @@ This is mainly useful in `auto-fill-mode'.")
 
 ;; Utility functions.
 
 
 ;; Utility functions.
 
-(defun mdw-tabify (s)
-  "Tabify the string S.  This is a horrid hack."
-  (save-excursion
-    (save-match-data
-      (let (start end)
-       (beginning-of-line)
-       (setq start (point-marker))
+(defun mdw-maybe-tabify (s)
+  "Tabify or untabify the string S, according to `indent-tabs-mode'."
+  (let ((tabfun (if indent-tabs-mode #'tabify #'untabify)))
+    (with-temp-buffer
+      (save-match-data
        (insert s "\n")
        (insert s "\n")
-       (setq end (point-marker))
-       (tabify start end)
-       (setq s (buffer-substring start (1- end)))
-       (delete-region start end)
-       (set-marker start nil)
-       (set-marker end nil)
-       s))))
+       (let ((start (point-min)) (end (point-max)))
+         (funcall tabfun (point-min) (point-max))
+         (setq s (buffer-substring (point-min) (1- (point-max)))))))))
 
 (defun mdw-examine-fill-prefixes (l)
   "Given a list of dynamic fill prefixes, pick one which matches
 
 (defun mdw-examine-fill-prefixes (l)
   "Given a list of dynamic fill prefixes, pick one which matches
@@ -598,9 +684,9 @@ 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)))
 at the start of a line, and match data must be saved."
   (cond ((not l) nil)
               ((looking-at (car (car l)))
-               (mdw-tabify (apply (function concat)
-                                  (mapcar (function mdw-do-prefix-match)
-                                          (cdr (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)
               (t (mdw-examine-fill-prefixes (cdr l)))))
 
 (defun mdw-maybe-car (p)
@@ -671,7 +757,8 @@ case."
   (when (and (boundp 'whitespace-style)
             (fboundp 'whitespace-mode))
     (let ((whitespace-style (remove 'trailing whitespace-style)))
   (when (and (boundp 'whitespace-style)
             (fboundp 'whitespace-mode))
     (let ((whitespace-style (remove 'trailing whitespace-style)))
-      (whitespace-mode arg))))
+      (whitespace-mode arg))
+    (setq show-trailing-whitespace whitespace-mode)))
 
 (defun mdw-misc-mode-config ()
   (and mdw-auto-indent
 
 (defun mdw-misc-mode-config ()
   (and mdw-auto-indent
@@ -683,7 +770,7 @@ case."
             (t
              (local-set-key "\C-m" 'newline-and-indent))))
   (local-set-key [C-return] 'newline)
             (t
              (local-set-key "\C-m" 'newline-and-indent))))
   (local-set-key [C-return] 'newline)
-  (make-variable-buffer-local 'page-delimiter)
+  (make-local-variable 'page-delimiter)
   (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
   (setq comment-column 40)
   (auto-fill-mode 1)
   (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
   (setq comment-column 40)
   (auto-fill-mode 1)
@@ -692,8 +779,9 @@ case."
   (mdw-whitespace-mode 1)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (mdw-whitespace-mode 1)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
-  (outline-minor-mode t)
-  (hs-minor-mode t)
+  (if (fboundp 'hs-minor-mode)
+      (trap (hs-minor-mode t))
+    (outline-minor-mode t))
   (reveal-mode t)
   (trap (turn-on-font-lock)))
 
   (reveal-mode t)
   (trap (turn-on-font-lock)))
 
@@ -739,26 +827,13 @@ doesn't match any of the regular expressions in
     (when (and frame-display
               (eq window-system 'x)
               (not (some (lambda (fr)
     (when (and frame-display
               (eq window-system 'x)
               (not (some (lambda (fr)
-                           (message "checking frame %s" frame)
                            (and (not (eq fr frame))
                                 (string= (frame-parameter fr 'display)
                            (and (not (eq fr frame))
                                 (string= (frame-parameter fr 'display)
-                                         frame-display)
-                                (progn "frame %s still uses us" nil)))
+                                         frame-display)))
                          (frame-list))))
       (run-with-idle-timer 0 nil #'x-close-connection frame-display))))
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
                          (frame-list))))
       (run-with-idle-timer 0 nil #'x-close-connection frame-display))))
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
-(defvar mdw-frame-parameters-alist
-  '((nil (menu-bar-lines . 0))))
-(defun mdw-set-frame-parameters (frame)
-  (let ((params (assq (if (fboundp 'window-system)
-                         (window-system frame)
-                       window-system)
-                     mdw-frame-parameters-alist)))
-    (when params
-      (modify-frame-parameters frame (cdr params)))))
-(add-hook 'after-make-frame-functions 'mdw-set-frame-parameters)
-
 ;;;--------------------------------------------------------------------------
 ;;; General fontification.
 
 ;;;--------------------------------------------------------------------------
 ;;; General fontification.
 
@@ -774,18 +849,18 @@ doesn't match any of the regular expressions in
 
 (mdw-define-face default
   (((type w32)) :family "courier new" :height 85)
 
 (mdw-define-face default
   (((type w32)) :family "courier new" :height 85)
-  (((type x)) :family "6x13" :height 130)
+  (((type x)) :family "6x13" :foundry "trad" :height 130)
   (((type color)) :foreground "white" :background "black")
   (t nil))
 (mdw-define-face fixed-pitch
   (((type w32)) :family "courier new" :height 85)
   (((type color)) :foreground "white" :background "black")
   (t nil))
 (mdw-define-face fixed-pitch
   (((type w32)) :family "courier new" :height 85)
-  (((type x)) :family "6x13" :height 130)
+  (((type x)) :family "6x13" :foundry "trad" :height 130)
   (t :foreground "white" :background "black"))
 (if (>= emacs-major-version 23)
     (mdw-define-face variable-pitch
       (((type x)) :family "sans" :height 100))
   (mdw-define-face variable-pitch
   (t :foreground "white" :background "black"))
 (if (>= emacs-major-version 23)
     (mdw-define-face variable-pitch
       (((type x)) :family "sans" :height 100))
   (mdw-define-face variable-pitch
-    (((type x)) :family "helvetica" :height 120)))
+    (((type x)) :family "helvetica" :height 90)))
 (mdw-define-face region
   (((type tty) (class color)) :background "blue")
   (((type tty) (class mono)) :inverse-video t)
 (mdw-define-face region
   (((type tty) (class color)) :background "blue")
   (((type tty) (class mono)) :inverse-video t)
@@ -800,6 +875,9 @@ 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
 (mdw-define-face scroll-bar
   (t :foreground "black" :background "lightgrey"))
 (mdw-define-face fringe
@@ -811,7 +889,8 @@ doesn't match any of the regular expressions in
   (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face highlight
   (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face highlight
-  (((class color)) :background "DarkSeaGreen4")
+  (((type x) (class color)) :background "DarkSeaGreen4")
+  (((type tty) (class color)) :background "cyan")
   (t :inverse-video t))
 
 (mdw-define-face holiday-face
   (t :inverse-video t))
 
 (mdw-define-face holiday-face
@@ -821,7 +900,15 @@ doesn't match any of the regular expressions in
 
 (mdw-define-face comint-highlight-prompt
   (t :weight bold))
 
 (mdw-define-face comint-highlight-prompt
   (t :weight bold))
-(mdw-define-face comint-highlight-input)
+(mdw-define-face comint-highlight-input
+  (t nil))
+
+(mdw-define-face dired-directory
+  (t :foreground "cyan" :weight bold))
+(mdw-define-face dired-symlink
+  (t :foreground "cyan"))
+(mdw-define-face dired-perm-write
+  (t nil))
 
 (mdw-define-face trailing-whitespace
   (((class color)) :background "red")
 
 (mdw-define-face trailing-whitespace
   (((class color)) :background "red")
@@ -830,6 +917,7 @@ doesn't match any of the regular expressions in
   (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
 (mdw-define-face mdw-number-face
   (t :foreground "yellow"))
   (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
 (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
@@ -855,6 +943,7 @@ doesn't match any of the regular expressions in
 (mdw-define-face font-lock-string-face
   (((class mono)) :weight bold)
   (((class color)) :foreground "SkyBlue1"))
 (mdw-define-face font-lock-string-face
   (((class mono)) :weight bold)
   (((class color)) :foreground "SkyBlue1"))
+
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
@@ -880,7 +969,11 @@ doesn't match any of the regular expressions in
   (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
 (mdw-define-face message-header-name
   (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
   (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
 (mdw-define-face message-header-name
   (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face which-func
+  (t nil))
 
 
+(mdw-define-face diff-header
+  (t nil))
 (mdw-define-face diff-index
   (t :weight bold))
 (mdw-define-face diff-file-header
 (mdw-define-face diff-index
   (t :weight bold))
 (mdw-define-face diff-file-header
@@ -895,7 +988,39 @@ doesn't match any of the regular expressions in
   (t :foreground "green"))
 (mdw-define-face diff-removed
   (t :foreground "red"))
   (t :foreground "green"))
 (mdw-define-face diff-removed
   (t :foreground "red"))
-(mdw-define-face diff-context)
+(mdw-define-face diff-context
+  (t nil))
+(mdw-define-face diff-refine-change
+  (((class color) (type x)) :background "RoyalBlue4")
+  (t :underline t))
+
+(mdw-define-face dylan-header-background
+  (((class color) (type x)) :background "NavyBlue")
+  (t :background "blue"))
+
+(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 erc-input-face
   (t :foreground "red"))
 
 (mdw-define-face erc-input-face
   (t :foreground "red"))
@@ -905,6 +1030,21 @@ doesn't match any of the regular expressions in
 (mdw-define-face woman-italic
   (t :slant italic))
 
 (mdw-define-face woman-italic
   (t :slant italic))
 
+(eval-after-load "rst"
+  '(progn
+     (mdw-define-face rst-level-1-face
+       (t :foreground "SkyBlue1" :weight bold))
+     (mdw-define-face rst-level-2-face
+       (t :foreground "SeaGreen1" :weight bold))
+     (mdw-define-face rst-level-3-face
+       (t :weight bold))
+     (mdw-define-face rst-level-4-face
+       (t :slant italic))
+     (mdw-define-face rst-level-5-face
+       (t :underline t))
+     (mdw-define-face rst-level-6-face
+       ())))
+
 (mdw-define-face p4-depot-added-face
   (t :foreground "green"))
 (mdw-define-face p4-depot-branch-op-face
 (mdw-define-face p4-depot-added-face
   (t :foreground "green"))
 (mdw-define-face p4-depot-branch-op-face
@@ -924,11 +1064,29 @@ doesn't match any of the regular expressions in
 (mdw-define-face p4-diff-ins-face
   (t :foreground "green"))
 
 (mdw-define-face p4-diff-ins-face
   (t :foreground "green"))
 
+(mdw-define-face w3m-anchor-face
+  (t :foreground "SkyBlue1" :underline t))
+(mdw-define-face w3m-arrived-anchor-face
+  (t :foreground "SkyBlue1" :underline t))
+
 (mdw-define-face whizzy-slice-face
   (t :background "grey10"))
 (mdw-define-face whizzy-error-face
   (t :background "darkred"))
 
 (mdw-define-face whizzy-slice-face
   (t :background "grey10"))
 (mdw-define-face whizzy-error-face
   (t :background "darkred"))
 
+;; Ellipses used to indicate hidden text (and similar).
+(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))
+      (dot (make-glyph-code ?. 'mdw-ellipsis-face))
+      (bar (make-glyph-code ?| mdw-ellipsis-face)))
+  (set-display-table-slot standard-display-table 0 dollar)
+  (set-display-table-slot standard-display-table 1 backslash)
+  (set-display-table-slot standard-display-table 4
+                         (vector dot dot dot))
+  (set-display-table-slot standard-display-table 5 bar))
+
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
 
@@ -973,13 +1131,14 @@ doesn't match any of the regular expressions in
                  (arglist-cont-nonempty . mdw-c-lineup-arglist)
                  (topmost-intro . mdw-c-indent-extern-mumble)
                  (cpp-define-intro . 0)
                  (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 . ++)
                  (inextern-lang . [0])
                  (label . 0)
                  (case-label . +)
                  (access-label . -)
                  (inclass . +)
                  (inline-open . ++)
-                 (statement-cont . 0)
+                 (statement-cont . +)
                  (statement-case-intro . +)))
               t))
 
                  (statement-case-intro . +)))
               t))
 
@@ -1272,6 +1431,138 @@ doesn't match any of the regular expressions in
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
+;;; Javascript programming configuration.
+
+(defun mdw-javascript-style ()
+  (setq js-indent-level 2)
+  (setq js-expr-indent-offset 0))
+
+(defun mdw-fontify-javascript ()
+
+  ;; Other stuff.
+  (mdw-javascript-style)
+  (setq js-auto-indent-flag t)
+
+  ;; Now define things to be fontified.
+  (make-local-variable 'font-lock-keywords)
+  (let ((javascript-keywords
+        (mdw-regexps "abstract" "boolean" "break" "byte" "case" "catch"
+                     "char" "class" "const" "continue" "debugger" "default"
+                     "delete" "do" "double" "else" "enum" "export" "extends"
+                     "final" "finally" "float" "for" "function" "goto" "if"
+                     "implements" "import" "in" "instanceof" "int"
+                     "interface" "let" "long" "native" "new" "package"
+                     "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
+        (mdw-regexps "false" "null" "undefined" "Infinity" "NaN" "true"
+                     "arguments" "this")))
+
+    (setq font-lock-keywords
+         (list
+
+          ;; Handle the keywords defined above.
+          (list (concat "\\_<\\(" javascript-keywords "\\)\\_>")
+                '(0 font-lock-keyword-face))
+
+          ;; Handle the predefined constants defined above.
+          (list (concat "\\_<\\(" javascript-constants "\\)\\_>")
+                '(0 font-lock-variable-name-face))
+
+          ;; Handle numbers too.
+          ;;
+          ;; The following isn't quite right, but it's close enough.
+          (list (concat "\\_<\\("
+                        "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+                        "[0-9]+\\(\\.[0-9]*\\|\\)"
+                        "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)"
+                        "[lLfFdD]?")
+                '(0 mdw-number-face))
+
+          ;; And anything else is punctuation.
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
+;;; Scala programming configuration.
+
+(defun mdw-fontify-scala ()
+
+  ;; 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 "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"))
+
+    (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))
+
+          ;; Identifiers with trailing operators.
+          (list (concat "_\\(" punctuation "\\)+")
+                '(0 mdw-trivial-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 "\"")))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
 ;;; C# programming configuration.
 
 ;; Make indentation nice.
 ;;; C# programming configuration.
 
 ;; Make indentation nice.
@@ -1344,6 +1635,126 @@ doesn't match any of the regular expressions in
   "Major mode for editing C# code.")
 
 ;;;--------------------------------------------------------------------------
   "Major mode for editing C# code.")
 
 ;;;--------------------------------------------------------------------------
+;;; F# programming configuration.
+
+(setq fsharp-indent-offset 2)
+
+(defun mdw-fontify-fsharp ()
+
+  (let ((punct "=<>+-*/|&%!@?"))
+    (do ((i 0 (1+ i)))
+       ((>= i (length punct)))
+      (modify-syntax-entry (aref punct i) ".")))
+
+  (modify-syntax-entry ?_ "_")
+  (modify-syntax-entry ?( "(")
+  (modify-syntax-entry ?) ")")
+
+  (setq indent-tabs-mode nil)
+
+  (let ((fsharp-keywords
+        (mdw-regexps "abstract" "and" "as" "assert" "atomic"
+                     "base" "begin" "break"
+                     "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"
+                     "functor"
+                     "global"
+                     "if" "in" "include" "inherit" "inline" "interface"
+                     "internal"
+                     "lazy" "let"
+                     "match" "measure" "member" "method" "mixin" "module"
+                     "mutable"
+                     "namespace" "new" "null"
+                     "object""of" "open" "or" "override"
+                     "parallel" "params" "private" "process" "protected"
+                     "public" "pure"
+                     "rec" "recursive" "return"
+                     "sealed" "sig" "static" "struct"
+                     "tailcall" "then" "to" "trait" "true" "try" "type"
+                     "upcast" "use"
+                     "val" "virtual" "void" "volatile"
+                     "when" "while" "with"
+                     "yield"))
+
+       (fsharp-builtins
+        (mdw-regexps "asr" "land" "lor" "lsl" "lsr" "lxor" "mod"))
+
+       (bang-keywords
+        (mdw-regexps "do" "let" "return" "use" "yield"))
+
+       (preprocessor-keywords
+        (mdw-regexps "if" "indent" "else" "endif")))
+
+    (setq font-lock-keywords
+         (list (list (concat "\\(^\\|[^\"]\\)"
+                             "\\(" "(\\*"
+                                   "[^*]*\\*+"
+                                   "\\(" "[^)*]" "[^*]*" "\\*+" "\\)*"
+                                   ")"
+                             "\\|"
+                                   "//.*"
+                             "\\)")
+                     '(2 font-lock-comment-face))
+
+               (list (concat "'" "\\("
+                                   "\\\\"
+                                   "\\(" "[ntbr'\\]"
+                                   "\\|" "[0-9][0-9][0-9]"
+                                   "\\|" "u" "[0-9a-fA-F]\\{4\\}"
+                                   "\\|" "U" "[0-9a-fA-F]\\{8\\}"
+                                   "\\)"
+                                 "\\|"
+                                 "." "\\)" "'"
+                             "\\|"
+                             "\"" "[^\"\\]*"
+                                   "\\(" "\\\\" "\\(.\\|\n\\)"
+                                         "[^\"\\]*" "\\)*"
+                             "\\(\"\\|\\'\\)")
+                     '(0 font-lock-string-face))
+
+               (list (concat "\\_<\\(" bang-keywords "\\)!" "\\|"
+                             "^#[ \t]*\\(" preprocessor-keywords "\\)\\_>"
+                             "\\|"
+                             "\\_<\\(" fsharp-keywords "\\)\\_>")
+                     '(0 font-lock-keyword-face))
+               (list (concat "\\<\\(" fsharp-builtins "\\)\\_>")
+                     '(0 font-lock-variable-name-face))
+
+               (list (concat "\\_<"
+                             "\\(" "0[bB][01]+" "\\|"
+                                   "0[oO][0-7]+" "\\|"
+                                   "0[xX][0-9a-fA-F]+" "\\)"
+                             "\\(" "lf\\|LF" "\\|"
+                                   "[uU]?[ysnlL]?" "\\)"
+                             "\\|"
+                             "\\_<"
+                             "[0-9]+" "\\("
+                               "[mMQRZING]"
+                               "\\|"
+                               "\\(\\.[0-9]*\\)?"
+                               "\\([eE][-+]?[0-9]+\\)?"
+                               "[fFmM]?"
+                               "\\|"
+                               "[uU]?[ysnlL]?"
+                             "\\)")
+                     '(0 mdw-number-face))
+
+               (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                     '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+(defun mdw-fontify-inferior-fsharp ()
+  (mdw-fontify-fsharp)
+  (setq font-lock-keywords
+       (append (list (list "^[#-]" '(0 font-lock-comment-face))
+                     (list "^>" '(0 font-lock-keyword-face)))
+               font-lock-keywords)))
+
+;;;--------------------------------------------------------------------------
 ;;; Go programming configuration.
 
 (defun mdw-fontify-go ()
 ;;; Go programming configuration.
 
 (defun mdw-fontify-go ()
@@ -1354,7 +1765,16 @@ doesn't match any of the regular expressions in
                      "default" "defer" "else" "fallthrough" "for"
                      "func" "go" "goto" "if" "import"
                      "interface" "map" "package" "range" "return"
                      "default" "defer" "else" "fallthrough" "for"
                      "func" "go" "goto" "if" "import"
                      "interface" "map" "package" "range" "return"
-                     "select" "struct" "switch" "type" "var")))
+                     "select" "struct" "switch" "type" "var"))
+       (go-intrinsics
+        (mdw-regexps "bool" "byte" "complex64" "complex128" "error"
+                     "float32" "float64" "int" "uint8" "int16" "int32"
+                     "int64" "rune" "string" "uint" "uint8" "uint16"
+                     "uint32" "uint64" "uintptr" "void"
+                     "false" "iota" "nil" "true"
+                     "init" "main"
+                     "append" "cap" "copy" "delete" "imag" "len" "make"
+                     "new" "panic" "real" "recover")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1362,6 +1782,26 @@ doesn't match any of the regular expressions in
           ;; Handle the keywords defined above.
           (list (concat "\\<\\(" go-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
           ;; Handle the keywords defined above.
           (list (concat "\\<\\(" go-keywords "\\)\\>")
                 '(0 font-lock-keyword-face))
+          (list (concat "\\<\\(" go-intrinsics "\\)\\>")
+                '(0 font-lock-variable-name-face))
+
+          ;; Strings and characters.
+          (list (concat "'"
+                        "\\(" "[^\\']" "\\|"
+                              "\\\\"
+                              "\\(" "[abfnrtv\\'\"]" "\\|"
+                                    "[0-7]\\{3\\}" "\\|"
+                                    "x" "[0-9A-Fa-f]\\{2\\}" "\\|"
+                                    "u" "[0-9A-Fa-f]\\{4\\}" "\\|"
+                                    "U" "[0-9A-Fa-f]\\{8\\}" "\\)" "\\)"
+                        "'"
+                        "\\|"
+                        "\""
+                        "\\(" "[^\n\\\"]+" "\\|" "\\\\." "\\)*"
+                        "\\(\"\\|$\\)"
+                        "\\|"
+                        "`" "[^`]+" "`")
+                '(0 font-lock-string-face))
 
           ;; Handle numbers too.
           ;;
 
           ;; Handle numbers too.
           ;;
@@ -1443,6 +1883,7 @@ doesn't match any of the regular expressions in
 
 ;; Perl indentation 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-indent-level 2)
 (setq cperl-continued-statement-offset 2)
 (setq cperl-continued-brace-offset 0)
@@ -1462,11 +1903,11 @@ doesn't match any of the regular expressions in
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
-        (mdw-regexps "and" "cmp" "continue" "do" "else" "elsif" "eq"
-                     "for" "foreach" "ge" "gt" "goto" "if"
+        (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"
                      "last" "le" "lt" "local" "my" "ne" "next" "or"
-                     "package" "redo" "require" "return" "sub"
-                     "undef" "unless" "until" "use" "while")))
+                     "our" "package" "redo" "require" "return" "sub"
+                     "undef" "unless" "until" "use" "when" "while")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
@@ -1509,6 +1950,7 @@ strip numbers instead."
 
   ;; Miscellaneous fiddling.
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; Miscellaneous fiddling.
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
+  (setq indent-tabs-mode nil)
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
@@ -1516,12 +1958,12 @@ strip numbers instead."
        (list
 
         ;; Set up the keywords defined above.
        (list
 
         ;; Set up the keywords defined above.
-        (list (concat "\\<\\(" keywords "\\)\\>")
+        (list (concat "\\_<\\(" keywords "\\)\\_>")
               '(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_]*\\|\\)"
+        (list (concat "\\_<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
+                      "\\_<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|[lL]\\|\\)")
               '(0 mdw-number-face))
 
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|[lL]\\|\\)")
               '(0 mdw-number-face))
 
@@ -1642,6 +2084,7 @@ strip numbers instead."
                       "<" arm-assembler-mode-syntax-table)
   (modify-syntax-entry ?\n ">" arm-assembler-mode-syntax-table)
   (modify-syntax-entry ?_ "_" arm-assembler-mode-syntax-table)
                       "<" 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-start)
   (setq comment-start ";")
@@ -1686,9 +2129,9 @@ 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))
+  (mdw-post-config-mode-hack)
   (run-hooks 'arm-assembler-mode-hook))
 
 ;;;--------------------------------------------------------------------------
   (run-hooks 'arm-assembler-mode-hook))
 
 ;;;--------------------------------------------------------------------------
@@ -1718,6 +2161,118 @@ strip numbers instead."
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
   (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
+;;; Dylan programming configuration.
+
+(defun mdw-fontify-dylan ()
+
+  (make-local-variable 'font-lock-keywords)
+
+  ;; Horrors.  `dylan-mode' sets the `major-mode' name after calling this
+  ;; hook, which undoes all of our configuration.
+  (setq major-mode 'dylan-mode)
+  (font-lock-set-defaults)
+
+  (let* ((word "[-_a-zA-Z!*@<>$%]+")
+        (dylan-keywords (mdw-regexps
+
+                         "C-address" "C-callable-wrapper" "C-function"
+                         "C-mapped-subtype" "C-pointer-type" "C-struct"
+                         "C-subtype" "C-union" "C-variable"
+
+                         "above" "abstract" "afterwards" "all"
+                         "begin" "below" "block" "by"
+                         "case" "class" "cleanup" "constant" "create"
+                         "define" "domain"
+                         "else" "elseif" "end" "exception" "export"
+                         "finally" "for" "from" "function"
+                         "generic"
+                         "handler"
+                         "if" "in" "instance" "interface" "iterate"
+                         "keyed-by"
+                         "let" "library" "local"
+                         "macro" "method" "module"
+                         "otherwise"
+                         "profiling"
+                         "select" "slot" "subclass"
+                         "table" "then" "to"
+                         "unless" "until" "use"
+                         "variable" "virtual"
+                         "when" "while"))
+        (sharp-keywords (mdw-regexps
+                         "all-keys" "key" "next" "rest" "include"
+                         "t" "f")))
+    (setq font-lock-keywords
+         (list (list (concat "\\<\\(" dylan-keywords
+                             "\\|" "with\\(out\\)?-" word
+                             "\\)\\>")
+                     '(0 font-lock-keyword-face))
+               (list (concat "\\<" word ":" "\\|"
+                             "#\\(" sharp-keywords "\\)\\>")
+                     '(0 font-lock-variable-name-face))
+               (list (concat "\\("
+                             "\\([-+]\\|\\<\\)[0-9]+" "\\("
+                               "\\(\\.[0-9]+\\)?" "\\([eE][-+][0-9]+\\)?"
+                               "\\|" "/[0-9]+"
+                             "\\)"
+                             "\\|" "\\.[0-9]+" "\\([eE][-+][0-9]+\\)?"
+                             "\\|" "#b[01]+"
+                             "\\|" "#o[0-7]+"
+                             "\\|" "#x[0-9a-zA-Z]+"
+                             "\\)\\>")
+                     '(0 mdw-number-face))
+               (list (concat "\\("
+                             "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\|"
+                             "\\_<[-+*/=<>:&|]+\\_>"
+                             "\\)")
+                     '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
+;;; Algol 68 configuration.
+
+(setq a68-indent-step 2)
+
+(defun mdw-fontify-algol-68 ()
+
+  ;; Fix up the syntax table.
+  (modify-syntax-entry ?# "!" a68-mode-syntax-table)
+  (dolist (ch '(?- ?+ ?= ?< ?> ?* ?/ ?| ?&))
+    (modify-syntax-entry ch "." a68-mode-syntax-table))
+
+  (make-local-variable 'font-lock-keywords)
+
+  (let ((not-comment
+        (let ((word "COMMENT"))
+          (do ((regexp (concat "[^" (substring word 0 1) "]+")
+                       (concat regexp "\\|"
+                               (substring word 0 i)
+                               "[^" (substring word i (1+ i)) "]"))
+               (i 1 (1+ i)))
+              ((>= i (length word)) regexp)))))
+    (setq font-lock-keywords
+         (list (list (concat "\\<COMMENT\\>"
+                             "\\(" not-comment "\\)\\{0,5\\}"
+                             "\\(\\'\\|\\<COMMENT\\>\\)")
+                     '(0 font-lock-comment-face))
+               (list (concat "\\<CO\\>"
+                             "\\([^C]+\\|C[^O]\\)\\{0,5\\}"
+                             "\\($\\|\\<CO\\>\\)")
+                     '(0 font-lock-comment-face))
+               (list "\\<[A-Z_]+\\>"
+                     '(0 font-lock-keyword-face))
+               (list (concat "\\<"
+                             "[0-9]+"
+                             "\\(\\.[0-9]+\\)?"
+                             "\\([eE][-+]?[0-9]+\\)?"
+                             "\\>")
+                     '(0 mdw-number-face))
+               (list "\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/"
+                     '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
 ;;; REXX configuration.
 
 (defun mdw-rexx-electric-* ()
 ;;; REXX configuration.
 
 (defun mdw-rexx-electric-* ()
@@ -1850,32 +2405,73 @@ strip numbers instead."
 (defun mdw-fontify-haskell ()
 
   ;; Fiddle with syntax table to get comments right.
 (defun mdw-fontify-haskell ()
 
   ;; Fiddle with syntax table to get comments right.
-  (modify-syntax-entry ?' "\"")
-  (modify-syntax-entry ?- ". 123")
-  (modify-syntax-entry ?{ ". 1b")
-  (modify-syntax-entry ?} ". 4b")
+  (modify-syntax-entry ?' "_")
+  (modify-syntax-entry ?- ". 12")
   (modify-syntax-entry ?\n ">")
 
   (modify-syntax-entry ?\n ">")
 
+  ;; Make punctuation be punctuation
+  (let ((punct "=<>+-*/|&%!@?$.^:#`"))
+    (do ((i 0 (1+ i)))
+       ((>= i (length punct)))
+      (modify-syntax-entry (aref punct i) ".")))
+
   ;; Set fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*{?--?[ \t]*\\)")
 
   ;; Fiddle with fontification.
   (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
   ;; Set fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*{?--?[ \t]*\\)")
 
   ;; Fiddle with fontification.
   (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
-        (mdw-regexps "as" "case" "ccall" "class" "data" "default"
-                     "deriving" "do" "else" "foreign" "hiding" "if"
-                     "import" "in" "infix" "infixl" "infixr" "instance"
-                     "let" "module" "newtype" "of" "qualified" "safe"
-                     "stdcall" "then" "type" "unsafe" "where")))
+        (mdw-regexps "as"
+                     "case" "ccall" "class"
+                     "data" "default" "deriving" "do"
+                     "else" "exists"
+                     "forall" "foreign"
+                     "hiding"
+                     "if" "import" "in" "infix" "infixl" "infixr" "instance"
+                     "let"
+                     "mdo" "module"
+                     "newtype"
+                     "of"
+                     "proc"
+                     "qualified"
+                     "rec"
+                     "safe" "stdcall"
+                     "then" "type"
+                     "unsafe"
+                     "where"))
+       (control-sequences
+        (mdw-regexps "ACK" "BEL" "BS" "CAN" "CR" "DC1" "DC2" "DC3" "DC4"
+                     "DEL" "DLE" "EM" "ENQ" "EOT" "ESC" "ETB" "ETX" "FF"
+                     "FS" "GS" "HT" "LF" "NAK" "NUL" "RS" "SI" "SO" "SOH"
+                     "SP" "STX" "SUB" "SYN" "US" "VT")))
 
     (setq font-lock-keywords
          (list
 
     (setq font-lock-keywords
          (list
-          (list "--.*$"
+          (list (concat "{-" "[^-]*" "\\(-+[^-}][^-]*\\)*"
+                             "\\(-+}\\|-*\\'\\)"
+                        "\\|"
+                        "--.*$")
                 '(0 font-lock-comment-face))
                 '(0 font-lock-comment-face))
-          (list (concat "\\<\\(" haskell-keywords "\\)\\>")
+          (list (concat "\\_<\\(" haskell-keywords "\\)\\_>")
                 '(0 font-lock-keyword-face))
                 '(0 font-lock-keyword-face))
-          (list (concat "\\<0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
-                        "\\<[0-9][0-9_]*\\(\\.[0-9]*\\|\\)"
+          (list (concat "'\\("
+                        "[^\\]"
+                        "\\|"
+                        "\\\\"
+                        "\\(" "[abfnrtv\\\"']" "\\|"
+                              "^" "\\(" control-sequences "\\|"
+                                        "[]A-Z@[\\^_]" "\\)" "\\|"
+                              "\\|"
+                              "[0-9]+" "\\|"
+                              "[oO][0-7]+" "\\|"
+                              "[xX][0-9A-Fa-f]+"
+                        "\\)"
+                        "\\)'")
+                '(0 font-lock-string-face))
+          (list "\\_<[A-Z]\\(\\sw+\\|\\s_+\\)*\\_>"
+                '(0 font-lock-variable-name-face))
+          (list (concat "\\_<0\\([xX][0-9a-fA-F]+\\|[oO][0-7]+\\)\\|"
+                        "\\_<[0-9]+\\(\\.[0-9]*\\|\\)"
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                         "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)")
                 '(0 mdw-number-face))
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
@@ -1886,8 +2482,7 @@ strip numbers instead."
 ;;;--------------------------------------------------------------------------
 ;;; Erlang configuration.
 
 ;;;--------------------------------------------------------------------------
 ;;; Erlang configuration.
 
-(setq erlang-electric-commannds
-      '(erlang-electric-newline erlang-electric-semicolon))
+(setq erlang-electric-commands nil)
 
 (defun mdw-fontify-erlang ()
 
 
 (defun mdw-fontify-erlang ()
 
@@ -2030,7 +2625,7 @@ strip numbers instead."
   (interactive)
   (sgml-mode)
   (mdw-standard-fill-prefix "")
   (interactive)
   (sgml-mode)
   (mdw-standard-fill-prefix "")
-  (make-variable-buffer-local 'sgml-delimiters)
+  (make-local-variable 'sgml-delimiters)
   (setq sgml-delimiters
        '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
          "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
   (setq sgml-delimiters
        '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
          "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
@@ -2045,6 +2640,48 @@ strip numbers instead."
   (run-hooks 'mdw-sgml-mode-hook))
 
 ;;;--------------------------------------------------------------------------
   (run-hooks 'mdw-sgml-mode-hook))
 
 ;;;--------------------------------------------------------------------------
+;;; Configuration files.
+
+(defvar mdw-conf-quote-normal nil
+  "*Control syntax category of quote characters `\"' and `''.
+If this is `t', consider quote characters to be normal
+punctuation, as for `conf-quote-normal'.  If this is `nil' then
+leave quote characters as quotes.  If this is a list, then
+consider the quote characters in the list to be normal
+punctuation.  If this is a single quote character, then consider
+that character only to be normal punctuation.")
+(defun mdw-conf-quote-normal-acceptable-value-p (value)
+  "Is the VALUE is an acceptable value for `mdw-conf-quote-normal'?"
+  (or (booleanp value)
+      (every (lambda (v) (memq v '(?\" ?')))
+            (if (listp value) value (list value)))))
+(put 'mdw-conf-quote-normal 'safe-local-variable '
+     mdw-conf-quote-normal-acceptable-value-p)
+
+(defun mdw-fix-up-quote ()
+  "Apply the setting of `mdw-conf-quote-normal'."
+  (let ((flag mdw-conf-quote-normal))
+    (cond ((eq flag t)
+          (conf-quote-normal t))
+         ((not flag)
+          nil)
+         (t
+          (let ((table (copy-syntax-table (syntax-table))))
+            (mapc (lambda (ch) (modify-syntax-entry ch "." table))
+                  (if (listp flag) flag (list flag)))
+            (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)
+
+;;;--------------------------------------------------------------------------
 ;;; Shell scripts.
 
 (defun mdw-setup-sh-script-mode ()
 ;;; Shell scripts.
 
 (defun mdw-setup-sh-script-mode ()
@@ -2071,6 +2708,44 @@ strip numbers instead."
   (setq sh-indentation 2)
   (setq sh-basic-offset 2))
 
   (setq sh-indentation 2)
   (setq sh-basic-offset 2))
 
+(setq sh-shell-file "/bin/sh")
+
+;; Awful hacking to override the shell detection for particular scripts.
+(defmacro define-custom-shell-mode (name shell)
+  `(defun ,name ()
+     (interactive)
+     (set (make-local-variable 'sh-shell-file) ,shell)
+     (sh-mode)))
+(define-custom-shell-mode bash-mode "/bin/bash")
+(define-custom-shell-mode rc-mode "/usr/bin/rc")
+(put 'sh-shell-file 'permanent-local t)
+
+;; Hack the rc syntax table.  Backquotes aren't paired in rc.
+(eval-after-load "sh-script"
+  '(or (assq 'rc sh-mode-syntax-table-input)
+       (let ((frag '(nil
+                    ?# "<"
+                    ?\n ">#"
+                    ?\" "\"\""
+                    ?\' "\"\'"
+                    ?$ "'"
+                    ?\` "."
+                    ?! "_"
+                    ?% "_"
+                    ?. "_"
+                    ?^ "_"
+                    ?~ "_"
+                    ?, "_"
+                    ?= "."
+                    ?< "."
+                    ?> "."))
+            (assoc (assq 'rc sh-mode-syntax-table-input)))
+        (if assoc
+            (rplacd assoc frag)
+          (setq sh-mode-syntax-table-input
+                (cons (cons 'rc frag)
+                      sh-mode-syntax-table-input))))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Emacs shell mode.
 
 ;;;--------------------------------------------------------------------------
 ;;; Emacs shell mode.
 
@@ -2082,13 +2757,21 @@ strip numbers instead."
            (save-match-data
              (replace-regexp-in-string "\\..*$" "" (system-name)))
            " "
            (save-match-data
              (replace-regexp-in-string "\\..*$" "" (system-name)))
            " "
-           (eshell/pwd)
+           (let* ((pwd (eshell/pwd)) (npwd (length pwd))
+                  (home (expand-file-name "~")) (nhome (length home)))
+             (if (and (>= npwd nhome)
+                      (or (= nhome npwd)
+                          (= (elt pwd nhome) ?/))
+                      (string= (substring pwd 0 nhome) home))
+                 (concat "~" (substring pwd (length home)))
+               pwd))
            right)))
 (setq eshell-prompt-function 'mdw-eshell-prompt)
            right)))
 (setq eshell-prompt-function 'mdw-eshell-prompt)
-(setq eshell-prompt-regexp "^\\[[^]]+\\]")
+(setq eshell-prompt-regexp "^\\[[^]>]+\\(\\]\\|>>?\\)")
 
 
-(defalias 'eshell/e 'find-file)
-(defalias 'eshell/w3m 'w3m-goto-url)
+(defun eshell/e (file) (find-file file) nil)
+(defun eshell/ee (file) (find-file-other-window file) nil)
+(defun eshell/w3m (url) (w3m-goto-url url) nil)
 
 (mdw-define-face eshell-prompt (t :weight bold))
 (mdw-define-face eshell-ls-archive (t :weight bold :foreground "red"))
 
 (mdw-define-face eshell-prompt (t :weight bold))
 (mdw-define-face eshell-ls-archive (t :weight bold :foreground "red"))
@@ -2155,7 +2838,6 @@ strip numbers instead."
   (modify-syntax-entry ?\n ">" messages-mode-syntax-table)
   (setq comment-start "# ")
   (setq comment-end "")
   (modify-syntax-entry ?\n ">" messages-mode-syntax-table)
   (setq comment-start "# ")
   (setq comment-end "")
-  (turn-on-font-lock-if-enabled)
   (run-hooks 'messages-mode-hook))
 
 (defun cpp-messages-mode ()
   (run-hooks 'messages-mode-hook))
 
 (defun cpp-messages-mode ()
@@ -2182,7 +2864,6 @@ strip numbers instead."
                                      "\\)\\>\\|[0-9]+\\|$\\)\\)")
                              '(1 font-lock-keyword-face)))
                  messages-mode-keywords)))
                                      "\\)\\>\\|[0-9]+\\|$\\)\\)")
                              '(1 font-lock-keyword-face)))
                  messages-mode-keywords)))
-  (turn-on-font-lock-if-enabled)
   (run-hooks 'cpp-messages-mode-hook))
 
 (add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
   (run-hooks 'cpp-messages-mode-hook))
 
 (add-hook 'messages-mode-hook 'mdw-misc-mode-config t)
@@ -2233,7 +2914,6 @@ strip numbers instead."
   (modify-syntax-entry ?\n ">" mallow-driver-mode-syntax-table)
   (setq comment-start "%# ")
   (setq comment-end "")
   (modify-syntax-entry ?\n ">" mallow-driver-mode-syntax-table)
   (setq comment-start "%# ")
   (setq comment-end "")
-  (turn-on-font-lock-if-enabled)
   (run-hooks 'mallow-driver-mode-hook))
 
 (add-hook 'mallow-driver-hook 'mdw-misc-mode-config t)
   (run-hooks 'mallow-driver-mode-hook))
 
 (add-hook 'mallow-driver-hook 'mdw-misc-mode-config t)
@@ -2276,7 +2956,6 @@ strip numbers instead."
         '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" (0 mdw-punct-face))))
   (setq font-lock-defaults
        '(nfast-debug-mode-keywords nil nil nil nil))
         '("\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" (0 mdw-punct-face))))
   (setq font-lock-defaults
        '(nfast-debug-mode-keywords nil nil nil nil))
-  (turn-on-font-lock-if-enabled)
   (run-hooks 'nfast-debug-mode-hook))
 
 ;;;--------------------------------------------------------------------------
   (run-hooks 'nfast-debug-mode-hook))
 
 ;;;--------------------------------------------------------------------------
@@ -2287,7 +2966,7 @@ strip numbers instead."
 (defun mdw-setup-smalltalk ()
   (and mdw-auto-indent
        (local-set-key "\C-m" 'smalltalk-newline-and-indent))
 (defun mdw-setup-smalltalk ()
   (and mdw-auto-indent
        (local-set-key "\C-m" 'smalltalk-newline-and-indent))
-  (make-variable-buffer-local 'mdw-auto-indent)
+  (make-local-variable 'mdw-auto-indent)
   (setq mdw-auto-indent nil)
   (local-set-key "\C-i" 'smalltalk-reindent))
 
   (setq mdw-auto-indent nil)
   (local-set-key "\C-i" 'smalltalk-reindent))
 
@@ -2326,7 +3005,7 @@ strip numbers instead."
        (multiple-value-bind . ((&whole 4 &rest 1) 4 &body))))))
 
 (defun mdw-common-lisp-indent ()
        (multiple-value-bind . ((&whole 4 &rest 1) 4 &body))))))
 
 (defun mdw-common-lisp-indent ()
-  (make-variable-buffer-local 'lisp-indent-function)
+  (make-local-variable 'lisp-indent-function)
   (setq lisp-indent-function 'common-lisp-indent-function))
 
 (setq lisp-simple-loop-indentation 2
   (setq lisp-indent-function 'common-lisp-indent-function))
 
 (setq lisp-simple-loop-indentation 2
@@ -2341,9 +3020,26 @@ strip numbers instead."
   ;; Not much fontification needed.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
   ;; Not much fontification needed.
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
-       (list
-        (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face))))
+       (list (list (concat "\\("
+                           "\\_<[-+]?"
+                           "\\(" "[0-9]+/[0-9]+"
+                           "\\|" "\\(" "[0-9]+" "\\(\\.[0-9]*\\)?" "\\|"
+                                       "\\.[0-9]+" "\\)"
+                                 "\\([dDeEfFlLsS][-+]?[0-9]+\\)?"
+                           "\\)"
+                           "\\|"
+                           "#"
+                           "\\(" "x" "[-+]?"
+                                 "[0-9A-Fa-f]+" "\\(/[0-9A-Fa-f]+\\)?"
+                           "\\|" "o" "[-+]?" "[0-7]+" "\\(/[0-7]+\\)?"
+                           "\\|" "b" "[-+]?" "[01]+" "\\(/[01]+\\)?"
+                           "\\|" "[0-9]+" "r" "[-+]?"
+                                 "[0-9a-zA-Z]+" "\\(/[0-9a-zA-Z]+\\)?"
+                           "\\)"
+                           "\\)\\_>")
+                   '(0 mdw-number-face))
+             (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                   '(0 mdw-punct-face))))
 
   (mdw-post-config-mode-hack))
 
 
   (mdw-post-config-mode-hack))
 
@@ -2354,6 +3050,13 @@ strip numbers instead."
        (indent-for-tab-command)))
 
 (defun mdw-setup-m4 ()
        (indent-for-tab-command)))
 
 (defun mdw-setup-m4 ()
+
+  ;; Inexplicably, Emacs doesn't match braces in m4 mode.  This is very
+  ;; annoying: fix it.
+  (modify-syntax-entry ?{ "(")
+  (modify-syntax-entry ?} ")")
+
+  ;; Fill prefix.
   (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
 
 ;;;--------------------------------------------------------------------------
   (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
 
 ;;;--------------------------------------------------------------------------
@@ -2416,6 +3119,20 @@ strip numbers instead."
      (define-key term-raw-map [M-left] 'term-send-meta-left)
      (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left)))
 
      (define-key term-raw-map [M-left] 'term-send-meta-left)
      (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left)))
 
+(defadvice term-exec (before program-args-list compile activate)
+  "If the PROGRAM argument is a list, interpret it as (PROGRAM . SWITCHES).
+This allows you to pass a list of arguments through `ansi-term'."
+  (let ((program (ad-get-arg 2)))
+    (if (listp program)
+       (progn
+         (ad-set-arg 2 (car program))
+         (ad-set-arg 4 (cdr program))))))
+
+(defun ssh (host)
+  "Open a terminal containing an ssh session to the HOST."
+  (interactive "sHost: ")
+  (ansi-term (list "ssh" host) (format "ssh@%s" host)))
+
 ;;;--------------------------------------------------------------------------
 ;;; Inferior Emacs Lisp.
 
 ;;;--------------------------------------------------------------------------
 ;;; Inferior Emacs Lisp.