el/dot-emacs.el: Overhaul the point-overlay stuff.
[profile] / el / dot-emacs.el
index 93cec99..b730924 100644 (file)
@@ -321,13 +321,13 @@ Interactively, prompt for the command if the variable
 the prefix argument.  Prompt for the directory, and run
 interactively, if requested through the prefix.
 
-Use a prefix of 4, 5, 6, or 7, or type C-u between one and three times, to
+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, 3, 6, or 7, or type C-u three times, to force
+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 1, 3, 5, or 7, or type C-u twoce or three times,
+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))
@@ -339,7 +339,7 @@ to force interactive compilation."
               (compilation-read-command command)
             command)
           dir
-          (plusp (logand prefix #x51)))))
+          (plusp (logand prefix #x58)))))
   (let ((default-directory (or directory default-directory)))
     (compile command comint)))
 
@@ -1132,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
@@ -1252,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
@@ -1286,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
@@ -1317,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)
@@ -1336,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"))
 
@@ -1418,98 +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
-  (((class color) (type x)) :foreground "grey40")
-  (((class color) (type tty)) :foreground "blue"))
+  (((min-colors 64)) :foreground "grey40")
+  (((class color)) :foreground "blue"))
 (mdw-define-face magit-diff-hunk-heading
-  (((class color) (type x)) :foreground "grey70" :background "grey25")
-  (((class color) (type tty)) :foreground "yellow"))
+  (((min-colors 64)) :foreground "grey70" :background "grey25")
+  (((class color)) :foreground "yellow"))
 (mdw-define-face magit-diff-hunk-heading-highlight
-  (((class color) (type x)) :foreground "grey70" :background "grey35")
-  (((class color) (type tty)) :foreground "yellow" :background "blue"))
+  (((min-colors 64)) :foreground "grey70" :background "grey35")
+  (((class color)) :foreground "yellow" :background "blue"))
 (mdw-define-face magit-diff-added
-  (((class color) (type x)) :foreground "#ddffdd" :background "#335533")
-  (((class color) (type tty)) :foreground "green"))
+  (((min-colors 64)) :foreground "#ddffdd" :background "#335533")
+  (((class color)) :foreground "green"))
 (mdw-define-face magit-diff-added-highlight
-  (((class color) (type x)) :foreground "#cceecc" :background "#336633")
-  (((class color) (type tty)) :foreground "green" :background "blue"))
+  (((min-colors 64)) :foreground "#cceecc" :background "#336633")
+  (((class color)) :foreground "green" :background "blue"))
 (mdw-define-face magit-diff-removed
-  (((class color) (type x)) :foreground "#ffdddd" :background "#553333")
-  (((class color) (type tty)) :foreground "red"))
+  (((min-colors 64)) :foreground "#ffdddd" :background "#553333")
+  (((class color)) :foreground "red"))
 (mdw-define-face magit-diff-removed-highlight
-  (((class color) (type x)) :foreground "#eecccc" :background "#663333")
-  (((class color) (type tty)) :foreground "red" :background "blue"))
+  (((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"))
@@ -1577,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 x)))
+  (((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.
@@ -1889,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.
 
@@ -2427,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_]+"
@@ -2445,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.
@@ -2630,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.
 
@@ -3158,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.
@@ -3677,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.
 
@@ -3819,6 +3883,8 @@ there is sadness."
 ;;;--------------------------------------------------------------------------
 ;;; MPC configuration.
 
+(eval-when-compile (trap (require 'mpc)))
+
 (setq mpc-browser-tags '(Artist|Composer|Performer Album|Playlist))
 
 (defun mdw-mpc-now-playing ()
@@ -3879,6 +3945,18 @@ there is sadness."
 (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)))