(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)
(dolist (key replacements)
(define-key keymap key binding))))))
-(eval-after-load "org"
+(eval-after-load "org-latex"
'(progn
(push '("strayman"
"\\documentclass{strayman}
(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
(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
(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)
+ (let ((whitespace-style (remove 'trailing whitespace-style)))
+ (trap (whitespace-mode t)))
(and (fboundp 'gtags-mode)
(gtags-mode))
(outline-minor-mode t)
(reveal-mode t)
(trap (turn-on-font-lock)))
+(defun mdw-post-config-mode-hack ()
+ (let ((whitespace-style (remove 'trailing whitespace-style)))
+ (trap (whitespace-mode t))))
+
(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.
(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)
+(defvar mdw-frame-parameters-alist
+ '((nil (menu-bar-lines . 0))))
+(defun mdw-set-frame-parameters (frame)
+ (let ((params (assq (if (fboundp 'window-system)
+ (window-system frame)
+ window-system)
+ mdw-frame-parameters-alist)))
+ (when params
+ (modify-frame-parameters frame (cdr params)))))
+(add-hook 'after-make-frame-functions 'mdw-set-frame-parameters)
+
;;;--------------------------------------------------------------------------
;;; General fontification.
(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"))
(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
(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))
;; 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.
;; 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.
;; 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.
;; 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.
;; 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.
;; 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,
;; 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.
;; 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.
;; 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))
;;;--------------------------------------------------------------------------
"\\([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.
;; 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.
;; 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.
"\\([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.
(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.
;; Fontify TeX special characters as punctuation.
(list "[{}]+"
- '(0 mdw-punct-face)))))
+ '(0 mdw-punct-face))))
+
+ (mdw-post-config-mode-hack))
;;;--------------------------------------------------------------------------
;;; TeX and LaTeX configuration.
;; Fontify TeX special characters as punctuation.
(list "[$^_{}#&]"
- '(0 mdw-punct-face)))))
+ '(0 mdw-punct-face))))
+
+ (mdw-post-config-mode-hack))
;;;--------------------------------------------------------------------------
;;; SGML hacking.
(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" "\""
(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 ()
(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))
"\\([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.
(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
(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)
(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.