Now that Emacs starts up pretty quick, favour it over lesser editors.
[profile] / dot-emacs.el
index 0599106..90df96a 100644 (file)
@@ -1,4 +1,4 @@
-;;; -*-emacs-lisp-*-
+;;; -*- mode: emacs-lisp; coding: utf-8 -*-
 ;;;
 ;;; $Id$
 ;;;
 ;;; along with this program; if not, write to the Free Software Foundation,
 ;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+;;;----- Check command-line -------------------------------------------------
+
+(defvar mdw-fast-startup nil
+  "Whether .emacs should optimize for rapid startup.
+This may be at the expense of cool features.")
+(let ((probe nil) (next command-line-args))
+  (message "probe = %s" probe)
+  (message "next = %s" next)
+  (while next
+    (cond ((string= (car next) "--mdw-fast-startup")
+          (setq mdw-fast-startup t)
+          (if probe
+              (rplacd probe (cdr next))
+            (setq command-line-args (cdr next))))
+         (t
+          (setq probe next)))
+    (setq next (cdr next))))
+
 ;;;----- Some general utilities ---------------------------------------------
 
+(evan-when-compile (or (fboundp 'make-regexp)
+                      (load "make-regexp")))
+
+(defmacro mdw-regexps (&rest list)
+  "Turn a LIST of strings into a single regular expression at compile-time."
+  (make-regexp list))
+
 ;; --- Some error trapping ---
 ;;
 ;; If individual bits of this file go tits-up, we don't particularly want
@@ -34,7 +59,9 @@
   "Execute FORMS without allowing errors to propagate outside."
   `(condition-case err
        ,(if (cdr forms) (cons 'progn forms) (car forms))
-     (error (message "Error (trapped): %s" (error-message-string err)))))
+     (error (message "Error (trapped): %s in %s"
+                    (error-message-string err)
+                    ',forms))))
 
 ;; --- Configuration reading ---
 
@@ -79,18 +106,37 @@ path.  The non-nil value is the filename we found for the library."
 
 ;; --- Splitting windows ---
 
-(defconst mdw-scrollbar-width (if window-system 6 1)
-  "Guessed width of scroll bar.")
+(or (and (fboundp 'scroll-bar-columns)
+        (fboundp 'fringe-columns))
+    (progn
+      (defun scroll-bar-columns (side)
+       (cond ((eq side 'left) 0)
+             (window-system 3)
+             (t 1)))
+      (defun fringe-columns (side)
+       (cond ((not window-system) 0)
+             ((eq side 'left) 1)
+             (t 2)))))
+
 (defun mdw-divvy-window (&optional w)
   "Split a wide window into appropriate widths."
   (interactive)
-  (or w (setq w 78))
-  (let ((win (selected-window))
-       (c (/ (+ (window-width) mdw-scrollbar-width)
-             (+ w mdw-scrollbar-width))))
+  (or w (setq w (if (and window-system
+                        (>= emacs-major-version 22))
+                   77
+                 78)))
+  (let* ((win (selected-window))
+        (sb-width (if (not window-system)
+                      1
+                    (+ (scroll-bar-columns 'left)
+                       (scroll-bar-columns 'right)
+                       (fringe-columns 'left)
+                       (fringe-columns 'right))))
+        (c (/ (+ (window-width) sb-width)
+              (+ w sb-width))))
     (while (> c 1)
       (setq c (1- c))
-      (split-window-horizontally (+ w mdw-scrollbar-width))
+      (split-window-horizontally (+ w sb-width))
       (other-window 1))
     (select-window win)))
 
@@ -128,18 +174,18 @@ symbols `sunday', `monday', etc. (or a mixture).  If the date stored in
 
 ;;;----- Utility functions --------------------------------------------------
 
-(defun line-number-at-pos (&optional pos)
-  "Print the current buffer line number and narrowed line number of point."
-  (let ((opoint (or pos (point))) start)
-    (save-excursion
-      (save-restriction
-       (goto-char (point-min))
-       (widen)
-       (forward-line 0)
-       (setq start (point))
-       (goto-char opoint)
-       (forward-line 0)
-       (1+ (count-lines 1 (point)))))))
+(or (fboundp 'line-number-at-pos)
+    (defun line-number-at-pos (&optional pos)
+      (let ((opoint (or pos (point))) start)
+       (save-excursion
+         (save-restriction
+           (goto-char (point-min))
+           (widen)
+           (forward-line 0)
+           (setq start (point))
+           (goto-char opoint)
+           (forward-line 0)
+           (1+ (count-lines 1 (point))))))))
 
 ;; --- mdw-uniquify-alist ---
 
@@ -243,20 +289,21 @@ input lists are not modified, although they'll probably become garbage."
              (insert "\nNP: ")
              (insert-file np-file)))))
 
-(trap
-  (require 'tramp)
-  (require 'autorevert)
-  (defun mdw-check-autorevert ()
-    (if (and (buffer-file-name)
-            (tramp-tramp-file-p (buffer-file-name)))
-       (unless global-auto-revert-ignore-buffer
-         (setq global-auto-revert-ignore-buffer 'tramp))
-       (if (eq global-auto-revert-ignore-buffer 'tramp)
-           (setq global-auto-revert-ignore-buffer nil))))
-  (defadvice find-file (after mdw-autorevert activate)
-    (mdw-check-autorevert))
-  (defadvice write-file (after mdw-autorevert activate)
-    (mdw-check-autorevert)))
+(defun mdw-check-autorevert ()
+  "Sets global-auto-revert-ignore-buffer appropriately for this buffer,
+taking into consideration whether it's been found using tramp, which seems to
+get itself into a twist."
+  (cond ((and (buffer-file-name)
+             (tramp-tramp-file-p (buffer-file-name)))
+        (unless global-auto-revert-ignore-buffer
+          (setq global-auto-revert-ignore-buffer 'tramp)))
+       ((eq global-auto-revert-ignore-buffer 'tramp)
+        (setq global-auto-revert-ignore-buffer nil))))
+
+(defadvice find-file (after mdw-autorevert activate)
+  (mdw-check-autorevert))
+(defadvice write-file (after mdw-autorevert activate)
+  (mdw-check-autorevert)))
 
 (defun mdwmail-mode ()
   "Major mode for editing news and mail messages from external programs
@@ -559,11 +606,15 @@ doesn't cope with anything approximating a complicated case."
       ,@(cond ((eq window-system 'w32)
               '(:family "courier new" :height 85))
              ((eq window-system 'x)
-              '(:family "misc-fixed" :width semi-condensed))))
-    (modeline :foreground "blue" :background "yellow"
-             :box (:line-width 1 :style released-button))
+              '(: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 "grey30")
+    (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)
@@ -580,6 +631,9 @@ doesn't cope with anything approximating a complicated case."
     (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)
@@ -589,12 +643,14 @@ doesn't cope with anything approximating a complicated case."
     (font-lock-reference-face :weight bold)
     (woman-bold-face :weight bold)
     (woman-italic-face :slant italic)
-    (diff-header-face :foreground "skyblue1")
-    (diff-index-face :weight bold)
-    (diff-file-header-face)
-    (diff-context-face :foreground "grey70")
-    (diff-added-face :foreground "white")
-    (diff-removed-face :foreground "white" :slant italic)
+    (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")
@@ -633,7 +689,7 @@ doesn't cope with anything approximating a complicated case."
                                  (label . 0)
                                  (case-label . +)
                                  (access-label . -)
-                                 (inclass . ++)
+                                 (inclass . +)
                                  (inline-open . ++)
                                  (statement-cont . 0)
                                  (statement-case-intro . +)))
@@ -665,7 +721,7 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '(
+        (mdw-regexps '(
                        "and"           ;C++
                        "and_eq"        ;C++
                        "asm"           ;K&R, GCC
@@ -765,17 +821,16 @@ doesn't cope with anything approximating a complicated case."
                        "__volatile__"  ;GCC
                        )))
        (preprocessor-keywords
-        (make-regexp '("assert" "define" "elif" "else" "endif" "error"
+        (mdw-regexps '("assert" "define" "elif" "else" "endif" "error"
                        "ident" "if" "ifdef" "ifndef" "import" "include"
                        "line" "pragma" "unassert" "undef" "warning")))
        (objc-keywords
-        (make-regexp '("class" "defs" "encode" "end" "implementation"
+        (mdw-regexps '("class" "defs" "encode" "end" "implementation"
                        "interface" "private" "protected" "protocol" "public"
                        "selector"))))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Fontify include files as strings ---
 
@@ -849,14 +904,13 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '("break" "case" "cd" "continue" "define" "default"
+        (mdw-regexps '("break" "case" "cd" "continue" "define" "default"
                        "do" "else" "exit" "for" "global" "goto" "help" "if"
                        "local" "mat" "obj" "print" "quit" "read" "return"
                        "show" "static" "switch" "while" "write"))))
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -917,7 +971,7 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((java-keywords
-        (make-regexp '("abstract" "boolean" "break" "byte" "case" "catch"
+        (mdw-regexps '("abstract" "boolean" "break" "byte" "case" "catch"
                        "char" "class" "const" "continue" "default" "do"
                        "double" "else" "extends" "final" "finally" "float"
                        "for" "goto" "if" "implements" "import" "instanceof"
@@ -931,7 +985,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -993,7 +1046,7 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((csharp-keywords
-        (make-regexp '("abstract" "as" "base" "bool" "break"
+        (mdw-regexps '("abstract" "as" "base" "bool" "break"
                        "byte" "case" "catch" "char" "checked"
                        "class" "const" "continue" "decimal" "default"
                        "delegate" "do" "double" "else" "enum"
@@ -1012,7 +1065,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -1071,7 +1123,7 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((c-keywords
-        (make-regexp '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
+        (mdw-regexps '("BEGIN" "END" "ARGC" "ARGIND" "ARGV" "CONVFMT"
                        "ENVIRON" "ERRNO" "FIELDWIDTHS" "FILENAME" "FNR"
                        "FS" "IGNORECASE" "NF" "NR" "OFMT" "OFS" "ORS" "RS"
                        "RSTART" "RLENGTH" "RT" "SUBSEP"
@@ -1085,7 +1137,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Handle the keywords defined above ---
 
@@ -1136,7 +1187,7 @@ doesn't cope with anything approximating a complicated case."
 
   (make-local-variable 'font-lock-keywords)
   (let ((perl-keywords
-        (make-regexp '("and" "cmp" "continue" "do" "else" "elsif" "eq"
+        (mdw-regexps '("and" "cmp" "continue" "do" "else" "elsif" "eq"
                        "for" "foreach" "ge" "gt" "goto" "if"
                        "last" "le" "lt" "local" "my" "ne" "next" "or"
                        "package" "redo" "require" "return" "sub"
@@ -1144,7 +1195,6 @@ doesn't cope with anything approximating a complicated case."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1182,7 +1232,6 @@ strip numbers instead."
 
 ;; --- Define Python fontification style ---
 
-(trap (require 'pyrex-mode))
 (defun mdw-fontify-python ()
 
   ;; --- Miscellaneous fiddling ---
@@ -1194,14 +1243,13 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((python-keywords
-        (make-regexp '("and" "as" "assert" "break" "class" "continue" "def"
+        (mdw-regexps '("and" "as" "assert" "break" "class" "continue" "def"
                        "del" "elif" "else" "except" "exec" "finally" "for"
                        "from" "global" "if" "import" "in" "is" "lambda"
                        "not" "or" "pass" "print" "raise" "return" "try"
                        "while" "yield"))))
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1280,7 +1328,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Handle numbers too ---
         ;;
@@ -1328,7 +1375,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
                       "\\<[0-9][0-9_]*\\(\\.[0-9_]*\\|\\)"
                       "\\([eE]\\([-+]\\|\\)[0-9_]+\\|\\)")
@@ -1372,7 +1418,7 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((rexx-keywords
-        (make-regexp '("address" "arg" "by" "call" "digits" "do" "drop"
+        (mdw-regexps '("address" "arg" "by" "call" "digits" "do" "drop"
                        "else" "end" "engineering" "exit" "expose" "for"
                        "forever" "form" "fuzz" "if" "interpret" "iterate"
                        "leave" "linein" "name" "nop" "numeric" "off" "on"
@@ -1397,7 +1443,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1432,7 +1477,7 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((sml-keywords
-        (make-regexp '("abstype" "and" "andalso" "as"
+        (mdw-regexps '("abstype" "and" "andalso" "as"
                        "case"
                        "datatype" "do"
                        "else" "end" "eqtype" "exception"
@@ -1450,7 +1495,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
 
           ;; --- Set up the keywords defined above ---
 
@@ -1493,7 +1537,7 @@ strip numbers instead."
 
   (make-local-variable 'font-lock-keywords)
   (let ((haskell-keywords
-        (make-regexp '("as" "case" "ccall" "class" "data" "default"
+        (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"
@@ -1501,7 +1545,6 @@ strip numbers instead."
 
     (setq font-lock-keywords
          (list
-          't
           (list "--.*$"
                 '(0 font-lock-comment-face))
           (list (concat "\\<\\(" haskell-keywords "\\)\\>")
@@ -1526,7 +1569,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1574,7 +1616,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
 
         ;; --- Environment names are keywords ---
 
@@ -1632,6 +1673,26 @@ strip numbers instead."
         (list "[$^_{}#&]"
               '(0 mdw-punct-face)))))
 
+;;;----- SGML hacking -------------------------------------------------------
+
+(defun mdw-sgml-mode ()
+  (interactive)
+  (sgml-mode)
+  (mdw-standard-fill-prefix "")
+  (make-variable-buffer-local 'sgml-delimiters)
+  (setq sgml-delimiters
+       '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
+         "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
+         "LITA" "'" "MDC" ">" "MDO" "<!" "MINUS" "-" "MSC" "]]" "NESTC" "{"
+         "NET" "}" "OPT" "?" "OR" "|" "PERO" "%" "PIC" ">" "PIO" "<?"
+         "PLUS" "+" "REFC" "." "REP" "*" "RNI" "#" "SEQ" "," "STAGO" ":"
+         "TAGC" "." "VI" "=" "MS-START" "<![" "MS-END" "]]>"
+         "XML-ECOM" "-->" "XML-PIC" "?>" "XML-SCOM" "<!--" "XML-TAGCE" "/>"
+         "NULL" ""))
+  (setq major-mode 'mdw-sgml-mode)
+  (setq mode-name "[mdw] SGML")
+  (run-hooks 'mdw-sgml-mode-hook))
+
 ;;;----- Shell scripts ------------------------------------------------------
 
 (defun mdw-setup-sh-script-mode ()
@@ -1688,7 +1749,7 @@ strip numbers instead."
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'message-mode-keywords)
   (let ((keywords
-        (make-regexp '("array" "bitmap" "callback" "docs[ \t]+enum"
+        (mdw-regexps '("array" "bitmap" "callback" "docs[ \t]+enum"
                        "export" "enum" "fixed-octetstring" "flags"
                        "harmless" "map" "nested" "optional"
                        "optional-tagged" "package" "primitive"
@@ -1733,7 +1794,7 @@ strip numbers instead."
   (setq comment-start "/* ")
   (setq comment-end " */")
   (let ((preprocessor-keywords
-        (make-regexp '("assert" "define" "elif" "else" "endif" "error"
+        (mdw-regexps '("assert" "define" "elif" "else" "endif" "error"
                       "ident" "if" "ifdef" "ifndef" "import" "include"
                       "line" "pragma" "unassert" "undef" "warning"))))
     (setq message-mode-keywords
@@ -1777,7 +1838,7 @@ strip numbers instead."
   (make-local-variable 'font-lock-defaults)
   (make-local-variable 'mallow-driver-mode-keywords)
   (let ((keywords
-        (make-regexp '("each" "divert" "file" "if"
+        (mdw-regexps '("each" "divert" "file" "if"
                        "perl" "set" "string" "type" "write"))))
     (setq mallow-driver-mode-keywords
          (list
@@ -1856,7 +1917,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\<[A-Z][a-zA-Z0-9]*\\>"
               '(0 font-lock-keyword-face))
         (list (concat "\\<0\\([xX][0-9a-fA-F_]+\\|[0-7_]+\\)\\|"
@@ -1897,7 +1957,6 @@ strip numbers instead."
   (make-local-variable 'font-lock-keywords)
   (setq font-lock-keywords
        (list
-        't
         (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
               '(0 mdw-punct-face)))))
 
@@ -1907,13 +1966,16 @@ strip numbers instead."
   (and mdw-auto-indent
        (indent-for-tab-command)))
 
+(defun mdw-setup-m4 ()
+  (mdw-standard-fill-prefix "\\([ \t]*\\(?:#+\\|\\<dnl\\>\\)[ \t]*\\)"))
+
 ;;;----- Text mode ----------------------------------------------------------
 
 (defun mdw-text-mode ()
   (setq fill-column 72)
   (flyspell-mode t)
   (mdw-standard-fill-prefix
-   "\\([ \t]*\\([A-Za-z0-9]*[>#|:] ?\\)*[ \t]*\\)" 3)
+   "\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
   (auto-fill-mode 1))
 
 ;;;----- Shell mode ---------------------------------------------------------
@@ -1924,7 +1986,7 @@ strip numbers instead."
            'comint-watch-for-password-prompt))
 
 (defun mdw-term-mode-setup ()
-  (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
+  (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *")
   (make-local-variable 'mouse-yank-at-point)
   (make-local-variable 'transient-mark-mode)
   (setq mouse-yank-at-point t)