dot/dircolors: Set colours on `xterm-256color' terminals.
[profile] / el / dot-emacs.el
index d8e9af7..2fdc9ab 100644 (file)
@@ -293,6 +293,56 @@ it's currently off."
         (or transient-mark-mode (setq transient-mark-mode 'only))
         (set-mark (mark t)))))
 
+;; Improved compilation machinery.
+
+(setq compile-command
+      (let ((ncpu (with-temp-buffer
+                   (insert-file-contents "/proc/cpuinfo")
+                   (buffer-string)
+                   (count-matches "^processor\\s-*:"))))
+       (format "make -j%d -k" (* 2 ncpu))))
+
+(defun mdw-compilation-buffer-name (mode)
+  (concat "*" (downcase mode) ": "
+         (abbreviate-file-name default-directory) "*"))
+(setq compilation-buffer-name-function 'mdw-compilation-buffer-name)
+
+(eval-after-load "compile"
+  '(progn
+     (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile)))
+
+(defun mdw-compile (command &optional directory comint)
+  "Initiate a compilation COMMAND, maybe in a different DIRECTORY.
+The DIRECTORY may be nil to not change.  If COMINT is t, then
+start an interactive compilation.
+
+Interactively, prompt for the command if the variable
+`compilation-read-command' is non-nil, or if requested through
+the prefix argument.  Prompt for the directory, and run
+interactively, if requested through the prefix.
+
+Use a prefix of 4, 6, 12, or 14, or type C-u between one and three times, to
+force prompting for a directory.
+
+Use a prefix of 2, 6, 10, or 14, or type C-u three times, to force
+prompting for the command.
+
+Use a prefix of 8, 10, 12, or 14, or type C-u twice or three times,
+to force interactive compilation."
+  (interactive
+   (let* ((prefix (prefix-numeric-value current-prefix-arg))
+         (command (eval compile-command))
+         (dir (and (plusp (logand prefix #x54))
+                   (read-directory-name "Compile in directory: "))))
+     (list (if (or compilation-read-command
+                  (plusp (logand prefix #x42)))
+              (compilation-read-command command)
+            command)
+          dir
+          (plusp (logand prefix #x58)))))
+  (let ((default-directory (or directory default-directory)))
+    (compile command comint)))
+
 ;; Functions for sexp diary entries.
 
 (defun mdw-not-org-mode (form)
@@ -768,6 +818,17 @@ options."
       (ad-set-arg 0 dir)
       ad-do-it)))
 
+(defun mdw-dired-run (args &optional syncp)
+  (interactive (let ((file (dired-get-filename t)))
+                (list (read-string (format "Arguments for %s: " file))
+                      current-prefix-arg)))
+  (funcall (if syncp 'shell-command 'async-shell-command)
+          (concat (shell-quote-argument (dired-get-filename nil))
+                  " " args)))
+
+(eval-after-load "dired"
+  '(define-key dired-mode-map "X" 'mdw-dired-run))
+
 ;;;--------------------------------------------------------------------------
 ;;; URL viewing.
 
@@ -1071,62 +1132,6 @@ doesn't match any of the regular expressions in
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
 ;;;--------------------------------------------------------------------------
-;;; Where is point?
-
-(defvar mdw-point-overlay
-  (let ((ov (make-overlay 0 0))
-       (s "."))
-    (overlay-put ov 'priority 2)
-    (put-text-property 0 1 'display '(left-fringe vertical-bar) s)
-    (overlay-put ov 'before-string s)
-    (delete-overlay ov)
-    ov)
-  "An overlay used for showing where point is in the selected window.")
-
-(defun mdw-remove-point-overlay ()
-  "Remove the current-point overlay."
-  (delete-overlay mdw-point-overlay))
-
-(defun mdw-update-point-overlay ()
-  "Mark the current point position with an overlay."
-  (if (not mdw-point-overlay-mode)
-      (mdw-remove-point-overlay)
-    (overlay-put mdw-point-overlay 'window (selected-window))
-    (if (bolp)
-       (move-overlay mdw-point-overlay
-                     (point) (1+ (point)) (current-buffer))
-      (move-overlay mdw-point-overlay
-                   (1- (point)) (point) (current-buffer)))))
-
-(defvar mdw-point-overlay-buffers nil
-  "List of buffers using `mdw-point-overlay-mode'.")
-
-(define-minor-mode mdw-point-overlay-mode
-  "Indicate current line with an overlay."
-  :global nil
-  (let ((buffer (current-buffer)))
-    (setq mdw-point-overlay-buffers
-         (mapcan (lambda (buf)
-                   (if (and (buffer-live-p buf)
-                            (not (eq buf buffer)))
-                       (list buf)))
-                 mdw-point-overlay-buffers))
-    (if mdw-point-overlay-mode
-       (setq mdw-point-overlay-buffers
-             (cons buffer mdw-point-overlay-buffers))))
-  (cond (mdw-point-overlay-buffers
-        (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
-        (add-hook 'post-command-hook 'mdw-update-point-overlay))
-       (t
-        (mdw-remove-point-overlay)
-        (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
-        (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
-
-(define-globalized-minor-mode mdw-global-point-overlay-mode
-  mdw-point-overlay-mode
-  (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
-
-;;;--------------------------------------------------------------------------
 ;;; Fullscreen-ness.
 
 (defvar mdw-full-screen-parameters
@@ -1191,16 +1196,15 @@ doesn't match any of the regular expressions in
   (mdw-define-face variable-pitch
     (((type x)) :family "helvetica" :height 90)))
 (mdw-define-face region
-  (((type tty) (class color)) :background "blue")
-  (((type tty) (class mono)) :inverse-video t)
-  (t :background "grey30"))
+  (((min-colors 64)) :background "grey30")
+  (((class color)) :background "blue")
+  ((t) :inverse-video t))
 (mdw-define-face match
-  (((type tty) (class color)) :background "blue")
-  (((type tty) (class mono)) :inverse-video t)
-  (t :background "blue"))
+  (((class color)) :background "blue")
+  (t :inverse-video t))
 (mdw-define-face mc/cursor-face
-  (((type tty) (class mono)) :inverse-video t)
-  (t :background "red"))
+  (((class color)) :background "red")
+  (t :inverse-video t))
 (mdw-define-face minibuffer-prompt
   (t :weight bold))
 (mdw-define-face mode-line
@@ -1225,8 +1229,8 @@ doesn't match any of the regular expressions in
   (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face highlight
-  (((type x) (class color)) :background "DarkSeaGreen4")
-  (((type tty) (class color)) :background "cyan")
+  (((min-colors 64)) :background "DarkSeaGreen4")
+  (((class color)) :background "cyan")
   (t :inverse-video t))
 
 (mdw-define-face holiday-face
@@ -1239,6 +1243,9 @@ doesn't match any of the regular expressions in
 (mdw-define-face comint-highlight-input
   (t nil))
 
+(mdw-define-face ido-subdir
+  (t :foreground "cyan" :weight bold))
+
 (mdw-define-face dired-directory
   (t :foreground "cyan" :weight bold))
 (mdw-define-face dired-symlink
@@ -1253,7 +1260,8 @@ doesn't match any of the regular expressions in
   (((class color)) :background "darkred")
   (t :inverse-video t))
 (mdw-define-face mdw-punct-face
-  (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+  (((min-colors 64)) :foreground "burlywood2")
+  (((class color)) :foreground "yellow"))
 (mdw-define-face mdw-number-face
   (t :foreground "yellow"))
 (mdw-define-face mdw-trivial-face)
@@ -1272,78 +1280,102 @@ doesn't match any of the regular expressions in
 (mdw-define-face font-lock-variable-name-face
   (t :slant italic))
 (mdw-define-face font-lock-comment-delimiter-face
-  (((class mono)) :weight bold)
-  (((type tty) (class color)) :foreground "green")
-  (t :slant italic :foreground "SeaGreen1"))
+  (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+  (((class color)) :foreground "green")
+  (t :weight bold))
 (mdw-define-face font-lock-comment-face
-  (((class mono)) :weight bold)
-  (((type tty) (class color)) :foreground "green")
-  (t :slant italic :foreground "SeaGreen1"))
+  (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+  (((class color)) :foreground "green")
+  (t :weight bold))
 (mdw-define-face font-lock-string-face
-  (((class mono)) :weight bold)
-  (((class color)) :foreground "SkyBlue1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan")
+  (t :weight bold))
 
 (mdw-define-face message-separator
   (t :background "red" :foreground "white" :weight bold))
 (mdw-define-face message-cited-text
   (default :slant italic)
-  (((type tty)) :foreground "cyan") (t :foreground "SkyBlue1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face message-header-cc
   (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-newsgroups
   (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-subject
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-to
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-xheader
   (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-other
   (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face message-header-name
   (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 
 (mdw-define-face which-func
   (t nil))
 
 (mdw-define-face gnus-header-name
   (default :weight bold)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face gnus-header-subject
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face gnus-header-from
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face gnus-header-to
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face gnus-header-content
   (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 
 (mdw-define-face gnus-cite-1
-  (((type tty)) :foreground "cyan") (t :foreground "SkyBlue1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face gnus-cite-2
-  (((type tty)) :foreground "blue") (t :foreground "RoyalBlue2"))
+  (((min-colors 64)) :foreground "RoyalBlue2")
+  (((class color)) :foreground "blue"))
 (mdw-define-face gnus-cite-3
-  (((type tty)) :foreground "magenta") (t :foreground "MediumOrchid"))
+  (((min-colors 64)) :foreground "MediumOrchid")
+  (((class color)) :foreground "magenta"))
 (mdw-define-face gnus-cite-4
-  (((type tty)) :foreground "red") (t :foreground "firebrick2"))
+  (((min-colors 64)) :foreground "firebrick2")
+  (((class color)) :foreground "red"))
 (mdw-define-face gnus-cite-5
-  (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+  (((min-colors 64)) :foreground "burlywood2")
+  (((class color)) :foreground "yellow"))
 (mdw-define-face gnus-cite-6
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((min-colors 64)) :foreground "SeaGreen1")
+  (((class color)) :foreground "green"))
 (mdw-define-face gnus-cite-7
-  (((type tty)) :foreground "cyan") (t :foreground "SlateBlue1"))
+  (((min-colors 64)) :foreground "SlateBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face gnus-cite-8
-  (((type tty)) :foreground "blue") (t :foreground "RoyalBlue2"))
+  (((min-colors 64)) :foreground "RoyalBlue2")
+  (((class color)) :foreground "blue"))
 (mdw-define-face gnus-cite-9
-  (((type tty)) :foreground "magenta") (t :foreground "purple2"))
+  (((min-colors 64)) :foreground "purple2")
+  (((class color)) :foreground "magenta"))
 (mdw-define-face gnus-cite-10
-  (((type tty)) :foreground "red") (t :foreground "DarkOrange2"))
+  (((min-colors 64)) :foreground "DarkOrange2")
+  (((class color)) :foreground "red"))
 (mdw-define-face gnus-cite-11
   (t :foreground "grey"))
 
@@ -1354,76 +1386,101 @@ doesn't match any of the regular expressions in
 (mdw-define-face diff-file-header
   (t :weight bold))
 (mdw-define-face diff-hunk-header
-  (t :foreground "SkyBlue1"))
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face diff-function
-  (t :foreground "SkyBlue1" :weight bold))
+  (default :weight bold)
+  (((min-colors 64)) :foreground "SkyBlue1")
+  (((class color)) :foreground "cyan"))
 (mdw-define-face diff-header
-  (t :background "grey10"))
+  (((min-colors 64)) :background "grey10"))
 (mdw-define-face diff-added
-  (t :foreground "green"))
+  (((class color)) :foreground "green"))
 (mdw-define-face diff-removed
-  (t :foreground "red"))
+  (((class color)) :foreground "red"))
 (mdw-define-face diff-context
   (t nil))
 (mdw-define-face diff-refine-change
-  (((class color) (type x)) :background "RoyalBlue4")
+  (((min-colors 64)) :background "RoyalBlue4")
   (t :underline t))
 (mdw-define-face diff-refine-removed
-  (((class color) (type x)) :background "#500")
+  (((min-colors 64)) :background "#500")
   (t :underline t))
 (mdw-define-face diff-refine-added
-  (((class color) (type x)) :background "#050")
+  (((min-colors 64)) :background "#050")
   (t :underline t))
 
 (setq ediff-force-faces t)
 (mdw-define-face ediff-current-diff-A
-  (((class color) (type x)) :background "darkred")
-  (((class color) (type tty)) :background "red")
+  (((min-colors 64)) :background "darkred")
+  (((class color)) :background "red")
   (t :inverse-video t))
 (mdw-define-face ediff-fine-diff-A
-  (((class color) (type x)) :background "red3")
-  (((class color) (type tty)) :inverse-video t)
+  (((min-colors 64)) :background "red3")
+  (((class color)) :inverse-video t)
   (t :inverse-video nil))
 (mdw-define-face ediff-even-diff-A
-  (((class color) (type x)) :background "#300"))
+  (((min-colors 64)) :background "#300"))
 (mdw-define-face ediff-odd-diff-A
-  (((class color) (type x)) :background "#300"))
+  (((min-colors 64)) :background "#300"))
 (mdw-define-face ediff-current-diff-B
-  (((class color) (type x)) :background "darkgreen")
-  (((class color) (type tty)) :background "magenta")
+  (((min-colors 64)) :background "darkgreen")
+  (((class color)) :background "magenta")
   (t :inverse-video t))
 (mdw-define-face ediff-fine-diff-B
-  (((class color) (type x)) :background "green4")
-  (((class color) (type tty)) :inverse-video t)
+  (((min-colors 64)) :background "green4")
+  (((class color)) :inverse-video t)
   (t :inverse-video nil))
 (mdw-define-face ediff-even-diff-B
-  (((class color) (type x)) :background "#020"))
+  (((min-colors 64)) :background "#020"))
 (mdw-define-face ediff-odd-diff-B
-  (((class color) (type x)) :background "#020"))
+  (((min-colors 64)) :background "#020"))
 (mdw-define-face ediff-current-diff-C
-  (((class color) (type x)) :background "darkblue")
-  (((class color) (type tty)) :background "blue")
+  (((min-colors 64)) :background "darkblue")
+  (((class color)) :background "blue")
   (t :inverse-video t))
 (mdw-define-face ediff-fine-diff-C
-  (((class color) (type x)) :background "blue1")
-  (((class color) (type tty)) :inverse-video t)
+  (((min-colors 64)) :background "blue1")
+  (((class color)) :inverse-video t)
   (t :inverse-video nil))
 (mdw-define-face ediff-even-diff-C
-  (((class color) (type x)) :background "#004"))
+  (((min-colors 64)) :background "#004"))
 (mdw-define-face ediff-odd-diff-C
-  (((class color) (type x)) :background "#004"))
+  (((min-colors 64)) :background "#004"))
 (mdw-define-face ediff-current-diff-Ancestor
-  (((class color) (type x)) :background "#630")
-  (((class color) (type tty)) :background "blue")
+  (((min-colors 64)) :background "#630")
+  (((class color)) :background "blue")
   (t :inverse-video t))
 (mdw-define-face ediff-even-diff-Ancestor
-  (((class color) (type x)) :background "#320"))
+  (((min-colors 64)) :background "#320"))
 (mdw-define-face ediff-odd-diff-Ancestor
-  (((class color) (type x)) :background "#320"))
+  (((min-colors 64)) :background "#320"))
+
+(mdw-define-face magit-hash
+  (((min-colors 64)) :foreground "grey40")
+  (((class color)) :foreground "blue"))
+(mdw-define-face magit-diff-hunk-heading
+  (((min-colors 64)) :foreground "grey70" :background "grey25")
+  (((class color)) :foreground "yellow"))
+(mdw-define-face magit-diff-hunk-heading-highlight
+  (((min-colors 64)) :foreground "grey70" :background "grey35")
+  (((class color)) :foreground "yellow" :background "blue"))
+(mdw-define-face magit-diff-added
+  (((min-colors 64)) :foreground "#ddffdd" :background "#335533")
+  (((class color)) :foreground "green"))
+(mdw-define-face magit-diff-added-highlight
+  (((min-colors 64)) :foreground "#cceecc" :background "#336633")
+  (((class color)) :foreground "green" :background "blue"))
+(mdw-define-face magit-diff-removed
+  (((min-colors 64)) :foreground "#ffdddd" :background "#553333")
+  (((class color)) :foreground "red"))
+(mdw-define-face magit-diff-removed-highlight
+  (((min-colors 64)) :foreground "#eecccc" :background "#663333")
+  (((class color)) :foreground "red" :background "blue"))
 
 (mdw-define-face dylan-header-background
-  (((class color) (type x)) :background "NavyBlue")
-  (t :background "blue"))
+  (((min-colors 64)) :background "NavyBlue")
+  (((class color)) :background "blue"))
 
 (mdw-define-face erc-input-face
   (t :foreground "red"))
@@ -1491,6 +1548,84 @@ doesn't match any of the regular expressions in
   (set-display-table-slot standard-display-table 5 bar))
 
 ;;;--------------------------------------------------------------------------
+;;; Where is point?
+
+(mdw-define-face mdw-point-overlay
+  (((type graphic)))
+  (((min-colors 64)) :background "darkblue")
+  (((class color)) :background "blue")
+  (((type tty) (class mono)) :inverse-video t))
+
+(defvar mdw-point-overlay-fringe-display '(vertical-bar . vertical-bar))
+
+(defun mdw-configure-point-overlay ()
+  (let ((ov (make-overlay 0 0)))
+    (overlay-put ov 'priority 0)
+    (let* ((fringe (or mdw-point-overlay-fringe-display (cons nil nil)))
+          (left (car fringe)) (right (cdr fringe))
+          (s ""))
+      (when left
+       (let ((ss "."))
+         (put-text-property 0 1 'display `(left-fringe ,left) ss)
+         (setq s (concat s ss))))
+      (when right
+       (let ((ss "."))
+         (put-text-property 0 1 'display `(right-fringe ,right) ss)
+         (setq s (concat s ss))))
+      (when (or left right)
+       (overlay-put ov 'before-string s)))
+    (overlay-put ov 'face 'mdw-point-overlay)
+    (delete-overlay ov)
+    ov))
+
+(defvar mdw-point-overlay (mdw-configure-point-overlay)
+  "An overlay used for showing where point is in the selected window.")
+(defun mdw-reconfigure-point-overlay ()
+  (interactive)
+  (setq mdw-point-overlay (mdw-configure-point-overlay)))
+
+(defun mdw-remove-point-overlay ()
+  "Remove the current-point overlay."
+  (delete-overlay mdw-point-overlay))
+
+(defun mdw-update-point-overlay ()
+  "Mark the current point position with an overlay."
+  (if (not mdw-point-overlay-mode)
+      (mdw-remove-point-overlay)
+    (overlay-put mdw-point-overlay 'window (selected-window))
+    (move-overlay mdw-point-overlay
+                 (line-beginning-position)
+                 (+ (line-end-position) 1))))
+
+(defvar mdw-point-overlay-buffers nil
+  "List of buffers using `mdw-point-overlay-mode'.")
+
+(define-minor-mode mdw-point-overlay-mode
+  "Indicate current line with an overlay."
+  :global nil
+  (let ((buffer (current-buffer)))
+    (setq mdw-point-overlay-buffers
+         (mapcan (lambda (buf)
+                   (if (and (buffer-live-p buf)
+                            (not (eq buf buffer)))
+                       (list buf)))
+                 mdw-point-overlay-buffers))
+    (if mdw-point-overlay-mode
+       (setq mdw-point-overlay-buffers
+             (cons buffer mdw-point-overlay-buffers))))
+  (cond (mdw-point-overlay-buffers
+        (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
+        (add-hook 'post-command-hook 'mdw-update-point-overlay))
+       (t
+        (mdw-remove-point-overlay)
+        (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
+        (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
+
+(define-globalized-minor-mode mdw-global-point-overlay-mode
+  mdw-point-overlay-mode
+  (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
+
+;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
 
 ;; Make C indentation nice.
@@ -1803,6 +1938,10 @@ name, as a symbol."
           (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
                 '(0 mdw-punct-face))))))
 
+(define-derived-mode sod-mode c-mode "Sod"
+  "Major mode for editing Sod code.")
+(push '("\\.sod$" . sod-mode) auto-mode-alist)
+
 ;;;--------------------------------------------------------------------------
 ;;; AP calc mode.
 
@@ -2341,13 +2480,13 @@ name, as a symbol."
          (list
 
           ;; Handle the keywords defined above.
-          (list (concat "\\<\\(" rust-keywords "\\)\\>")
+          (list (concat "\\_<\\(" rust-keywords "\\)\\_>")
                 '(0 font-lock-keyword-face))
-          (list (concat "\\<\\(" rust-builtins "\\)\\>")
+          (list (concat "\\_<\\(" rust-builtins "\\)\\_>")
                 '(0 font-lock-variable-name-face))
 
           ;; Handle numbers too.
-          (list (concat "\\<\\("
+          (list (concat "\\_<\\("
                               "[0-9][0-9_]*"
                               "\\(" "\\(\\.[0-9_]+\\)?[eE][-+]?[0-9_]+"
                               "\\|" "\\.[0-9_]+"
@@ -2359,7 +2498,7 @@ name, as a symbol."
                               "\\|" "0b[01_]+"
                               "\\)"
                               "\\([ui]\\(8\\|16\\|32\\|64\\|s\\|size\\)\\)?"
-                        "\\)\\>")
+                        "\\)\\_>")
                 '(0 mdw-number-face))
 
           ;; And anything else is punctuation.
@@ -2544,12 +2683,20 @@ strip numbers instead."
 (defun mdw-fontify-pyrex ()
   (mdw-fontify-pythonic
    (mdw-regexps "and" "as" "assert" "break" "cdef" "class" "continue"
-               "ctypedef" "def" "del" "elif" "else" "except" "exec"
+               "ctypedef" "def" "del" "elif" "else" "enum" "except" "exec"
                "extern" "finally" "for" "from" "global" "if"
                "import" "in" "is" "lambda" "not" "or" "pass" "print"
-               "raise" "return" "struct" "try" "while" "with"
+               "property" "raise" "return" "struct" "try" "while" "with"
                "yield")))
 
+(define-derived-mode pyrex-mode python-mode "Pyrex"
+  "Major mode for editing Pyrex source code")
+(setq auto-mode-alist
+      (append '(("\\.pyx$" . pyrex-mode)
+               ("\\.pxd$" . pyrex-mode)
+               ("\\.pxi$" . pyrex-mode))
+             auto-mode-alist))
+
 ;;;--------------------------------------------------------------------------
 ;;; Lua programming style.
 
@@ -3072,7 +3219,7 @@ strip numbers instead."
   (local-set-key [?$] 'self-insert-command)
 
   ;; Make `tab' be useful, given that tab stops in TeX don't work well.
-  (local-set-key "\C-i" 'indent-relative)
+  (local-set-key "\C-\M-i" 'indent-relative)
   (setq indent-tabs-mode nil)
 
   ;; Set fill prefix.
@@ -3591,6 +3738,9 @@ that character only to be normal punctuation.")
    "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
   (auto-fill-mode 1))
 
+(eval-after-load "flyspell"
+  '(define-key flyspell-mode-map "\C-\M-i" nil))
+
 ;;;--------------------------------------------------------------------------
 ;;; Outline and hide/show modes.
 
@@ -3668,6 +3818,9 @@ This allows you to pass a list of arguments through `ansi-term'."
                             git-grep-command 'git-grep-history)))
   (grep command-args))
 
+;;;--------------------------------------------------------------------------
+;;; Magit configuration.
+
 (setq magit-diff-refine-hunk 'all
       magit-view-git-manual-method 'man
       magit-log-margin '(nil age magit-log-margin-width t 18)
@@ -3728,6 +3881,205 @@ there is sadness."
                       (if (> n 0) 'bold 'shadow))))))
 
 ;;;--------------------------------------------------------------------------
+;;; MPC configuration.
+
+(eval-when-compile (trap (require 'mpc)))
+
+(setq mpc-browser-tags '(Artist|Composer|Performer Album|Playlist))
+
+(defun mdw-mpc-now-playing ()
+  (interactive)
+  (require 'mpc)
+  (save-excursion
+    (set-buffer (mpc-proc-cmd (mpc-proc-cmd-list '("status" "currentsong"))))
+    (mpc--status-callback))
+  (let ((state (cdr (assq 'state mpc-status))))
+    (cond ((member state '("stop"))
+          (message "mpd stopped."))
+         ((member state '("play" "pause"))
+          (let* ((artist (cdr (assq 'Artist mpc-status)))
+                 (album (cdr (assq 'Album mpc-status)))
+                 (title (cdr (assq 'Title mpc-status)))
+                 (file (cdr (assq 'file mpc-status)))
+                 (duration-string (cdr (assq 'Time mpc-status)))
+                 (time-string (cdr (assq 'time mpc-status)))
+                 (time (and time-string
+                            (string-to-number
+                             (if (string-match ":" time-string)
+                                 (substring time-string
+                                            0 (match-beginning 0))
+                               (time-string)))))
+                 (duration (and duration-string
+                                (string-to-number duration-string)))
+                 (pos (and time duration
+                           (format " [%d:%02d/%d:%02d]"
+                                   (/ time 60) (mod time 60)
+                                   (/ duration 60) (mod duration 60))))
+                 (fmt (cond ((and artist title)
+                             (format "`%s' by %s%s" title artist
+                                     (if album (format ", from `%s'" album)
+                                       "")))
+                            (file
+                             (format "`%s' (no tags)" file))
+                            (t
+                             "(no idea what's playing!)"))))
+            (if (string= state "play")
+                (message "mpd playing %s%s" fmt (or pos ""))
+              (message "mpd paused in %s%s" fmt (or pos "")))))
+         (t
+          (message "mpd in unknown state `%s'" state)))))
+
+(defmacro mdw-define-mpc-wrapper (func bvl interactive &rest body)
+  `(defun ,func ,bvl
+     (interactive ,@interactive)
+     (require 'mpc)
+     ,@body
+     (mdw-mpc-now-playing)))
+
+(mdw-define-mpc-wrapper mdw-mpc-play-or-pause () nil
+  (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
+      (mpc-pause)
+    (mpc-play)))
+
+(mdw-define-mpc-wrapper mdw-mpc-next () nil (mpc-next))
+(mdw-define-mpc-wrapper mdw-mpc-prev () nil (mpc-prev))
+(mdw-define-mpc-wrapper mdw-mpc-stop () nil (mpc-stop))
+
+(defun mdw-mpc-louder (step)
+  (interactive (list (if current-prefix-arg
+                        (prefix-numeric-value current-prefix-arg)
+                      +10)))
+  (mpc-proc-cmd (format "volume %+d" step)))
+
+(defun mdw-mpc-quieter (step)
+  (interactive (list (if current-prefix-arg
+                        (prefix-numeric-value current-prefix-arg)
+                      +10)))
+  (mpc-proc-cmd (format "volume %+d" (- step))))
+
+(defun mdw-mpc-hack-lines (arg interactivep func)
+  (if (and interactivep (use-region-p))
+      (let ((from (region-beginning)) (to (region-end)))
+       (goto-char from)
+       (beginning-of-line)
+       (funcall func)
+       (forward-line)
+       (while (< (point) to)
+         (funcall func)
+         (forward-line)))
+    (let ((n (prefix-numeric-value arg)))
+      (cond ((minusp n)
+            (unless (bolp)
+              (beginning-of-line)
+              (funcall func)
+              (incf n))
+            (while (minusp n)
+              (forward-line -1)
+              (funcall func)
+              (incf n)))
+           (t
+            (beginning-of-line)
+            (while (plusp n)
+              (funcall func)
+              (forward-line)
+              (decf n)))))))
+
+(defun mdw-mpc-select-one ()
+  (when (and (get-char-property (point) 'mpc-file)
+            (not (get-char-property (point) 'mpc-select)))
+    (mpc-select-toggle)))
+
+(defun mdw-mpc-unselect-one ()
+  (when (get-char-property (point) 'mpc-select)
+    (mpc-select-toggle)))
+
+(defun mdw-mpc-select (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+
+(defun mdw-mpc-unselect (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-backwards (arg)
+  (interactive "p")
+  (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-all ()
+  (interactive)
+  (setq mpc-select nil)
+  (mpc-selection-refresh))
+
+(defun mdw-mpc-next-line (arg)
+  (interactive "p")
+  (beginning-of-line)
+  (forward-line arg))
+
+(defun mdw-mpc-previous-line (arg)
+  (interactive "p")
+  (beginning-of-line)
+  (forward-line (- arg)))
+
+(defun mdw-mpc-playlist-add (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (let ((mpc-select mpc-select))
+    (when (or arg (and interactivep (use-region-p)))
+      (setq mpc-select nil)
+      (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+    (setq mpc-select (reverse mpc-select))
+    (mpc-playlist-add)))
+
+(defun mdw-mpc-playlist-delete (&optional arg interactivep)
+  (interactive (list current-prefix-arg t))
+  (setq mpc-select (nreverse mpc-select))
+  (mpc-select-save
+    (when (or arg (and interactivep (use-region-p)))
+      (setq mpc-select nil)
+      (mpc-selection-refresh)
+      (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+      (mpc-playlist-delete)))
+
+(defun mdw-mpc-hack-tagbrowsers ()
+  (setq-local mode-line-format
+             '("%e"
+               mode-line-frame-identification
+               mode-line-buffer-identification)))
+(add-hook 'mpc-tagbrowser-mode-hook 'mdw-mpc-hack-tagbrowsers)
+
+(defun mdw-mpc-hack-songs ()
+  (setq-local header-line-format
+             ;; '("MPC " mpc-volume " " mpc-current-song)
+             (list (propertize " " 'display '(space :align-to 0))
+                   ;; 'mpc-songs-format-description
+                   '(:eval
+                     (let ((deactivate-mark) (hscroll (window-hscroll)))
+                       (with-temp-buffer
+                         (mpc-format mpc-songs-format 'self hscroll)
+                         ;; That would be simpler than the hscroll handling in
+                         ;; mpc-format, but currently move-to-column does not
+                         ;; recognize :space display properties.
+                         ;; (move-to-column hscroll)
+                         ;; (delete-region (point-min) (point))
+                         (buffer-string)))))))
+(add-hook 'mpc-songs-mode-hook 'mdw-mpc-hack-songs)
+
+(eval-after-load "mpc"
+  '(progn
+     (define-key mpc-mode-map "m" 'mdw-mpc-select)
+     (define-key mpc-mode-map "u" 'mdw-mpc-unselect)
+     (define-key mpc-mode-map "\177" 'mdw-mpc-unselect-backwards)
+     (define-key mpc-mode-map "\e\177" 'mdw-mpc-unselect-all)
+     (define-key mpc-mode-map "n" 'mdw-mpc-next-line)
+     (define-key mpc-mode-map "p" 'mdw-mpc-previous-line)
+     (define-key mpc-mode-map "/" 'mpc-songs-search)
+     (setq mpc-songs-mode-map (make-sparse-keymap))
+     (set-keymap-parent mpc-songs-mode-map mpc-mode-map)
+     (define-key mpc-songs-mode-map "l" 'mpc-playlist)
+     (define-key mpc-songs-mode-map "+" 'mdw-mpc-playlist-add)
+     (define-key mpc-songs-mode-map "-" 'mdw-mpc-playlist-delete)
+     (define-key mpc-songs-mode-map "\r" 'mpc-songs-jump-to)))
+
+;;;--------------------------------------------------------------------------
 ;;; Inferior Emacs Lisp.
 
 (setq comint-prompt-read-only t)