el/dot-emacs.el: Split the Magit configuration into its own section.
[profile] / el / dot-emacs.el
index a2989fe..704c486 100644 (file)
@@ -102,6 +102,15 @@ This may be at the expense of cool features.")
                    (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 ()
@@ -196,8 +205,8 @@ fringes is not taken out of the allowance for WIDTH, unlike
   (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)
@@ -230,6 +239,7 @@ frame is actually mapped on the screen."
        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'.
@@ -370,27 +380,45 @@ as output rather than a string."
   (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.
 
@@ -693,7 +721,8 @@ sequences separated by `.'."
        (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.
@@ -963,7 +992,7 @@ case."
   (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)
@@ -973,6 +1002,7 @@ case."
   (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)
@@ -1219,6 +1249,9 @@ doesn't match any of the regular expressions in
 (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
@@ -1335,35 +1368,85 @@ doesn't match any of the regular expressions in
 (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"))
 
@@ -1506,7 +1589,7 @@ set."
                   (inextern-lang . [0])
                   (label . 0)
                   (case-label . +)
-                  (access-label . -)
+                  (access-label . -2)
                   (inclass . +)
                   (inline-open . ++)
                   (statement-cont . +)
@@ -2490,6 +2573,49 @@ strip numbers instead."
                "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.
@@ -2552,6 +2678,7 @@ strip numbers instead."
   (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 ()
@@ -3024,6 +3151,25 @@ strip numbers instead."
         (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.
 
@@ -3545,6 +3691,68 @@ This allows you to pass a list of arguments through `ansi-term'."
   (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))))))
+
+;;;--------------------------------------------------------------------------
 ;;; Inferior Emacs Lisp.
 
 (setq comint-prompt-read-only t)