dot/emacs, el/dot-emacs.el: Whitespace fixing.
[profile] / el / dot-emacs.el
index dc5529d..eec1dcf 100644 (file)
@@ -48,6 +48,8 @@ This may be at the expense of cool features.")
 
 (defmacro mdw-regexps (&rest list)
   "Turn a LIST of strings into a single regular expression at compile-time."
+  (declare (indent nil)
+          (debug 0))
   `',(make-regexp list))
 
 ;; Some error trapping.
@@ -57,6 +59,8 @@ This may be at the expense of cool features.")
 
 (defmacro trap (&rest forms)
   "Execute FORMS without allowing errors to propagate outside."
+  (declare (indent 0)
+          (debug t))
   `(condition-case err
        ,(if (cdr forms) (cons 'progn forms) (car forms))
      (error (message "Error (trapped): %s in %s"
@@ -229,7 +233,7 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'."
        (dolist (key replacements)
          (define-key keymap key binding))))))
 
-(eval-after-load "org"
+(eval-after-load "org-latex"
   '(progn
      (push '("strayman"
             "\\documentclass{strayman}
@@ -345,7 +349,6 @@ probably become garbage."
                          (car alists)
                          (cdr alists)))))
 
-
 (defun mdw-do-uniquify (done end l rest)
   "A helper function for mdw-uniquify-alist.
 The DONE argument is a list whose first element is `nil'.  It
@@ -682,20 +685,18 @@ case."
        (gtags-mode))
   (outline-minor-mode t)
   (hs-minor-mode t)
-  (mdw-set-font))
+  (reveal-mode t)
+  (trap (turn-on-font-lock)))
 
 (eval-after-load 'gtags
-  '(dolist (key '([mouse-2] [mouse-3]))
-     (define-key gtags-mode-map key nil)))
-
-;; Set up all sorts of faces.
-
-(defvar mdw-set-font nil)
-
-(defvar mdw-punct-face 'mdw-punct-face "Face to use for punctuation")
-(make-face 'mdw-punct-face)
-(defvar mdw-number-face 'mdw-number-face "Face to use for numbers")
-(make-face 'mdw-number-face)
+  '(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.
 
@@ -718,130 +719,193 @@ doesn't match any of the regular expressions in
           answer))))
 (setq backup-enable-predicate 'mdw-backup-enable-predicate)
 
+;; Frame cleanup.
+
+(defun mdw-last-one-out-turn-off-the-lights (frame)
+  "Disconnect from an X display if this was the last frame on that display."
+  (let ((frame-display (frame-parameter frame 'display)))
+    (when (and frame-display
+              (eq window-system 'x)
+              (not (some (lambda (fr)
+                           (message "checking frame %s" frame)
+                           (and (not (eq fr frame))
+                                (string= (frame-parameter fr 'display)
+                                         frame-display)
+                                (progn "frame %s still uses us" nil)))
+                         (frame-list))))
+      (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)
+
 ;;;--------------------------------------------------------------------------
 ;;; General fontification.
 
-(defun mdw-set-fonts (frame faces)
-  (while faces
-    (let ((face (caar faces)))
-      (or (facep face) (make-face face))
-      (set-face-attribute face frame
-                         :family 'unspecified
-                         :width 'unspecified
-                         :height 'unspecified
-                         :weight 'unspecified
-                         :slant 'unspecified
-                         :foreground 'unspecified
-                         :background 'unspecified
-                         :underline 'unspecified
-                         :overline 'unspecified
-                         :strike-through 'unspecified
-                         :box 'unspecified
-                         :inverse-video 'unspecified
-                         :stipple 'unspecified
-                         ;:font 'unspecified
-                         :inherit 'unspecified)
-      (apply 'set-face-attribute face frame (cdar faces))
-      (setq faces (cdr faces)))))
-
-(defun mdw-do-set-font (&optional frame)
-  (interactive)
-  (mdw-set-fonts (and (boundp 'frame) frame)  `(
-    (default :foreground "white" :background "black"
-      ,@(cond ((eq window-system 'w32)
-              '(:family "courier new" :height 85))
-             ((eq window-system 'x)
-              '(:family "misc-fixed" :height 130 :width semi-condensed))))
-    (fixed-pitch)
-    (minibuffer-prompt)
-    (mode-line :foreground "blue" :background "yellow"
-              :box (:line-width 1 :style released-button))
-    (mode-line-inactive :foreground "yellow" :background "blue"
-                       :box (:line-width 1 :style released-button))
-    (scroll-bar :foreground "black" :background "lightgrey")
-    (fringe :foreground "yellow" :background "black")
-    (show-paren-match-face :background "darkgreen")
-    (show-paren-mismatch-face :background "red")
-    (font-lock-warning-face :background "red" :weight bold)
-    (highlight :background "DarkSeaGreen4")
-    (holiday-face :background "red")
-    (calendar-today-face :foreground "yellow" :weight bold)
-    (comint-highlight-prompt :weight bold)
-    (comint-highlight-input)
-    (font-lock-builtin-face :weight bold)
-    (font-lock-type-face :weight bold)
-    (region :background ,(if window-system "grey30" "blue"))
-    (isearch :background "palevioletred2")
-    (mdw-punct-face :foreground ,(if window-system "burlywood2" "yellow"))
-    (mdw-number-face :foreground "yellow")
-    (font-lock-function-name-face :weight bold)
-    (font-lock-variable-name-face :slant italic)
-    (font-lock-comment-delimiter-face
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :slant italic)
-    (font-lock-comment-face
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :slant italic)
-    (font-lock-string-face :foreground ,(if window-system "SkyBlue1" "cyan"))
-    (font-lock-keyword-face :weight bold)
-    (font-lock-constant-face :weight bold)
-    (font-lock-reference-face :weight bold)
-    (message-cited-text
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :slant italic)
-    (message-separator :background "red" :foreground "white" :weight bold)
-    (message-header-cc
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-newsgroups
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-subject
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-to
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-xheader
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-other
-       :foreground ,(if window-system "SeaGreen1" "green")
-       :weight bold)
-    (message-header-name
-       :foreground ,(if window-system "SeaGreen1" "green"))
-    (woman-bold :weight bold)
-    (woman-italic :slant italic)
-    (p4-depot-added-face :foreground "green")
-    (p4-depot-branch-op-face :foreground "yellow")
-    (p4-depot-deleted-face :foreground "red")
-    (p4-depot-unmapped-face
-       :foreground ,(if window-system "SkyBlue1" "cyan"))
-    (p4-diff-change-face :foreground "yellow")
-    (p4-diff-del-face :foreground "red")
-    (p4-diff-file-face :foreground "SkyBlue1")
-    (p4-diff-head-face :background "grey10")
-    (p4-diff-ins-face :foreground "green")
-    (diff-index :weight bold)
-    (diff-file-header :weight bold)
-    (diff-hunk-header :foreground "SkyBlue1")
-    (diff-function :foreground "SkyBlue1" :weight bold)
-    (diff-header :background "grey10")
-    (diff-added :foreground "green")
-    (diff-removed :foreground "red")
-    (diff-context)
-    (whizzy-slice-face :background "grey10")
-    (whizzy-error-face :background "darkred")
-    (trailing-whitespace :background "red")
-)))
-
-(defun mdw-set-font ()
-  (trap
-    (turn-on-font-lock)
-    (if (not mdw-set-font)
-       (progn
-         (setq mdw-set-font t)
-         (mdw-do-set-font nil)))))
+(defmacro mdw-define-face (name &rest body)
+  "Define a face, and make sure it's actually set as the definition."
+  (declare (indent 1)
+          (debug 0))
+  `(progn
+     (make-face ',name)
+     (defvar ,name ',name)
+     (put ',name 'face-defface-spec ',body)
+     (face-spec-set ',name ',body nil)))
+
+(mdw-define-face default
+  (((type w32)) :family "courier new" :height 85)
+  (((type x)) :family "6x13" :height 130)
+  (((type color)) :foreground "white" :background "black")
+  (t nil))
+(mdw-define-face fixed-pitch
+  (((type w32)) :family "courier new" :height 85)
+  (((type x)) :family "6x13" :height 130)
+  (t :foreground "white" :background "black"))
+(if (>= emacs-major-version 23)
+    (mdw-define-face variable-pitch
+      (((type x)) :family "sans" :height 100))
+  (mdw-define-face variable-pitch
+    (((type x)) :family "helvetica" :height 120)))
+(mdw-define-face region
+  (((type tty) (class color)) :background "blue")
+  (((type tty) (class mono)) :inverse-video t)
+  (t :background "grey30"))
+(mdw-define-face minibuffer-prompt
+  (t :weight bold))
+(mdw-define-face mode-line
+  (((class color)) :foreground "blue" :background "yellow"
+                  :box (:line-width 1 :style released-button))
+  (t :inverse-video t))
+(mdw-define-face mode-line-inactive
+  (((class color)) :foreground "yellow" :background "blue"
+                  :box (:line-width 1 :style released-button))
+  (t :inverse-video t))
+(mdw-define-face scroll-bar
+  (t :foreground "black" :background "lightgrey"))
+(mdw-define-face fringe
+  (t :foreground "yellow"))
+(mdw-define-face show-paren-match
+  (((class color)) :background "darkgreen")
+  (t :underline t))
+(mdw-define-face show-paren-mismatch
+  (((class color)) :background "red")
+  (t :inverse-video t))
+(mdw-define-face highlight
+  (((class color)) :background "DarkSeaGreen4")
+  (t :inverse-video t))
+
+(mdw-define-face holiday-face
+  (t :background "red"))
+(mdw-define-face calendar-today-face
+  (t :foreground "yellow" :weight bold))
+
+(mdw-define-face comint-highlight-prompt
+  (t :weight bold))
+(mdw-define-face comint-highlight-input)
+
+(mdw-define-face trailing-whitespace
+  (((class color)) :background "red")
+  (t :inverse-video t))
+(mdw-define-face mdw-punct-face
+  (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+(mdw-define-face mdw-number-face
+  (t :foreground "yellow"))
+(mdw-define-face font-lock-function-name-face
+  (t :slant italic))
+(mdw-define-face font-lock-keyword-face
+  (t :weight bold))
+(mdw-define-face font-lock-constant-face
+  (t :slant italic))
+(mdw-define-face font-lock-builtin-face
+  (t :weight bold))
+(mdw-define-face font-lock-type-face
+  (t :weight bold :slant italic))
+(mdw-define-face font-lock-reference-face
+  (t :weight bold))
+(mdw-define-face font-lock-variable-name-face
+  (t :slant italic))
+(mdw-define-face font-lock-comment-delimiter-face
+  (((class mono)) :weight bold)
+  (((type tty) (class color)) :foreground "green")
+  (t :slant italic :foreground "SeaGreen1"))
+(mdw-define-face font-lock-comment-face
+  (((class mono)) :weight bold)
+  (((type tty) (class color)) :foreground "green")
+  (t :slant italic :foreground "SeaGreen1"))
+(mdw-define-face font-lock-string-face
+  (((class mono)) :weight bold)
+  (((class color)) :foreground "SkyBlue1"))
+(mdw-define-face message-separator
+  (t :background "red" :foreground "white" :weight bold))
+(mdw-define-face message-cited-text
+  (default :slant italic)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-cc
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-newsgroups
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-subject
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-to
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-xheader
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-other
+  (default :weight bold)
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+(mdw-define-face message-header-name
+  (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+
+(mdw-define-face diff-index
+  (t :weight bold))
+(mdw-define-face diff-file-header
+  (t :weight bold))
+(mdw-define-face diff-hunk-header
+  (t :foreground "SkyBlue1"))
+(mdw-define-face diff-function
+  (t :foreground "SkyBlue1" :weight bold))
+(mdw-define-face diff-header
+  (t :background "grey10"))
+(mdw-define-face diff-added
+  (t :foreground "green"))
+(mdw-define-face diff-removed
+  (t :foreground "red"))
+(mdw-define-face diff-context)
+
+(mdw-define-face erc-input-face
+  (t :foreground "red"))
+
+(mdw-define-face woman-bold
+  (t :weight bold))
+(mdw-define-face woman-italic
+  (t :slant italic))
+
+(mdw-define-face p4-depot-added-face
+  (t :foreground "green"))
+(mdw-define-face p4-depot-branch-op-face
+  (t :foreground "yellow"))
+(mdw-define-face p4-depot-deleted-face
+  (t :foreground "red"))
+(mdw-define-face p4-depot-unmapped-face
+  (t :foreground "SkyBlue1"))
+(mdw-define-face p4-diff-change-face
+  (t :foreground "yellow"))
+(mdw-define-face p4-diff-del-face
+  (t :foreground "red"))
+(mdw-define-face p4-diff-file-face
+  (t :foreground "SkyBlue1"))
+(mdw-define-face p4-diff-head-face
+  (t :background "grey10"))
+(mdw-define-face p4-diff-ins-face
+  (t :foreground "green"))
+
+(mdw-define-face whizzy-slice-face
+  (t :background "grey10"))
+(mdw-define-face whizzy-error-face
+  (t :background "darkred"))
 
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
@@ -1250,6 +1314,39 @@ doesn't match any of the regular expressions in
   "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))))))
+
+;;;--------------------------------------------------------------------------
 ;;; Awk programming configuration.
 
 ;; Make Awk indentation nice.
@@ -2197,6 +2294,9 @@ strip numbers instead."
 
 (setq hs-hide-comments-when-hiding-all nil)
 
+(defadvice hs-hide-all (after hide-first-comment activate)
+  (save-excursion (hs-hide-initial-comment-block)))
+
 ;;;--------------------------------------------------------------------------
 ;;; Shell mode.
 
@@ -2230,6 +2330,21 @@ strip numbers instead."
      (define-key term-raw-map [M-left] 'term-send-meta-left)
      (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left)))
 
+;;;--------------------------------------------------------------------------
+;;; Inferior Emacs Lisp.
+
+(setq comint-prompt-read-only t)
+
+(eval-after-load "comint"
+  '(progn
+     (define-key comint-mode-map "\C-w" 'comint-kill-region)
+     (define-key comint-mode-map [C-S-backspace] 'comint-kill-whole-line)))
+
+(eval-after-load "ielm"
+  '(progn
+     (define-key ielm-map "\C-w" 'comint-kill-region)
+     (define-key ielm-map [C-S-backspace] 'comint-kill-whole-line)))
+
 ;;;----- That's all, folks --------------------------------------------------
 
 (provide 'dot-emacs)