(concat "(" (buffer-string) ")")))))))
(cdr (assq sym mdw-config)))
+;; Width configuration.
+
+(defvar mdw-column-width
+ (string-to-number (or (mdw-config 'emacs-width) "77"))
+ "Width of Emacs columns.")
+(defvar mdw-text-width mdw-column-width
+ "Expected width of text within columns.")
+(put 'mdw-text-width 'safe-local-variable 'integerp)
+
;; Local variables hacking.
(defun run-local-vars-mode-hook ()
(interactive "P")
(setq width (cond (width (prefix-numeric-value width))
((and window-system (mdw-emacs-version-p 22))
- 77)
- (t 78)))
+ mdw-column-width)
+ (t (1+ mdw-column-width))))
(let* ((win (selected-window))
(sb-width (mdw-horizontal-window-overhead))
(c (/ (+ (window-width) sb-width)
ad-do-it)))
(mdw-advise-to-inhibit-raise-frame select-frame-set-input-focus)
+(mdw-advise-to-inhibit-raise-frame appt-disp-window)
;; Bug fix for markdown-mode, which breaks point positioning during
;; `query-replace'.
(or transient-mark-mode (setq transient-mark-mode 'only))
(set-mark (mark t)))))
+;; Improved compilation machinery.
+
+(setq compile-command
+ (let ((ncpu (with-temp-buffer
+ (insert-file-contents "/proc/cpuinfo")
+ (buffer-string)
+ (count-matches "^processor\\s-*:"))))
+ (format "make -j%d -k" (* 2 ncpu))))
+
+(defun mdw-compilation-buffer-name (mode)
+ (concat "*" (downcase mode) ": "
+ (abbreviate-file-name default-directory) "*"))
+(setq compilation-buffer-name-function 'mdw-compilation-buffer-name)
+
+(eval-after-load "compile"
+ '(progn
+ (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile)))
+
+(defun mdw-compile (command &optional directory comint)
+ "Initiate a compilation COMMAND, maybe in a different DIRECTORY.
+The DIRECTORY may be nil to not change. If COMINT is t, then
+start an interactive compilation.
+
+Interactively, prompt for the command if the variable
+`compilation-read-command' is non-nil, or if requested through
+the prefix argument. Prompt for the directory, and run
+interactively, if requested through the prefix.
+
+Use a prefix of 4, 6, 12, or 14, or type C-u between one and three times, to
+force prompting for a directory.
+
+Use a prefix of 2, 6, 10, or 14, or type C-u three times, to force
+prompting for the command.
+
+Use a prefix of 8, 10, 12, or 14, or type C-u twice or three times,
+to force interactive compilation."
+ (interactive
+ (let* ((prefix (prefix-numeric-value current-prefix-arg))
+ (command (eval compile-command))
+ (dir (and (plusp (logand prefix #x54))
+ (read-directory-name "Compile in directory: "))))
+ (list (if (or compilation-read-command
+ (plusp (logand prefix #x42)))
+ (compilation-read-command command)
+ command)
+ dir
+ (plusp (logand prefix #x58)))))
+ (let ((default-directory (or directory default-directory)))
+ (compile command comint)))
+
;; Functions for sexp diary entries.
(defun mdw-not-org-mode (form)
(let ((mdw-diary-for-org-mode-p t))
ad-do-it))
-(defadvice diary-add-to-list (before mdw-trim-leading-space activate)
+(defadvice diary-add-to-list (before mdw-trim-leading-space compile activate)
"Trim leading space from the diary entry string."
(save-match-data
(let ((str (ad-get-arg 1))
(if (equal str old) (setq done t)))
(ad-set-arg 1 str))))
+(defadvice org-bbdb-anniversaries (after mdw-fixup-list compile activate)
+ "Return a string rather than a list."
+ (with-temp-buffer
+ (let ((anyp nil))
+ (dolist (e (let ((ee ad-return-value))
+ (if (atom ee) (list ee) ee)))
+ (when e
+ (when anyp (insert ?\n))
+ (insert e)
+ (setq anyp t)))
+ (setq ad-return-value
+ (and anyp (buffer-string))))))
+
;; Fighting with Org-mode's evil key maps.
(defvar mdw-evil-keymap-keys
(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))))))))
+ ((= (car la) (car lb)) (setq la (cdr la) lb (cdr lb)))
+ (t (throw 'done nil)))))))
(defun mdw-check-autorevert ()
"Sets global-auto-revert-ignore-buffer appropriately for this buffer.
(ad-set-arg 0 dir)
ad-do-it)))
+(defun mdw-dired-run (args &optional syncp)
+ (interactive (let ((file (dired-get-filename t)))
+ (list (read-string (format "Arguments for %s: " file))
+ current-prefix-arg)))
+ (funcall (if syncp 'shell-command 'async-shell-command)
+ (concat (shell-quote-argument (dired-get-filename nil))
+ " " args)))
+
+(eval-after-load "dired"
+ '(define-key dired-mode-map "X" 'mdw-dired-run))
+
;;;--------------------------------------------------------------------------
;;; URL viewing.
(setq page-delimiter "\f\\|^.*-\\{6\\}.*$")
(setq comment-column 40)
(auto-fill-mode 1)
- (setq fill-column 77)
+ (setq fill-column mdw-text-width)
(and (fboundp 'gtags-mode)
(gtags-mode))
(if (fboundp 'hs-minor-mode)
(trap (turn-on-font-lock)))
(defun mdw-post-local-vars-misc-mode-config ()
+ (setq whitespace-line-column mdw-text-width)
(when (and mdw-do-misc-mode-hacking
(not buffer-read-only))
(setq show-trailing-whitespace t)
(add-hook 'delete-frame-functions 'mdw-last-one-out-turn-off-the-lights)
;;;--------------------------------------------------------------------------
-;;; Where is point?
-
-(defvar mdw-point-overlay
- (let ((ov (make-overlay 0 0))
- (s "."))
- (overlay-put ov 'priority 2)
- (put-text-property 0 1 'display '(left-fringe vertical-bar) s)
- (overlay-put ov 'before-string s)
- (delete-overlay ov)
- ov)
- "An overlay used for showing where point is in the selected window.")
-
-(defun mdw-remove-point-overlay ()
- "Remove the current-point overlay."
- (delete-overlay mdw-point-overlay))
-
-(defun mdw-update-point-overlay ()
- "Mark the current point position with an overlay."
- (if (not mdw-point-overlay-mode)
- (mdw-remove-point-overlay)
- (overlay-put mdw-point-overlay 'window (selected-window))
- (if (bolp)
- (move-overlay mdw-point-overlay
- (point) (1+ (point)) (current-buffer))
- (move-overlay mdw-point-overlay
- (1- (point)) (point) (current-buffer)))))
-
-(defvar mdw-point-overlay-buffers nil
- "List of buffers using `mdw-point-overlay-mode'.")
-
-(define-minor-mode mdw-point-overlay-mode
- "Indicate current line with an overlay."
- :global nil
- (let ((buffer (current-buffer)))
- (setq mdw-point-overlay-buffers
- (mapcan (lambda (buf)
- (if (and (buffer-live-p buf)
- (not (eq buf buffer)))
- (list buf)))
- mdw-point-overlay-buffers))
- (if mdw-point-overlay-mode
- (setq mdw-point-overlay-buffers
- (cons buffer mdw-point-overlay-buffers))))
- (cond (mdw-point-overlay-buffers
- (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
- (add-hook 'post-command-hook 'mdw-update-point-overlay))
- (t
- (mdw-remove-point-overlay)
- (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
- (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
-
-(define-globalized-minor-mode mdw-global-point-overlay-mode
- mdw-point-overlay-mode
- (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
-
-;;;--------------------------------------------------------------------------
;;; Fullscreen-ness.
(defvar mdw-full-screen-parameters
(mdw-define-face variable-pitch
(((type x)) :family "helvetica" :height 90)))
(mdw-define-face region
- (((type tty) (class color)) :background "blue")
- (((type tty) (class mono)) :inverse-video t)
- (t :background "grey30"))
+ (((min-colors 64)) :background "grey30")
+ (((class color)) :background "blue")
+ ((t) :inverse-video t))
(mdw-define-face match
- (((type tty) (class color)) :background "blue")
- (((type tty) (class mono)) :inverse-video t)
- (t :background "blue"))
+ (((class color)) :background "blue")
+ (t :inverse-video t))
(mdw-define-face mc/cursor-face
- (((type tty) (class mono)) :inverse-video t)
- (t :background "red"))
+ (((class color)) :background "red")
+ (t :inverse-video t))
(mdw-define-face minibuffer-prompt
(t :weight bold))
(mdw-define-face mode-line
(mdw-define-face fringe
(t :foreground "yellow"))
(mdw-define-face show-paren-match
- (((class color)) :background "darkgreen")
+ (((min-colors 64)) :background "darkgreen")
+ (((class color)) :background "green")
(t :underline t))
(mdw-define-face show-paren-mismatch
(((class color)) :background "red")
(t :inverse-video t))
(mdw-define-face highlight
- (((type x) (class color)) :background "DarkSeaGreen4")
- (((type tty) (class color)) :background "cyan")
+ (((min-colors 64)) :background "DarkSeaGreen4")
+ (((class color)) :background "cyan")
(t :inverse-video t))
(mdw-define-face holiday-face
(mdw-define-face comint-highlight-input
(t nil))
+(mdw-define-face ido-subdir
+ (t :foreground "cyan" :weight bold))
+
(mdw-define-face dired-directory
(t :foreground "cyan" :weight bold))
(mdw-define-face dired-symlink
(mdw-define-face trailing-whitespace
(((class color)) :background "red")
(t :inverse-video t))
+(mdw-define-face whitespace-line
+ (((class color)) :background "darkred")
+ (t :inverse-video t))
(mdw-define-face mdw-punct-face
- (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+ (((min-colors 64)) :foreground "burlywood2")
+ (((class color)) :foreground "yellow"))
(mdw-define-face mdw-number-face
(t :foreground "yellow"))
(mdw-define-face mdw-trivial-face)
(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"))
+ (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+ (((class color)) :foreground "green")
+ (t :weight bold))
(mdw-define-face font-lock-comment-face
- (((class mono)) :weight bold)
- (((type tty) (class color)) :foreground "green")
- (t :slant italic :foreground "SeaGreen1"))
+ (((min-colors 64)) :slant italic :foreground "SeaGreen1")
+ (((class color)) :foreground "green")
+ (t :weight bold))
(mdw-define-face font-lock-string-face
- (((class mono)) :weight bold)
- (((class color)) :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan")
+ (t :weight bold))
(mdw-define-face message-separator
(t :background "red" :foreground "white" :weight bold))
(mdw-define-face message-cited-text
(default :slant italic)
- (((type tty)) :foreground "cyan") (t :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face message-header-cc
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-newsgroups
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-subject
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-to
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-xheader
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-other
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face message-header-name
(default :weight bold)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face which-func
(t nil))
(mdw-define-face gnus-header-name
(default :weight bold)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-subject
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-from
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-to
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-header-content
(default :slant italic)
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-cite-1
- (((type tty)) :foreground "cyan") (t :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face gnus-cite-2
- (((type tty)) :foreground "blue") (t :foreground "RoyalBlue2"))
+ (((min-colors 64)) :foreground "RoyalBlue2")
+ (((class color)) :foreground "blue"))
(mdw-define-face gnus-cite-3
- (((type tty)) :foreground "magenta") (t :foreground "MediumOrchid"))
+ (((min-colors 64)) :foreground "MediumOrchid")
+ (((class color)) :foreground "magenta"))
(mdw-define-face gnus-cite-4
- (((type tty)) :foreground "red") (t :foreground "firebrick2"))
+ (((min-colors 64)) :foreground "firebrick2")
+ (((class color)) :foreground "red"))
(mdw-define-face gnus-cite-5
- (((type tty)) :foreground "yellow") (t :foreground "burlywood2"))
+ (((min-colors 64)) :foreground "burlywood2")
+ (((class color)) :foreground "yellow"))
(mdw-define-face gnus-cite-6
- (((type tty)) :foreground "green") (t :foreground "SeaGreen1"))
+ (((min-colors 64)) :foreground "SeaGreen1")
+ (((class color)) :foreground "green"))
(mdw-define-face gnus-cite-7
- (((type tty)) :foreground "cyan") (t :foreground "SlateBlue1"))
+ (((min-colors 64)) :foreground "SlateBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face gnus-cite-8
- (((type tty)) :foreground "blue") (t :foreground "RoyalBlue2"))
+ (((min-colors 64)) :foreground "RoyalBlue2")
+ (((class color)) :foreground "blue"))
(mdw-define-face gnus-cite-9
- (((type tty)) :foreground "magenta") (t :foreground "purple2"))
+ (((min-colors 64)) :foreground "purple2")
+ (((class color)) :foreground "magenta"))
(mdw-define-face gnus-cite-10
- (((type tty)) :foreground "red") (t :foreground "DarkOrange2"))
+ (((min-colors 64)) :foreground "DarkOrange2")
+ (((class color)) :foreground "red"))
(mdw-define-face gnus-cite-11
(t :foreground "grey"))
(mdw-define-face diff-file-header
(t :weight bold))
(mdw-define-face diff-hunk-header
- (t :foreground "SkyBlue1"))
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face diff-function
- (t :foreground "SkyBlue1" :weight bold))
+ (default :weight bold)
+ (((min-colors 64)) :foreground "SkyBlue1")
+ (((class color)) :foreground "cyan"))
(mdw-define-face diff-header
- (t :background "grey10"))
+ (((min-colors 64)) :background "grey10"))
(mdw-define-face diff-added
- (t :foreground "green"))
+ (((class color)) :foreground "green"))
(mdw-define-face diff-removed
- (t :foreground "red"))
+ (((class color)) :foreground "red"))
(mdw-define-face diff-context
(t nil))
(mdw-define-face diff-refine-change
- (((class color) (type x)) :background "RoyalBlue4")
+ (((min-colors 64)) :background "RoyalBlue4")
+ (t :underline t))
+(mdw-define-face diff-refine-removed
+ (((min-colors 64)) :background "#500")
+ (t :underline t))
+(mdw-define-face diff-refine-added
+ (((min-colors 64)) :background "#050")
(t :underline t))
-(mdw-define-face dylan-header-background
- (((class color) (type x)) :background "NavyBlue")
- (t :background "blue"))
+(setq ediff-force-faces t)
+(mdw-define-face ediff-current-diff-A
+ (((min-colors 64)) :background "darkred")
+ (((class color)) :background "red")
+ (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-A
+ (((min-colors 64)) :background "red3")
+ (((class color)) :inverse-video t)
+ (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-A
+ (((min-colors 64)) :background "#300"))
+(mdw-define-face ediff-odd-diff-A
+ (((min-colors 64)) :background "#300"))
+(mdw-define-face ediff-current-diff-B
+ (((min-colors 64)) :background "darkgreen")
+ (((class color)) :background "magenta")
+ (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-B
+ (((min-colors 64)) :background "green4")
+ (((class color)) :inverse-video t)
+ (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-B
+ (((min-colors 64)) :background "#020"))
+(mdw-define-face ediff-odd-diff-B
+ (((min-colors 64)) :background "#020"))
+(mdw-define-face ediff-current-diff-C
+ (((min-colors 64)) :background "darkblue")
+ (((class color)) :background "blue")
+ (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-C
+ (((min-colors 64)) :background "blue1")
+ (((class color)) :inverse-video t)
+ (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-C
+ (((min-colors 64)) :background "#004"))
+(mdw-define-face ediff-odd-diff-C
+ (((min-colors 64)) :background "#004"))
+(mdw-define-face ediff-current-diff-Ancestor
+ (((min-colors 64)) :background "#630")
+ (((class color)) :background "blue")
+ (t :inverse-video t))
+(mdw-define-face ediff-even-diff-Ancestor
+ (((min-colors 64)) :background "#320"))
+(mdw-define-face ediff-odd-diff-Ancestor
+ (((min-colors 64)) :background "#320"))
+
+(mdw-define-face magit-hash
+ (((min-colors 64)) :foreground "grey40")
+ (((class color)) :foreground "blue"))
+(mdw-define-face magit-diff-hunk-heading
+ (((min-colors 64)) :foreground "grey70" :background "grey25")
+ (((class color)) :foreground "yellow"))
+(mdw-define-face magit-diff-hunk-heading-highlight
+ (((min-colors 64)) :foreground "grey70" :background "grey35")
+ (((class color)) :foreground "yellow" :background "blue"))
+(mdw-define-face magit-diff-added
+ (((min-colors 64)) :foreground "#ddffdd" :background "#335533")
+ (((class color)) :foreground "green"))
+(mdw-define-face magit-diff-added-highlight
+ (((min-colors 64)) :foreground "#cceecc" :background "#336633")
+ (((class color)) :foreground "green" :background "blue"))
+(mdw-define-face magit-diff-removed
+ (((min-colors 64)) :foreground "#ffdddd" :background "#553333")
+ (((class color)) :foreground "red"))
+(mdw-define-face magit-diff-removed-highlight
+ (((min-colors 64)) :foreground "#eecccc" :background "#663333")
+ (((class color)) :foreground "red" :background "blue"))
-(mdw-define-face magit-diff-add
- (t :foreground "green"))
-(mdw-define-face magit-diff-del
- (t :foreground "red"))
-(mdw-define-face magit-diff-file-header
- (t :weight bold))
-(mdw-define-face magit-diff-hunk-header
- (t :foreground "SkyBlue1"))
-(mdw-define-face magit-item-highlight
- (((type tty)) :background "blue")
- (t :background "grey11"))
-(mdw-define-face magit-log-head-label-remote
- (((type tty)) :background "cyan" :foreground "green")
- (t :background "grey11" :foreground "DarkSeaGreen2" :box t))
-(mdw-define-face magit-log-head-label-local
- (((type tty)) :background "cyan" :foreground "yellow")
- (t :background "grey11" :foreground "LightSkyBlue1" :box t))
-(mdw-define-face magit-log-head-label-tags
- (((type tty)) :background "red" :foreground "yellow")
- (t :background "LemonChiffon1" :foreground "goldenrod4" :box t))
-(mdw-define-face magit-log-graph
- (((type tty)) :foreground "magenta")
- (t :foreground "grey80"))
+(mdw-define-face dylan-header-background
+ (((min-colors 64)) :background "NavyBlue")
+ (((class color)) :background "blue"))
(mdw-define-face erc-input-face
(t :foreground "red"))
(set-display-table-slot standard-display-table 5 bar))
;;;--------------------------------------------------------------------------
+;;; Where is point?
+
+(mdw-define-face mdw-point-overlay
+ (((type graphic)))
+ (((min-colors 64)) :background "darkblue")
+ (((class color)) :background "blue")
+ (((type tty) (class mono)) :inverse-video t))
+
+(defvar mdw-point-overlay-fringe-display '(vertical-bar . vertical-bar))
+
+(defun mdw-configure-point-overlay ()
+ (let ((ov (make-overlay 0 0)))
+ (overlay-put ov 'priority 0)
+ (let* ((fringe (or mdw-point-overlay-fringe-display (cons nil nil)))
+ (left (car fringe)) (right (cdr fringe))
+ (s ""))
+ (when left
+ (let ((ss "."))
+ (put-text-property 0 1 'display `(left-fringe ,left) ss)
+ (setq s (concat s ss))))
+ (when right
+ (let ((ss "."))
+ (put-text-property 0 1 'display `(right-fringe ,right) ss)
+ (setq s (concat s ss))))
+ (when (or left right)
+ (overlay-put ov 'before-string s)))
+ (overlay-put ov 'face 'mdw-point-overlay)
+ (delete-overlay ov)
+ ov))
+
+(defvar mdw-point-overlay (mdw-configure-point-overlay)
+ "An overlay used for showing where point is in the selected window.")
+(defun mdw-reconfigure-point-overlay ()
+ (interactive)
+ (setq mdw-point-overlay (mdw-configure-point-overlay)))
+
+(defun mdw-remove-point-overlay ()
+ "Remove the current-point overlay."
+ (delete-overlay mdw-point-overlay))
+
+(defun mdw-update-point-overlay ()
+ "Mark the current point position with an overlay."
+ (if (not mdw-point-overlay-mode)
+ (mdw-remove-point-overlay)
+ (overlay-put mdw-point-overlay 'window (selected-window))
+ (move-overlay mdw-point-overlay
+ (line-beginning-position)
+ (+ (line-end-position) 1))))
+
+(defvar mdw-point-overlay-buffers nil
+ "List of buffers using `mdw-point-overlay-mode'.")
+
+(define-minor-mode mdw-point-overlay-mode
+ "Indicate current line with an overlay."
+ :global nil
+ (let ((buffer (current-buffer)))
+ (setq mdw-point-overlay-buffers
+ (mapcan (lambda (buf)
+ (if (and (buffer-live-p buf)
+ (not (eq buf buffer)))
+ (list buf)))
+ mdw-point-overlay-buffers))
+ (if mdw-point-overlay-mode
+ (setq mdw-point-overlay-buffers
+ (cons buffer mdw-point-overlay-buffers))))
+ (cond (mdw-point-overlay-buffers
+ (add-hook 'pre-command-hook 'mdw-remove-point-overlay)
+ (add-hook 'post-command-hook 'mdw-update-point-overlay))
+ (t
+ (mdw-remove-point-overlay)
+ (remove-hook 'pre-command-hook 'mdw-remove-point-overlay)
+ (remove-hook 'post-command-hook 'mdw-update-point-overlay))))
+
+(define-globalized-minor-mode mdw-global-point-overlay-mode
+ mdw-point-overlay-mode
+ (lambda () (if (not (minibufferp)) (mdw-point-overlay-mode t))))
+
+;;;--------------------------------------------------------------------------
;;; C programming configuration.
;; Make C indentation nice.
(inextern-lang . [0])
(label . 0)
(case-label . +)
- (access-label . -)
+ (access-label . -2)
(inclass . +)
(inline-open . ++)
(statement-cont . +)
(list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)"
'(0 mdw-punct-face))))))
+(define-derived-mode sod-mode c-mode "Sod"
+ "Major mode for editing Sod code.")
+(push '("\\.sod$" . sod-mode) auto-mode-alist)
+
;;;--------------------------------------------------------------------------
;;; AP calc mode.
(list
;; Handle the keywords defined above.
- (list (concat "\\<\\(" rust-keywords "\\)\\>")
+ (list (concat "\\_<\\(" rust-keywords "\\)\\_>")
'(0 font-lock-keyword-face))
- (list (concat "\\<\\(" rust-builtins "\\)\\>")
+ (list (concat "\\_<\\(" rust-builtins "\\)\\_>")
'(0 font-lock-variable-name-face))
;; Handle numbers too.
- (list (concat "\\<\\("
+ (list (concat "\\_<\\("
"[0-9][0-9_]*"
"\\(" "\\(\\.[0-9_]+\\)?[eE][-+]?[0-9_]+"
"\\|" "\\.[0-9_]+"
"\\|" "0b[01_]+"
"\\)"
"\\([ui]\\(8\\|16\\|32\\|64\\|s\\|size\\)\\)?"
- "\\)\\>")
+ "\\)\\_>")
'(0 mdw-number-face))
;; And anything else is punctuation.
(defun mdw-fontify-pyrex ()
(mdw-fontify-pythonic
(mdw-regexps "and" "as" "assert" "break" "cdef" "class" "continue"
- "ctypedef" "def" "del" "elif" "else" "except" "exec"
+ "ctypedef" "def" "del" "elif" "else" "enum" "except" "exec"
"extern" "finally" "for" "from" "global" "if"
"import" "in" "is" "lambda" "not" "or" "pass" "print"
- "raise" "return" "struct" "try" "while" "with"
+ "property" "raise" "return" "struct" "try" "while" "with"
"yield")))
+(define-derived-mode pyrex-mode python-mode "Pyrex"
+ "Major mode for editing Pyrex source code")
+(setq auto-mode-alist
+ (append '(("\\.pyx$" . pyrex-mode)
+ ("\\.pxd$" . pyrex-mode)
+ ("\\.pxi$" . pyrex-mode))
+ auto-mode-alist))
+
+;;;--------------------------------------------------------------------------
+;;; Lua programming style.
+
+(setq lua-indent-level 2)
+
+(defun mdw-fontify-lua ()
+
+ ;; Miscellaneous fiddling.
+ (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
+
+ ;; Now define fontification things.
+ (make-local-variable 'font-lock-keywords)
+ (let ((lua-keywords
+ (mdw-regexps "and" "break" "do" "else" "elseif" "end"
+ "false" "for" "function" "goto" "if" "in" "local"
+ "nil" "not" "or" "repeat" "return" "then" "true"
+ "until" "while")))
+ (setq font-lock-keywords
+ (list
+
+ ;; Set up the keywords defined above.
+ (list (concat "\\_<\\(" lua-keywords "\\)\\_>")
+ '(0 font-lock-keyword-face))
+
+ ;; At least numbers are simpler than C.
+ (list (concat "\\_<\\(" "0[xX]"
+ "\\(" "[0-9a-fA-F]+"
+ "\\(\\.[0-9a-fA-F]*\\)?"
+ "\\|" "\\.[0-9a-fA-F]+"
+ "\\)"
+ "\\([pP][-+]?[0-9]+\\)?"
+ "\\|" "\\(" "[0-9]+"
+ "\\(\\.[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))))))
+
;;;--------------------------------------------------------------------------
;;; Icon programming style.
(modify-syntax-entry ?. "w")
(modify-syntax-entry ?\n ">")
(setf fill-prefix nil)
+ (local-set-key ";" 'self-insert-command)
(mdw-standard-fill-prefix "\\([ \t]*;+[ \t]*\\)"))
(defun mdw-asm-set-comment ()
(local-set-key [?$] 'self-insert-command)
;; Make `tab' be useful, given that tab stops in TeX don't work well.
- (local-set-key "\C-i" 'indent-relative)
+ (local-set-key "\C-\M-i" 'indent-relative)
(setq indent-tabs-mode nil)
;; Set fill prefix.
(list "[$^_{}#&]"
'(0 mdw-punct-face)))))
+(eval-after-load 'font-latex
+ '(defun font-latex-jit-lock-force-redisplay (buf start end)
+ "Compatibility for Emacsen not offering `jit-lock-force-redisplay'."
+ ;; The following block is an expansion of `jit-lock-force-redisplay'
+ ;; and involved macros taken from CVS Emacs on 2007-04-28.
+ (with-current-buffer buf
+ (let ((modified (buffer-modified-p)))
+ (unwind-protect
+ (let ((buffer-undo-list t)
+ (inhibit-read-only t)
+ (inhibit-point-motion-hooks t)
+ (inhibit-modification-hooks t)
+ deactivate-mark
+ buffer-file-name
+ buffer-file-truename)
+ (put-text-property start end 'fontified t))
+ (unless modified
+ (restore-buffer-modified-p nil)))))))
+
;;;--------------------------------------------------------------------------
;;; SGML hacking.
"\\([ \t]*\\([>#|:] ?\\)*[ \t]*\\)" 3)
(auto-fill-mode 1))
+(eval-after-load "flyspell"
+ '(define-key flyspell-mode-map "\C-\M-i" nil))
+
;;;--------------------------------------------------------------------------
;;; Outline and hide/show modes.
(grep command-args))
;;;--------------------------------------------------------------------------
+;;; Magit configuration.
+
+(setq magit-diff-refine-hunk 'all
+ magit-view-git-manual-method 'man
+ magit-log-margin '(nil age magit-log-margin-width t 18)
+ magit-wip-after-save-local-mode-lighter ""
+ magit-wip-after-apply-mode-lighter ""
+ magit-wip-before-change-mode-lighter "")
+(eval-after-load "magit"
+ '(progn (global-magit-file-mode 1)
+ (magit-wip-after-save-mode 1)
+ (magit-wip-after-apply-mode 1)
+ (magit-wip-before-change-mode 1)
+ (add-to-list 'magit-no-confirm 'safe-with-wip)
+ (push '(:eval (if (or magit-wip-after-save-local-mode
+ magit-wip-after-apply-mode
+ magit-wip-before-change-mode)
+ (format " wip:%s%s%s"
+ (if magit-wip-after-apply-mode "A" "")
+ (if magit-wip-before-change-mode "C" "")
+ (if magit-wip-after-save-local-mode "S" ""))))
+ minor-mode-alist)
+ (dolist (popup '(magit-diff-popup
+ magit-diff-refresh-popup
+ magit-diff-mode-refresh-popup
+ magit-revision-mode-refresh-popup))
+ (magit-define-popup-switch popup ?R "Reverse diff" "-R"))))
+
+(setq magit-repolist-columns
+ '(("Name" 16 magit-repolist-column-ident nil)
+ ("Version" 18 magit-repolist-column-version nil)
+ ("St" 2 magit-repolist-column-dirty nil)
+ ("L<U" 3 mdw-repolist-column-unpulled-from-upstream nil)
+ ("L>U" 3 mdw-repolist-column-unpushed-to-upstream nil)
+ ("Path" 32 magit-repolist-column-path nil)))
+
+(setq magit-repository-directories '(("~/etc/profile" . 0)
+ ("~/src/" . 1)))
+
+(defadvice magit-list-repos (around mdw-dirname () activate compile)
+ "Make sure the returned names are directory names.
+Otherwise child processes get started in the wrong directory and
+there is sadness."
+ (setq ad-return-value (mapcar #'file-name-as-directory ad-do-it)))
+
+(defun mdw-repolist-column-unpulled-from-upstream (_id)
+ "Insert number of upstream commits not in the current branch."
+ (let ((upstream (magit-get-upstream-branch (magit-get-current-branch) t)))
+ (and upstream
+ (let ((n (cadr (magit-rev-diff-count "HEAD" upstream))))
+ (propertize (number-to-string n) 'face
+ (if (> n 0) 'bold 'shadow))))))
+
+(defun mdw-repolist-column-unpushed-to-upstream (_id)
+ "Insert number of commits in the current branch but not its upstream."
+ (let ((upstream (magit-get-upstream-branch (magit-get-current-branch) t)))
+ (and upstream
+ (let ((n (car (magit-rev-diff-count "HEAD" upstream))))
+ (propertize (number-to-string n) 'face
+ (if (> n 0) 'bold 'shadow))))))
+
+;;;--------------------------------------------------------------------------
+;;; MPC configuration.
+
+(eval-when-compile (trap (require 'mpc)))
+
+(setq mpc-browser-tags '(Artist|Composer|Performer Album|Playlist))
+
+(defun mdw-mpc-now-playing ()
+ (interactive)
+ (require 'mpc)
+ (save-excursion
+ (set-buffer (mpc-proc-cmd (mpc-proc-cmd-list '("status" "currentsong"))))
+ (mpc--status-callback))
+ (let ((state (cdr (assq 'state mpc-status))))
+ (cond ((member state '("stop"))
+ (message "mpd stopped."))
+ ((member state '("play" "pause"))
+ (let* ((artist (cdr (assq 'Artist mpc-status)))
+ (album (cdr (assq 'Album mpc-status)))
+ (title (cdr (assq 'Title mpc-status)))
+ (file (cdr (assq 'file mpc-status)))
+ (duration-string (cdr (assq 'Time mpc-status)))
+ (time-string (cdr (assq 'time mpc-status)))
+ (time (and time-string
+ (string-to-number
+ (if (string-match ":" time-string)
+ (substring time-string
+ 0 (match-beginning 0))
+ (time-string)))))
+ (duration (and duration-string
+ (string-to-number duration-string)))
+ (pos (and time duration
+ (format " [%d:%02d/%d:%02d]"
+ (/ time 60) (mod time 60)
+ (/ duration 60) (mod duration 60))))
+ (fmt (cond ((and artist title)
+ (format "`%s' by %s%s" title artist
+ (if album (format ", from `%s'" album)
+ "")))
+ (file
+ (format "`%s' (no tags)" file))
+ (t
+ "(no idea what's playing!)"))))
+ (if (string= state "play")
+ (message "mpd playing %s%s" fmt (or pos ""))
+ (message "mpd paused in %s%s" fmt (or pos "")))))
+ (t
+ (message "mpd in unknown state `%s'" state)))))
+
+(defmacro mdw-define-mpc-wrapper (func bvl interactive &rest body)
+ `(defun ,func ,bvl
+ (interactive ,@interactive)
+ (require 'mpc)
+ ,@body
+ (mdw-mpc-now-playing)))
+
+(mdw-define-mpc-wrapper mdw-mpc-play-or-pause () nil
+ (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
+ (mpc-pause)
+ (mpc-play)))
+
+(mdw-define-mpc-wrapper mdw-mpc-next () nil (mpc-next))
+(mdw-define-mpc-wrapper mdw-mpc-prev () nil (mpc-prev))
+(mdw-define-mpc-wrapper mdw-mpc-stop () nil (mpc-stop))
+
+(defun mdw-mpc-louder (step)
+ (interactive (list (if current-prefix-arg
+ (prefix-numeric-value current-prefix-arg)
+ +10)))
+ (mpc-proc-cmd (format "volume %+d" step)))
+
+(defun mdw-mpc-quieter (step)
+ (interactive (list (if current-prefix-arg
+ (prefix-numeric-value current-prefix-arg)
+ +10)))
+ (mpc-proc-cmd (format "volume %+d" (- step))))
+
+(defun mdw-mpc-hack-lines (arg interactivep func)
+ (if (and interactivep (use-region-p))
+ (let ((from (region-beginning)) (to (region-end)))
+ (goto-char from)
+ (beginning-of-line)
+ (funcall func)
+ (forward-line)
+ (while (< (point) to)
+ (funcall func)
+ (forward-line)))
+ (let ((n (prefix-numeric-value arg)))
+ (cond ((minusp n)
+ (unless (bolp)
+ (beginning-of-line)
+ (funcall func)
+ (incf n))
+ (while (minusp n)
+ (forward-line -1)
+ (funcall func)
+ (incf n)))
+ (t
+ (beginning-of-line)
+ (while (plusp n)
+ (funcall func)
+ (forward-line)
+ (decf n)))))))
+
+(defun mdw-mpc-select-one ()
+ (when (and (get-char-property (point) 'mpc-file)
+ (not (get-char-property (point) 'mpc-select)))
+ (mpc-select-toggle)))
+
+(defun mdw-mpc-unselect-one ()
+ (when (get-char-property (point) 'mpc-select)
+ (mpc-select-toggle)))
+
+(defun mdw-mpc-select (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+
+(defun mdw-mpc-unselect (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-backwards (arg)
+ (interactive "p")
+ (mdw-mpc-hack-lines (- arg) t 'mdw-mpc-unselect-one))
+
+(defun mdw-mpc-unselect-all ()
+ (interactive)
+ (setq mpc-select nil)
+ (mpc-selection-refresh))
+
+(defun mdw-mpc-next-line (arg)
+ (interactive "p")
+ (beginning-of-line)
+ (forward-line arg))
+
+(defun mdw-mpc-previous-line (arg)
+ (interactive "p")
+ (beginning-of-line)
+ (forward-line (- arg)))
+
+(defun mdw-mpc-playlist-add (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (let ((mpc-select mpc-select))
+ (when (or arg (and interactivep (use-region-p)))
+ (setq mpc-select nil)
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+ (setq mpc-select (reverse mpc-select))
+ (mpc-playlist-add)))
+
+(defun mdw-mpc-playlist-delete (&optional arg interactivep)
+ (interactive (list current-prefix-arg t))
+ (setq mpc-select (nreverse mpc-select))
+ (mpc-select-save
+ (when (or arg (and interactivep (use-region-p)))
+ (setq mpc-select nil)
+ (mpc-selection-refresh)
+ (mdw-mpc-hack-lines arg interactivep 'mdw-mpc-select-one))
+ (mpc-playlist-delete)))
+
+(defun mdw-mpc-hack-tagbrowsers ()
+ (setq-local mode-line-format
+ '("%e"
+ mode-line-frame-identification
+ mode-line-buffer-identification)))
+(add-hook 'mpc-tagbrowser-mode-hook 'mdw-mpc-hack-tagbrowsers)
+
+(defun mdw-mpc-hack-songs ()
+ (setq-local header-line-format
+ ;; '("MPC " mpc-volume " " mpc-current-song)
+ (list (propertize " " 'display '(space :align-to 0))
+ ;; 'mpc-songs-format-description
+ '(:eval
+ (let ((deactivate-mark) (hscroll (window-hscroll)))
+ (with-temp-buffer
+ (mpc-format mpc-songs-format 'self hscroll)
+ ;; That would be simpler than the hscroll handling in
+ ;; mpc-format, but currently move-to-column does not
+ ;; recognize :space display properties.
+ ;; (move-to-column hscroll)
+ ;; (delete-region (point-min) (point))
+ (buffer-string)))))))
+(add-hook 'mpc-songs-mode-hook 'mdw-mpc-hack-songs)
+
+(eval-after-load "mpc"
+ '(progn
+ (define-key mpc-mode-map "m" 'mdw-mpc-select)
+ (define-key mpc-mode-map "u" 'mdw-mpc-unselect)
+ (define-key mpc-mode-map "\177" 'mdw-mpc-unselect-backwards)
+ (define-key mpc-mode-map "\e\177" 'mdw-mpc-unselect-all)
+ (define-key mpc-mode-map "n" 'mdw-mpc-next-line)
+ (define-key mpc-mode-map "p" 'mdw-mpc-previous-line)
+ (define-key mpc-mode-map "/" 'mpc-songs-search)
+ (setq mpc-songs-mode-map (make-sparse-keymap))
+ (set-keymap-parent mpc-songs-mode-map mpc-mode-map)
+ (define-key mpc-songs-mode-map "l" 'mpc-playlist)
+ (define-key mpc-songs-mode-map "+" 'mdw-mpc-playlist-add)
+ (define-key mpc-songs-mode-map "-" 'mdw-mpc-playlist-delete)
+ (define-key mpc-songs-mode-map "\r" 'mpc-songs-jump-to)))
+
+;;;--------------------------------------------------------------------------
;;; Inferior Emacs Lisp.
(setq comint-prompt-read-only t)