el/dot-emacs.el: Front-end function for turning on `whitespace-mode'.
[profile] / el / dot-emacs.el
index 1322789..797c7dc 100644 (file)
@@ -48,6 +48,8 @@ This may be at the expense of cool features.")
 
 (defmacro mdw-regexps (&rest list)
   "Turn a LIST of strings into a single regular expression at compile-time."
+  (declare (indent nil)
+          (debug 0))
   `',(make-regexp list))
 
 ;; Some error trapping.
@@ -57,6 +59,8 @@ This may be at the expense of cool features.")
 
 (defmacro trap (&rest forms)
   "Execute FORMS without allowing errors to propagate outside."
+  (declare (indent 0)
+          (debug t))
   `(condition-case err
        ,(if (cdr forms) (cons 'progn forms) (car forms))
      (error (message "Error (trapped): %s in %s"
@@ -229,7 +233,7 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'."
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
-(eval-after-load "org"
+(eval-after-load "org-latex"
   '(progn
      (push '("strayman"
             "\\documentclass{strayman}
@@ -345,7 +349,6 @@ probably become garbage."
                          (car alists)
                          (cdr alists)))))
 
-
 (defun mdw-do-uniquify (done end l rest)
   "A helper function for mdw-uniquify-alist.
 The DONE argument is a list whose first element is `nil'.  It
@@ -501,6 +504,42 @@ CHECK is fboundp, and returning the correponding FUNC."
          (setq answer func)))
     answer))
 
+(eval-after-load "w3m-search"
+  '(progn
+     (dolist
+        (item
+         '(("g" "Google" "http://www.google.co.uk/search?q=%s")
+           ("gd" "Google Directory"
+            "http://www.google.com/search?cat=gwd/Top&q=%s")
+           ("gg" "Google Groups" "http://groups.google.com/groups?q=%s")
+           ("ward" "Ward's wiki" "http://c2.com/cgi/wiki?%s")
+           ("gi" "Images" "http://images.google.com/images?q=%s")
+           ("rfc" "RFC"
+            "http://metalzone.distorted.org.uk/ftp/pub/mirrors/rfc/rfc%s.txt.gz")
+           ("wp" "Wikipedia"
+            "http://en.wikipedia.org/wiki/Special:Search?go=Go&search=%s")
+           ("imdb" "IMDb" "http://www.imdb.com/Find?%s")
+           ("nc-wiki" "nCipher wiki"
+            "http://wiki.ncipher.com/wiki/bin/view/Devel/?topic=%s")
+           ("map" "Google maps" "http://maps.google.co.uk/maps?q=%s&hl=en")
+           ("lp" "Launchpad bug by number"
+            "https://bugs.launchpad.net/bugs/%s")
+           ("lppkg" "Launchpad bugs by package"
+            "https://bugs.launchpad.net/%s")
+           ("msdn" "MSDN"
+            "http://social.msdn.microsoft.com/Search/en-GB/?query=%s&ac=8")
+           ("debbug" "Debian bug by number"
+            "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%s")
+           ("debbugpkg" "Debian bugs by package"
+            "http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=%s")
+           ("ljlogin" "LJ login" "http://www.livejournal.com/login.bml")))
+       (add-to-list 'w3m-search-engine-alist
+                   (list (cadr item) (caddr item) nil))
+       (add-to-list 'w3m-uri-replace-alist
+                   (list (concat "\\`" (car item) ":")
+                         'w3m-search-uri-replace
+                         (cadr item))))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Paragraph filling.
 
@@ -626,6 +665,14 @@ case."
 (defvar mdw-auto-indent t
   "Whether to indent automatically after a newline.")
 
+(defun mdw-whitespace-mode (&optional arg)
+  "Turn on/off whitespace mode, but don't highlight trailing space."
+  (interactive "P")
+  (when (and (boundp 'whitespace-style)
+            (fboundp 'whitespace-mode))
+    (let ((whitespace-style (remove 'trailing whitespace-style)))
+      (whitespace-mode arg))))
+
 (defun mdw-misc-mode-config ()
   (and mdw-auto-indent
        (cond ((eq major-mode 'lisp-mode)
@@ -642,23 +689,26 @@ case."
   (auto-fill-mode 1)
   (setq fill-column 77)
   (setq show-trailing-whitespace t)
+  (mdw-whitespace-mode 1)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (outline-minor-mode t)
-  (mdw-set-font))
+  (hs-minor-mode t)
+  (reveal-mode t)
+  (trap (turn-on-font-lock)))
 
-(eval-after-load 'gtags
-  '(dolist (key '([mouse-2] [mouse-3]))
-     (define-key gtags-mode-map key nil)))
-
-;; Set up all sorts of faces.
-
-(defvar mdw-set-font nil)
+(defun mdw-post-config-mode-hack ()
+  (mdw-whitespace-mode 1))
 
-(defvar mdw-punct-face 'mdw-punct-face "Face to use for punctuation")
-(make-face 'mdw-punct-face)
-(defvar mdw-number-face 'mdw-number-face "Face to use for numbers")
-(make-face 'mdw-number-face)
+(eval-after-load 'gtags
+  '(progn
+     (dolist (key '([mouse-2] [mouse-3]))
+       (define-key gtags-mode-map key nil))
+     (define-key gtags-mode-map [C-S-mouse-2] 'gtags-find-tag-by-event)
+     (define-key gtags-select-mode-map [C-S-mouse-2]
+       'gtags-select-tag-by-event)
+     (dolist (map (list gtags-mode-map gtags-select-mode-map))
+       (define-key map [C-S-mouse-3] 'gtags-pop-stack))))
 
 ;; Backup file handling.
 
@@ -681,130 +731,203 @@ doesn't match any of the regular expressions in
           answer))))
 (setq backup-enable-predicate 'mdw-backup-enable-predicate)
 
+;; Frame cleanup.
+
+(defun mdw-last-one-out-turn-off-the-lights (frame)
+  "Disconnect from an X display if this was the last frame on that display."
+  (let ((frame-display (frame-parameter frame 'display)))
+    (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)
+                                         frame-display)
+                                (progn "frame %s still uses us" nil)))
+                         (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.
 
-(defun mdw-set-fonts (frame faces)
-  (while faces
-    (let ((face (caar faces)))
-      (or (facep face) (make-face face))
-      (set-face-attribute face frame
-                         :family 'unspecified
-                         :width 'unspecified
-                         :height 'unspecified
-                         :weight 'unspecified
-                         :slant 'unspecified
-                         :foreground 'unspecified
-                         :background 'unspecified
-                         :underline 'unspecified
-                         :overline 'unspecified
-                         :strike-through 'unspecified
-                         :box 'unspecified
-                         :inverse-video 'unspecified
-                         :stipple 'unspecified
-                         ;:font 'unspecified
-                         :inherit 'unspecified)
-      (apply 'set-face-attribute face frame (cdar faces))
-      (setq faces (cdr faces)))))
-
-(defun mdw-do-set-font (&optional frame)
-  (interactive)
-  (mdw-set-fonts (and (boundp 'frame) frame)  `(
-    (default :foreground "white" :background "black"
-      ,@(cond ((eq window-system 'w32)
-              '(:family "courier new" :height 85))
-             ((eq window-system 'x)
-              '(:family "misc-fixed" :height 130 :width semi-condensed))))
-    (fixed-pitch)
-    (minibuffer-prompt)
-    (mode-line :foreground "blue" :background "yellow"
-              :box (:line-width 1 :style released-button))
-    (mode-line-inactive :foreground "yellow" :background "blue"
-                       :box (:line-width 1 :style released-button))
-    (scroll-bar :foreground "black" :background "lightgrey")
-    (fringe :foreground "yellow" :background "black")
-    (show-paren-match-face :background "darkgreen")
-    (show-paren-mismatch-face :background "red")
-    (font-lock-warning-face :background "red" :weight bold)
-    (highlight :background "DarkSeaGreen4")
-    (holiday-face :background "red")
-    (calendar-today-face :foreground "yellow" :weight bold)
-    (comint-highlight-prompt :weight bold)
-    (comint-highlight-input)
-    (font-lock-builtin-face :weight bold)
-    (font-lock-type-face :weight bold)
-    (region :background ,(if window-system "grey30" "blue"))
-    (isearch :background "palevioletred2")
-    (mdw-punct-face :foreground ,(if window-system "burlywood2" "yellow"))
-    (mdw-number-face :foreground "yellow")
-    (font-lock-function-name-face :weight bold)
-    (font-lock-variable-name-face :slant italic)
-    (font-lock-comment-delimiter-face
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :slant italic)
-    (font-lock-comment-face
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :slant italic)
-    (font-lock-string-face :foreground ,(if window-system "SkyBlue1" "cyan"))
-    (font-lock-keyword-face :weight bold)
-    (font-lock-constant-face :weight bold)
-    (font-lock-reference-face :weight bold)
-    (message-cited-text
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :slant italic)
-    (message-separator :background "red" :foreground "white" :weight bold)
-    (message-header-cc
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-newsgroups
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-subject
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-to
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-xheader
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-other
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-name
-       :foreground ,(if window-system "SeaGreen1" "green"))
-    (woman-bold :weight bold)
-    (woman-italic :slant italic)
-    (p4-depot-added-face :foreground "green")
-    (p4-depot-branch-op-face :foreground "yellow")
-    (p4-depot-deleted-face :foreground "red")
-    (p4-depot-unmapped-face
-       :foreground ,(if window-system "SkyBlue1" "cyan"))
-    (p4-diff-change-face :foreground "yellow")
-    (p4-diff-del-face :foreground "red")
-    (p4-diff-file-face :foreground "SkyBlue1")
-    (p4-diff-head-face :background "grey10")
-    (p4-diff-ins-face :foreground "green")
-    (diff-index :weight bold)
-    (diff-file-header :weight bold)
-    (diff-hunk-header :foreground "SkyBlue1")
-    (diff-function :foreground "SkyBlue1" :weight bold)
-    (diff-header :background "grey10")
-    (diff-added :foreground "green")
-    (diff-removed :foreground "red")
-    (diff-context)
-    (whizzy-slice-face :background "grey10")
-    (whizzy-error-face :background "darkred")
-    (trailing-whitespace :background "red")
-)))
-
-(defun mdw-set-font ()
-  (trap
-    (turn-on-font-lock)
-    (if (not mdw-set-font)
-       (progn
-         (setq mdw-set-font t)
-         (mdw-do-set-font nil)))))
+(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)
+     (defvar ,name ',name)
+     (put ',name 'face-defface-spec ',body)
+     (face-spec-set ',name ',body nil)))
+
+(mdw-define-face default
+  (((type w32)) :family "courier new" :height 85)
+  (((type x)) :family "6x13" :height 130)
+  (((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)
+  (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)))
+(mdw-define-face region
+  (((type tty) (class color)) :background "blue")
+  (((type tty) (class mono)) :inverse-video t)
+  (t :background "grey30"))
+(mdw-define-face minibuffer-prompt
+  (t :weight bold))
+(mdw-define-face mode-line
+  (((class color)) :foreground "blue" :background "yellow"
+                  :box (:line-width 1 :style released-button))
+  (t :inverse-video t))
+(mdw-define-face mode-line-inactive
+  (((class color)) :foreground "yellow" :background "blue"
+                  :box (:line-width 1 :style released-button))
+  (t :inverse-video t))
+(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")
+  (t :underline t))
+(mdw-define-face show-paren-mismatch
+  (((class color)) :background "red")
+  (t :inverse-video t))
+(mdw-define-face highlight
+  (((class color)) :background "DarkSeaGreen4")
+  (t :inverse-video t))
+
+(mdw-define-face holiday-face
+  (t :background "red"))
+(mdw-define-face calendar-today-face
+  (t :foreground "yellow" :weight bold))
+
+(mdw-define-face comint-highlight-prompt
+  (t :weight bold))
+(mdw-define-face comint-highlight-input)
+
+(mdw-define-face trailing-whitespace
+  (((class color)) :background "red")
+  (t :inverse-video t))
+(mdw-define-face mdw-punct-face
+  (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+(mdw-define-face mdw-number-face
+  (t :foreground "yellow"))
+(mdw-define-face font-lock-function-name-face
+  (t :slant italic))
+(mdw-define-face font-lock-keyword-face
+  (t :weight bold))
+(mdw-define-face font-lock-constant-face
+  (t :slant italic))
+(mdw-define-face font-lock-builtin-face
+  (t :weight bold))
+(mdw-define-face font-lock-type-face
+  (t :weight bold :slant italic))
+(mdw-define-face font-lock-reference-face
+  (t :weight bold))
+(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"))
+(mdw-define-face font-lock-comment-face
+  (((class mono)) :weight bold)
+  (((type tty) (class color)) :foreground "green")
+  (t :slant italic :foreground "SeaGreen1"))
+(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
+  (default :slant italic)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-cc
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-newsgroups
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-subject
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-to
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-xheader
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-other
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-name
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+
+(mdw-define-face diff-index
+  (t :weight bold))
+(mdw-define-face diff-file-header
+  (t :weight bold))
+(mdw-define-face diff-hunk-header
+  (t :foreground "SkyBlue1"))
+(mdw-define-face diff-function
+  (t :foreground "SkyBlue1" :weight bold))
+(mdw-define-face diff-header
+  (t :background "grey10"))
+(mdw-define-face diff-added
+  (t :foreground "green"))
+(mdw-define-face diff-removed
+  (t :foreground "red"))
+(mdw-define-face diff-context)
+
+(mdw-define-face erc-input-face
+  (t :foreground "red"))
+
+(mdw-define-face woman-bold
+  (t :weight bold))
+(mdw-define-face woman-italic
+  (t :slant italic))
+
+(mdw-define-face p4-depot-added-face
+  (t :foreground "green"))
+(mdw-define-face p4-depot-branch-op-face
+  (t :foreground "yellow"))
+(mdw-define-face p4-depot-deleted-face
+  (t :foreground "red"))
+(mdw-define-face p4-depot-unmapped-face
+  (t :foreground "SkyBlue1"))
+(mdw-define-face p4-diff-change-face
+  (t :foreground "yellow"))
+(mdw-define-face p4-diff-del-face
+  (t :foreground "red"))
+(mdw-define-face p4-diff-file-face
+  (t :foreground "SkyBlue1"))
+(mdw-define-face p4-diff-head-face
+  (t :background "grey10"))
+(mdw-define-face p4-diff-ins-face
+  (t :foreground "green"))
+
+(mdw-define-face whizzy-slice-face
+  (t :background "grey10"))
+(mdw-define-face whizzy-error-face
+  (t :background "darkred"))
 
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
@@ -860,6 +983,15 @@ doesn't match any of the regular expressions in
                  (statement-case-intro . +)))
               t))
 
+(defvar mdw-c-comment-fill-prefix
+  `((,(concat "\\([ \t]*/?\\)"
+             "\\(\*\\|//]\\)"
+             "\\([ \t]*\\)"
+             "\\([A-Za-z]+:[ \t]*\\)?"
+             mdw-hanging-indents)
+     (pad . 1) (match . 2) (pad . 3) (pad . 4) (pad . 5)))
+  "Fill prefix matching C comments (both kinds).")
+
 (defun mdw-fontify-c-and-c++ ()
 
   ;; Fiddle with some syntax codes.
@@ -872,12 +1004,7 @@ doesn't match any of the regular expressions in
   (setq c-hanging-comment-ender-p nil)
   (setq c-backslash-column 72)
   (setq c-label-minimum-indentation 0)
-  (setq mdw-fill-prefix
-       `((,(concat "\\([ \t]*/?\\)"
-                   "\\([\*/][ \t]*\\)"
-                   "\\([A-Za-z]+:[ \t]*\\)?"
-                   mdw-hanging-indents)
-          (pad . 1) (match . 2) (pad . 3) (pad . 4))))
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
@@ -1022,7 +1149,9 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face))))
+
+    (mdw-post-config-mode-hack)))
 
 ;;;--------------------------------------------------------------------------
 ;;; AP calc mode.
@@ -1046,12 +1175,7 @@ doesn't match any of the regular expressions in
   (setq c-backslash-column 72)
   (setq comment-start "/* ")
   (setq comment-end " */")
-  (setq mdw-fill-prefix
-       `((,(concat "\\([ \t]*/?\\)"
-                   "\\([\*/][ \t]*\\)"
-                   "\\([A-Za-z]+:[ \t]*\\)?"
-                   mdw-hanging-indents)
-          (pad . 1) (match . 2) (pad . 3) (pad . 4))))
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
@@ -1079,7 +1203,9 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; Java programming configuration.
@@ -1105,14 +1231,7 @@ doesn't match any of the regular expressions in
   (mdw-java-style)
   (setq c-hanging-comment-ender-p nil)
   (setq c-backslash-column 72)
-  (setq comment-start "/* ")
-  (setq comment-end " */")
-  (setq mdw-fill-prefix
-       `((,(concat "\\([ \t]*/?\\)"
-                   "\\([\*/][ \t]*\\)"
-                   "\\([A-Za-z]+:[ \t]*\\)?"
-                   mdw-hanging-indents)
-          (pad . 1) (match . 2) (pad . 3) (pad . 4))))
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
@@ -1148,7 +1267,9 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; C# programming configuration.
@@ -1174,14 +1295,7 @@ doesn't match any of the regular expressions in
   (mdw-csharp-style)
   (setq c-hanging-comment-ender-p nil)
   (setq c-backslash-column 72)
-  (setq comment-start "/* ")
-  (setq comment-end " */")
-  (setq mdw-fill-prefix
-       `((,(concat "\\([ \t]*/?\\)"
-                   "\\([\*/][ \t]*\\)"
-                   "\\([A-Za-z]+:[ \t]*\\)?"
-                   mdw-hanging-indents)
-          (pad . 1) (match . 2) (pad . 3) (pad . 4))))
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
@@ -1222,12 +1336,49 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 (define-derived-mode csharp-mode java-mode "C#"
   "Major mode for editing C# code.")
 
 ;;;--------------------------------------------------------------------------
+;;; Go programming configuration.
+
+(defun mdw-fontify-go ()
+
+  (make-local-variable 'font-lock-keywords)
+  (let ((go-keywords
+        (mdw-regexps "break" "case" "chan" "const" "continue"
+                     "default" "defer" "else" "fallthrough" "for"
+                     "func" "go" "goto" "if" "import"
+                     "interface" "map" "package" "range" "return"
+                     "select" "struct" "switch" "type" "var")))
+
+    (setq font-lock-keywords
+         (list
+
+          ;; Handle the keywords defined above.
+          (list (concat "\\<\\(" go-keywords "\\)\\>")
+                '(0 font-lock-keyword-face))
+
+          ;; Handle numbers too.
+          ;;
+          ;; The following isn't quite right, but it's close enough.
+          (list (concat "\\<\\("
+                        "0\\([xX][0-9a-fA-F]+\\|[0-7]+\\)\\|"
+                        "[0-9]+\\(\\.[0-9]*\\|\\)"
+                        "\\([eE]\\([-+]\\|\\)[0-9]+\\|\\)\\)")
+                '(0 mdw-number-face))
+
+          ;; And anything else is punctuation.
+          (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
+
+;;;--------------------------------------------------------------------------
 ;;; Awk programming configuration.
 
 ;; Make Awk indentation nice.
@@ -1283,7 +1434,9 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; Perl programming style.
@@ -1330,7 +1483,9 @@ doesn't match any of the regular expressions in
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 (defun perl-number-tests (&optional arg)
   "Assign consecutive numbers to lines containing `#t'.  With ARG,
@@ -1361,7 +1516,7 @@ strip numbers instead."
        (list
 
         ;; Set up the keywords defined above.
-        (list (concat "\\<\\(" python-keywords "\\)\\>")
+        (list (concat "\\<\\(" keywords "\\)\\>")
               '(0 font-lock-keyword-face))
 
         ;; At least numbers are simpler than C.
@@ -1372,7 +1527,9 @@ strip numbers instead."
 
         ;; And anything else is punctuation.
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face)))))
+              '(0 mdw-punct-face))))
+
+  (mdw-post-config-mode-hack))
 
 ;; Define Python fontification styles.
 
@@ -1446,7 +1603,9 @@ strip numbers instead."
 
           ;; 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.
@@ -1527,8 +1686,9 @@ strip numbers instead."
 
         ;; And anything else is punctuation.
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face))))
+              '(0 mdw-punct-face)))
 
+  (mdw-post-config-mode-hack))
   (run-hooks 'arm-assembler-mode-hook))
 
 ;;;--------------------------------------------------------------------------
@@ -1554,7 +1714,8 @@ strip numbers instead."
                       "\\([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))
 
 ;;;--------------------------------------------------------------------------
 ;;; REXX configuration.
@@ -1627,7 +1788,9 @@ strip numbers instead."
 
           ;; And everything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; Standard ML programming style.
@@ -1677,7 +1840,9 @@ strip numbers instead."
 
           ;; And anything else is punctuation.
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-                '(0 mdw-punct-face))))))
+                '(0 mdw-punct-face)))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; Haskell configuration.
@@ -1714,7 +1879,9 @@ strip numbers instead."
                         "\\([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))
 
 ;;;--------------------------------------------------------------------------
 ;;; Erlang configuration.
@@ -1748,7 +1915,9 @@ strip numbers instead."
           (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))
 
 ;;;--------------------------------------------------------------------------
 ;;; Texinfo configuration.
@@ -1782,7 +1951,9 @@ strip numbers instead."
 
         ;; Fontify TeX special characters as punctuation.
         (list "[{}]+"
-              '(0 mdw-punct-face)))))
+              '(0 mdw-punct-face))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; TeX and LaTeX configuration.
@@ -1848,7 +2019,9 @@ strip numbers instead."
 
         ;; Fontify TeX special characters as punctuation.
         (list "[$^_{}#&]"
-              '(0 mdw-punct-face)))))
+              '(0 mdw-punct-face))))
+
+  (mdw-post-config-mode-hack))
 
 ;;;--------------------------------------------------------------------------
 ;;; SGML hacking.
@@ -1899,6 +2072,35 @@ strip numbers instead."
   (setq sh-basic-offset 2))
 
 ;;;--------------------------------------------------------------------------
+;;; Emacs shell mode.
+
+(defun mdw-eshell-prompt ()
+  (let ((left "[") (right "]"))
+    (when (= (user-uid) 0)
+      (setq left "«" right "»"))
+    (concat left
+           (save-match-data
+             (replace-regexp-in-string "\\..*$" "" (system-name)))
+           " "
+           (eshell/pwd)
+           right)))
+(setq eshell-prompt-function 'mdw-eshell-prompt)
+(setq eshell-prompt-regexp "^\\[[^]]+\\]")
+
+(defalias 'eshell/e 'find-file)
+(defalias 'eshell/w3m 'w3m-goto-url)
+
+(mdw-define-face eshell-prompt (t :weight bold))
+(mdw-define-face eshell-ls-archive (t :weight bold :foreground "red"))
+(mdw-define-face eshell-ls-backup (t :foreground "lightgrey" :slant italic))
+(mdw-define-face eshell-ls-product (t :foreground "lightgrey" :slant italic))
+(mdw-define-face eshell-ls-clutter (t :foreground "lightgrey" :slant italic))
+(mdw-define-face eshell-ls-executable (t :weight bold))
+(mdw-define-face eshell-ls-directory (t :foreground "cyan" :weight bold))
+(mdw-define-face eshell-ls-readonly (t nil))
+(mdw-define-face eshell-ls-symlink (t :foreground "cyan"))
+
+;;;--------------------------------------------------------------------------
 ;;; Messages-file mode.
 
 (defun messages-mode-guts ()
@@ -2100,7 +2302,8 @@ strip numbers instead."
                       "\\([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))
 
 ;; Lispy languages.
 
@@ -2140,7 +2343,9 @@ strip numbers instead."
   (setq font-lock-keywords
        (list
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
-              '(0 mdw-punct-face)))))
+              '(0 mdw-punct-face))))
+
+  (mdw-post-config-mode-hack))
 
 (defun comint-send-and-indent ()
   (interactive)
@@ -2162,7 +2367,7 @@ strip numbers instead."
   (auto-fill-mode 1))
 
 ;;;--------------------------------------------------------------------------
-;;; Outline mode.
+;;; Outline and hide/show modes.
 
 (defun mdw-outline-collapse-all ()
   "Completely collapse everything in the entire buffer."
@@ -2173,6 +2378,11 @@ strip numbers instead."
       (hide-subtree)
       (forward-line))))
 
+(setq hs-hide-comments-when-hiding-all nil)
+
+(defadvice hs-hide-all (after hide-first-comment activate)
+  (save-excursion (hs-hide-initial-comment-block)))
+
 ;;;--------------------------------------------------------------------------
 ;;; Shell mode.
 
@@ -2206,6 +2416,21 @@ 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)))
 
+;;;--------------------------------------------------------------------------
+;;; Inferior Emacs Lisp.
+
+(setq comint-prompt-read-only t)
+
+(eval-after-load "comint"
+  '(progn
+     (define-key comint-mode-map "\C-w" 'comint-kill-region)
+     (define-key comint-mode-map [C-S-backspace] 'comint-kill-whole-line)))
+
+(eval-after-load "ielm"
+  '(progn
+     (define-key ielm-map "\C-w" 'comint-kill-region)
+     (define-key ielm-map [C-S-backspace] 'comint-kill-whole-line)))
+
 ;;;----- That's all, folks --------------------------------------------------
 
 (provide 'dot-emacs)