X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/e07e3320cb70a5e9dae0e424d03b9750458a4086..782c3e35937e7438daf6073cddafdf21f4fc36fd:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index 66b709f..404233b 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -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} @@ -682,20 +686,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 +720,183 @@ 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 frame '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) + (t :foreground "white" :background "black")) +(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")) +(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))) +(mdw-define-face mode-line-inactive + (t :foreground "yellow" :background "blue" + :box (:line-width 1 :style released-button))) +(mdw-define-face scroll-bar + (t :foreground "black" :background "lightgrey")) +(mdw-define-face fringe + (t :foreground "yellow")) +(mdw-define-face show-paren-match + (t :background "darkgreen")) +(mdw-define-face show-paren-mismatch + (t :background "red")) +(mdw-define-face highlight + (t :background "DarkSeaGreen4")) + +(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 + (t :slant italic)) + +(mdw-define-face trailing-whitespace + (t :background "red")) +(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 + (default :slant italic) + (((type tty)) :foreground "green") (t :foreground "SeaGreen1")) +(mdw-define-face font-lock-comment-face + (default :slant italic) + (((type tty)) :foreground "green") (t :foreground "SeaGreen1")) +(mdw-define-face font-lock-string-face + (t :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 +1305,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 +2285,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.