(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'.
(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)))
- (ad-set-arg 1
- (cond ((null str) nil)
+ (let ((str (ad-get-arg 1))
+ (done nil) old)
+ (while (not done)
+ (setq old str)
+ (setq str (cond ((null str) nil)
+ ((string-match "\\(^\\|\n\\)[ \t]+" str)
+ (replace-match "\\1" nil nil str))
((and mdw-diary-for-org-mode-p
(string-match (concat
- "^[ \t]*"
+ "\\(^\\|\n\\)"
"\\(" diary-time-regexp
"\\(-" diary-time-regexp "\\)?"
- "\\)[ \t]+")
+ "\\)"
+ "\\(\t[ \t]*\\| [ \t]+\\)")
str))
- (replace-match "\\1 " nil nil str))
- ((string-match "^[ \t]+" str)
- (replace-match "" nil nil str))
+ (replace-match "\\1\\2 " nil nil str))
((and (not mdw-diary-for-org-mode-p)
(string-match "\\[\\[[^][]*]\\[\\([^][]*\\)]]"
str))
(replace-match "\\1" nil nil str))
- (t str))))))
+ (t str)))
+ (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.
(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.
(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)
(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"))
(mdw-define-face mdw-number-face
(mdw-define-face diff-refine-change
(((class color) (type x)) :background "RoyalBlue4")
(t :underline t))
+(mdw-define-face diff-refine-removed
+ (((class color) (type x)) :background "#500")
+ (t :underline t))
+(mdw-define-face diff-refine-added
+ (((class color) (type x)) :background "#050")
+ (t :underline t))
+
+(setq ediff-force-faces t)
+(mdw-define-face ediff-current-diff-A
+ (((class color) (type x)) :background "darkred")
+ (((class color) (type tty)) :background "red")
+ (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-A
+ (((class color) (type x)) :background "red3")
+ (((class color) (type tty)) :inverse-video t)
+ (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-A
+ (((class color) (type x)) :background "#300"))
+(mdw-define-face ediff-odd-diff-A
+ (((class color) (type x)) :background "#300"))
+(mdw-define-face ediff-current-diff-B
+ (((class color) (type x)) :background "darkgreen")
+ (((class color) (type tty)) :background "magenta")
+ (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-B
+ (((class color) (type x)) :background "green4")
+ (((class color) (type tty)) :inverse-video t)
+ (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-B
+ (((class color) (type x)) :background "#020"))
+(mdw-define-face ediff-odd-diff-B
+ (((class color) (type x)) :background "#020"))
+(mdw-define-face ediff-current-diff-C
+ (((class color) (type x)) :background "darkblue")
+ (((class color) (type tty)) :background "blue")
+ (t :inverse-video t))
+(mdw-define-face ediff-fine-diff-C
+ (((class color) (type x)) :background "blue1")
+ (((class color) (type tty)) :inverse-video t)
+ (t :inverse-video nil))
+(mdw-define-face ediff-even-diff-C
+ (((class color) (type x)) :background "#004"))
+(mdw-define-face ediff-odd-diff-C
+ (((class color) (type x)) :background "#004"))
+(mdw-define-face ediff-current-diff-Ancestor
+ (((class color) (type x)) :background "#630")
+ (((class color) (type tty)) :background "blue")
+ (t :inverse-video t))
+(mdw-define-face ediff-even-diff-Ancestor
+ (((class color) (type x)) :background "#320"))
+(mdw-define-face ediff-odd-diff-Ancestor
+ (((class color) (type x)) :background "#320"))
+
+(mdw-define-face magit-hash
+ (((class color) (type x)) :foreground "grey40")
+ (((class color) (type tty)) :foreground "blue"))
+(mdw-define-face magit-diff-hunk-heading
+ (((class color) (type x)) :foreground "grey70" :background "grey25")
+ (((class color) (type tty)) :foreground "yellow"))
+(mdw-define-face magit-diff-hunk-heading-highlight
+ (((class color) (type x)) :foreground "grey70" :background "grey35")
+ (((class color) (type tty)) :foreground "yellow" :background "blue"))
+(mdw-define-face magit-diff-added
+ (((class color) (type x)) :foreground "#ddffdd" :background "#335533")
+ (((class color) (type tty)) :foreground "green"))
+(mdw-define-face magit-diff-added-highlight
+ (((class color) (type x)) :foreground "#cceecc" :background "#336633")
+ (((class color) (type tty)) :foreground "green" :background "blue"))
+(mdw-define-face magit-diff-removed
+ (((class color) (type x)) :foreground "#ffdddd" :background "#553333")
+ (((class color) (type tty)) :foreground "red"))
+(mdw-define-face magit-diff-removed-highlight
+ (((class color) (type x)) :foreground "#eecccc" :background "#663333")
+ (((class color) (type tty)) :foreground "red" :background "blue"))
(mdw-define-face dylan-header-background
(((class color) (type x)) :background "NavyBlue")
(t :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 erc-input-face
(t :foreground "red"))
(inextern-lang . [0])
(label . 0)
(case-label . +)
- (access-label . -)
+ (access-label . -2)
(inclass . +)
(inline-open . ++)
(statement-cont . +)
"yield")))
;;;--------------------------------------------------------------------------
+;;; 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.
;; Icon indentation 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 ()
(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.
(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.
+
+(defun mdw-mpc-play-or-pause ()
+ (interactive)
+ (require 'mpc)
+ (if (member (cdr (assq 'state (mpc-cmd-status))) '("play"))
+ (mpc-pause)
+ (mpc-play)))
+
+(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)))))
+
+(autoload 'mpc-pause "mpc")
+(autoload 'mpc-next "mpc")
+(autoload 'mpc-prev "mpc")
+
+;;;--------------------------------------------------------------------------
;;; Inferior Emacs Lisp.
(setq comint-prompt-read-only t)