el/dot-emacs.el: Allow `+' as a list item marker.
[profile] / el / dot-emacs.el
index cd0ee10..18e9fb2 100644 (file)
@@ -164,6 +164,25 @@ library."
       (other-window 1))
     (select-window win)))
 
+;; Transient mark mode hacks.
+
+(defadvice exchange-point-and-mark
+    (around mdw-highlight (&optional arg) activate compile)
+  "Maybe don't actually exchange point and mark.
+If `transient-mark-mode' is on and the mark is inactive, then
+just activate it.  A non-trivial prefix argument will force the
+usual behaviour.  A trivial prefix argument (i.e., just C-u) will
+activate the mark and temporarily enable `transient-mark-mode' if
+it's currently off."
+  (cond ((or mark-active
+            (and (not transient-mark-mode) (not arg))
+            (and arg (or (not (consp arg))
+                         (not (= (car arg) 4)))))
+        ad-do-it)
+       (t
+        (or transient-mark-mode (setq transient-mark-mode 'only))
+        (set-mark (mark t)))))
+
 ;; Functions for sexp diary entries.
 
 (defun mdw-weekday (l)
@@ -233,7 +252,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}
@@ -349,7 +368,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
@@ -419,6 +437,21 @@ in REST."
              (insert "\nNP: ")
              (insert-file-contents np-file)))))
 
+(defun mdw-version-< (ver-a ver-b)
+  "Answer whether VER-A is strictly earlier than VER-B.
+VER-A and VER-B are version numbers, which are strings containing digit
+sequences separated by `.'."
+  (let* ((la (mapcar (lambda (x) (car (read-from-string x)))
+                    (split-string ver-a "\\.")))
+        (lb (mapcar (lambda (x) (car (read-from-string x)))
+                    (split-string ver-b "\\."))))
+    (catch 'done
+      (while t
+       (cond ((null la) (throw 'done lb))
+             ((null lb) (throw 'done nil))
+             ((< (car la) (car lb)) (throw 'done t))
+             ((= (car la) (car lb)) (setq la (cdr la) lb (cdr lb))))))))
+
 (defun mdw-check-autorevert ()
   "Sets global-auto-revert-ignore-buffer appropriately for this buffer.
 This takes into consideration whether it's been found using
@@ -565,7 +598,7 @@ It in turn is a list of things:
 
 (defvar mdw-hanging-indents
   (concat "\\(\\("
-           "\\([*o]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
+           "\\([*o+]\\|-[-#]?\\|[0-9]+\\.\\|\\[[0-9]+\\]\\|([a-zA-Z])\\)"
            "[ \t]+"
          "\\)?\\)")
   "*Standard regexp matching parts of a hanging indent.
@@ -666,6 +699,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)
@@ -676,12 +717,13 @@ case."
             (t
              (local-set-key "\C-m" 'newline-and-indent))))
   (local-set-key [C-return] 'newline)
-  (make-variable-buffer-local 'page-delimiter)
+  (make-local-variable 'page-delimiter)
   (setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
   (setq comment-column 40)
   (auto-fill-mode 1)
   (setq fill-column 77)
   (setq show-trailing-whitespace t)
+  (mdw-whitespace-mode 1)
   (and (fboundp 'gtags-mode)
        (gtags-mode))
   (outline-minor-mode t)
@@ -689,9 +731,18 @@ case."
   (reveal-mode t)
   (trap (turn-on-font-lock)))
 
+(defun mdw-post-config-mode-hack ()
+  (mdw-whitespace-mode 1))
+
 (eval-after-load 'gtags
-  '(dolist (key '([mouse-2] [mouse-3]))
-     (define-key gtags-mode-map key nil)))
+  '(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.
 
@@ -724,11 +775,10 @@ doesn't match any of the regular expressions in
               (not (some (lambda (fr)
                            (message "checking frame %s" frame)
                            (and (not (eq fr frame))
-                                (string= (frame-parameter frame 'display)
+                                (string= (frame-parameter fr 'display)
                                          frame-display)
                                 (progn "frame %s still uses us" nil)))
                          (frame-list))))
-      (message "turn out the lights")
       (run-with-idle-timer 0 nil #'x-close-connection frame-display))))
 (add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
 
@@ -743,36 +793,49 @@ doesn't match any of the regular expressions in
      (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)
-  (t :foreground "white" :background "black"))
+  (((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)) :background "blue") (t :background "grey30"))
+  (((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
-  (t :foreground "blue" :background "yellow"
-     :box (:line-width 1 :style released-button)))
+  (((class color)) :foreground "blue" :background "yellow"
+                  :box (:line-width 1 :style released-button))
+  (t :inverse-video t))
 (mdw-define-face mode-line-inactive
-  (t :foreground "yellow" :background "blue"
-     :box (:line-width 1 :style released-button)))
+  (((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-face
-  (t :background "darkgreen"))
-(mdw-define-face show-paren-mismatch-face
-  (t :background "red"))
+(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
-  (t :background "DarkSeaGreen4"))
+  (((class color)) :background "DarkSeaGreen4")
+  (t :inverse-video t))
 
 (mdw-define-face holiday-face
   (t :background "red"))
@@ -782,35 +845,40 @@ doesn't match any of the regular expressions in
 (mdw-define-face comint-highlight-prompt
   (t :weight bold))
 (mdw-define-face comint-highlight-input
-  (t :slant italic))
+  (t nil))
 
 (mdw-define-face trailing-whitespace
-  (t :background "red"))
+  (((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 :weight bold))
+  (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
-  (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((class mono)) :weight bold)
+  (((type tty) (class color)) :foreground "green")
+  (t :slant italic :foreground "SeaGreen1"))
 (mdw-define-face font-lock-comment-face
-  (default :slant italic)
-  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+  (((class mono)) :weight bold)
+  (((type tty) (class color)) :foreground "green")
+  (t :slant italic :foreground "SeaGreen1"))
 (mdw-define-face font-lock-string-face
-  (t :foreground "SkyBlue1"))
-
+  (((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
@@ -851,7 +919,11 @@ doesn't match any of the regular expressions in
   (t :foreground "green"))
 (mdw-define-face diff-removed
   (t :foreground "red"))
-(mdw-define-face diff-context)
+(mdw-define-face diff-context
+  (t nil))
+
+(mdw-define-face erc-input-face
+  (t :foreground "red"))
 
 (mdw-define-face woman-bold
   (t :weight bold))
@@ -1102,7 +1174,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.
@@ -1154,7 +1228,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.
@@ -1216,7 +1292,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.
@@ -1283,12 +1361,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.
@@ -1344,7 +1459,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.
@@ -1391,7 +1508,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,
@@ -1415,6 +1534,7 @@ strip numbers instead."
 
   ;; Miscellaneous fiddling.
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
+  (setq indent-tabs-mode nil)
 
   ;; Now define fontification things.
   (make-local-variable 'font-lock-keywords)
@@ -1433,7 +1553,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.
 
@@ -1507,7 +1629,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.
@@ -1588,8 +1712,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))
 
 ;;;--------------------------------------------------------------------------
@@ -1615,7 +1740,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.
@@ -1688,7 +1814,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.
@@ -1738,7 +1866,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.
@@ -1775,7 +1905,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.
@@ -1809,7 +1941,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.
@@ -1843,7 +1977,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.
@@ -1909,7 +2045,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.
@@ -1918,7 +2056,7 @@ strip numbers instead."
   (interactive)
   (sgml-mode)
   (mdw-standard-fill-prefix "")
-  (make-variable-buffer-local 'sgml-delimiters)
+  (make-local-variable 'sgml-delimiters)
   (setq sgml-delimiters
        '("AND" "&" "COM" "--" "CRO" "&#" "DSC" "]" "DSO" "[" "DTGC" "]"
          "DTGO" "[" "ERO" "&" "ETAGO" ":e" "GRPC" ")" "GRPO" "(" "LIT" "\""
@@ -1960,6 +2098,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 ()
@@ -2146,7 +2313,7 @@ strip numbers instead."
 (defun mdw-setup-smalltalk ()
   (and mdw-auto-indent
        (local-set-key "\C-m" 'smalltalk-newline-and-indent))
-  (make-variable-buffer-local 'mdw-auto-indent)
+  (make-local-variable 'mdw-auto-indent)
   (setq mdw-auto-indent nil)
   (local-set-key "\C-i" 'smalltalk-reindent))
 
@@ -2161,7 +2328,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.
 
@@ -2184,7 +2352,7 @@ strip numbers instead."
        (multiple-value-bind . ((&whole 4 &rest 1) 4 &body))))))
 
 (defun mdw-common-lisp-indent ()
-  (make-variable-buffer-local 'lisp-indent-function)
+  (make-local-variable 'lisp-indent-function)
   (setq lisp-indent-function 'common-lisp-indent-function))
 
 (setq lisp-simple-loop-indentation 2
@@ -2201,7 +2369,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)
@@ -2237,7 +2407,7 @@ strip numbers instead."
 (setq hs-hide-comments-when-hiding-all nil)
 
 (defadvice hs-hide-all (after hide-first-comment activate)
-  (hs-hide-initial-comment-block))
+  (save-excursion (hs-hide-initial-comment-block)))
 
 ;;;--------------------------------------------------------------------------
 ;;; Shell mode.