chiark / gitweb /
el/dot-emacs.el: Better fontification for Ediff.
[profile] / el / dot-emacs.el
index 7d3bc10f0e9f55f7ac9b88302ffc3cea073fbcfa..d83057a9880827fc61a9145e485494bd6e89e718 100644 (file)
@@ -102,6 +102,15 @@ (defun mdw-config (sym)
                    (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 @@ (defun mdw-divvy-window (&optional width)
   (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 @@ (defmacro mdw-advise-to-inhibit-raise-frame (function)
        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 @@ (defadvice org-agenda-list (around mdw-preserve-links activate)
   (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.
 
@@ -963,7 +991,7 @@ (defun mdw-misc-mode-config ()
   (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,16 +1001,27 @@ (defun mdw-misc-mode-config ()
   (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-whitespace-mode 1)))
 (add-hook 'hack-local-variables-hook 'mdw-post-local-vars-misc-mode-config)
 
-(defadvice toggle-read-only (after mdw-angry-fruit-salad activate)
-  (when mdw-do-misc-mode-hacking
-    (setq show-trailing-whitespace (not buffer-read-only))
-    (mdw-whitespace-mode (if buffer-read-only 0 1))))
+(defmacro mdw-advise-update-angry-fruit-salad (&rest funcs)
+  `(progn ,@(mapcar (lambda (func)
+                     `(defadvice ,func
+                          (after mdw-angry-fruit-salad activate)
+                        (when mdw-do-misc-mode-hacking
+                          (setq show-trailing-whitespace
+                                (not buffer-read-only))
+                          (mdw-whitespace-mode (if buffer-read-only 0 1)))))
+                   funcs)))
+(mdw-advise-update-angry-fruit-salad toggle-read-only
+                                    read-only-mode
+                                    view-mode
+                                    view-mode-enable
+                                    view-mode-disable)
 
 (eval-after-load 'gtags
   '(progn
@@ -1209,6 +1248,9 @@ (mdw-define-face dired-perm-write
 (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
@@ -1325,6 +1367,58 @@ (mdw-define-face diff-context
 (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 dylan-header-background
   (((class color) (type x)) :background "NavyBlue")
@@ -1422,17 +1516,6 @@ (let ((dollar (make-glyph-code ?$ 'mdw-ellipsis-face))
 ;;;--------------------------------------------------------------------------
 ;;; C programming configuration.
 
-;; Linux kernel hacking.
-
-(defvar linux-c-mode-hook)
-
-(defun linux-c-mode ()
-  (interactive)
-  (c-mode)
-  (setq major-mode 'linux-c-mode)
-  (setq mode-name "Linux C")
-  (run-hooks 'linux-c-mode-hook))
-
 ;; Make C indentation nice.
 
 (defun mdw-c-lineup-arglist (langelem)
@@ -1451,28 +1534,108 @@ (defun mdw-c-indent-extern-mumble (langelem)
        c-basic-offset
       nil)))
 
-(defun mdw-c-style ()
-  (c-add-style "[mdw] C and C++ style"
-              '((c-basic-offset . 2)
-                (comment-column . 40)
-                (c-class-key . "class")
-                (c-backslash-column . 72)
-                (c-offsets-alist
-                 (substatement-open . (add 0 c-indent-one-line-block))
-                 (defun-open . (add 0 c-indent-one-line-block))
-                 (arglist-cont-nonempty . mdw-c-lineup-arglist)
-                 (topmost-intro . mdw-c-indent-extern-mumble)
-                 (cpp-define-intro . 0)
-                 (knr-argdecl . 0)
-                 (inextern-lang . [0])
-                 (label . 0)
-                 (case-label . +)
-                 (access-label . -)
-                 (inclass . +)
-                 (inline-open . ++)
-                 (statement-cont . +)
-                 (statement-case-intro . +)))
-              t))
+(defun mdw-c-indent-arglist-nested (langelem)
+  "Indent continued argument lists.
+If we've nested more than one argument list, then only introduce a single
+indentation anyway."
+  (let ((context c-syntactic-context)
+       (pos (c-langelem-2nd-pos c-syntactic-element))
+       (should-indent-p t))
+    (while (and context
+               (eq (caar context) 'arglist-cont-nonempty))
+      (when (and (= (caddr (pop context)) pos)
+                context
+                (memq (caar context) '(arglist-intro
+                                       arglist-cont-nonempty)))
+       (setq should-indent-p nil)))
+    (if should-indent-p '+ 0)))
+
+(defvar mdw-define-c-styles-hook nil
+  "Hook run when `cc-mode' starts up to define styles.")
+
+(defmacro mdw-define-c-style (name &rest assocs)
+  "Define a C style, called NAME (a symbol), setting ASSOCs.
+A function, named `mdw-define-c-style/NAME', is defined to actually install
+the style using `c-add-style', and added to the hook
+`mdw-define-c-styles-hook'.  If CC Mode is already loaded, then the style is
+set."
+  (declare (indent defun))
+  (let* ((name-string (symbol-name name))
+        (func (intern (concat "mdw-define-c-style/" name-string))))
+    `(progn
+       (defun ,func () (c-add-style ,name-string ',assocs))
+       (and (featurep 'cc-mode) (,func))
+       (add-hook 'mdw-define-c-styles-hook ',func))))
+
+(eval-after-load "cc-mode"
+  '(run-hooks 'mdw-define-c-styles-hook))
+
+(mdw-define-c-style mdw-trustonic-c
+  (c-basic-offset . 4)
+  (comment-column . 0)
+  (c-indent-comment-alist (anchored-comment . (column . 0))
+                         (end-block . (space . 1))
+                         (cpp-end-block . (space . 1))
+                         (other . (space . 1)))
+  (c-class-key . "class")
+  (c-backslash-column . 0)
+  (c-auto-align-backslashes . nil)
+  (c-label-minimum-indentation . 0)
+  (c-offsets-alist (substatement-open . (add 0 c-indent-one-line-block))
+                  (defun-open . (add 0 c-indent-one-line-block))
+                  (arglist-cont-nonempty . mdw-c-indent-arglist-nested)
+                  (topmost-intro . mdw-c-indent-extern-mumble)
+                  (cpp-define-intro . 0)
+                  (knr-argdecl . 0)
+                  (inextern-lang . [0])
+                  (label . 0)
+                  (case-label . +)
+                  (access-label . -2)
+                  (inclass . +)
+                  (inline-open . ++)
+                  (statement-cont . +)
+                  (statement-case-intro . +)))
+
+(mdw-define-c-style mdw-c
+  (c-basic-offset . 2)
+  (comment-column . 40)
+  (c-class-key . "class")
+  (c-backslash-column . 72)
+  (c-label-minimum-indentation . 0)
+  (c-offsets-alist (substatement-open . (add 0 c-indent-one-line-block))
+                  (defun-open . (add 0 c-indent-one-line-block))
+                  (arglist-cont-nonempty . mdw-c-lineup-arglist)
+                  (topmost-intro . mdw-c-indent-extern-mumble)
+                  (cpp-define-intro . 0)
+                  (knr-argdecl . 0)
+                  (inextern-lang . [0])
+                  (label . 0)
+                  (case-label . +)
+                  (access-label . -)
+                  (inclass . +)
+                  (inline-open . ++)
+                  (statement-cont . +)
+                  (statement-case-intro . +)))
+
+(defun mdw-set-default-c-style (modes style)
+  "Update the default CC Mode style for MODES to be STYLE.
+
+MODES may be a list of major mode names or a singleton.  STYLE is a style
+name, as a symbol."
+  (let ((modes (if (listp modes) modes (list modes)))
+       (style (symbol-name style)))
+    (setq c-default-style
+         (append (mapcar (lambda (mode)
+                           (cons mode style))
+                         modes)
+                 (remove-if (lambda (assoc)
+                              (memq (car assoc) modes))
+                            (if (listp c-default-style)
+                                c-default-style
+                              (list (cons 'other c-default-style))))))))
+(setq c-default-style "mdw-c")
+
+(mdw-set-default-c-style '(c-mode c++-mode) 'mdw-c)
 
 (defvar mdw-c-comment-fill-prefix
   `((,(concat "\\([ \t]*/?\\)"
@@ -1491,11 +1654,7 @@ (defun mdw-fontify-c-and-c++ ()
   (modify-syntax-entry ?\n "> b")
 
   ;; Other stuff.
-  (mdw-c-style)
-  (setq c-hanging-comment-ender-p nil
-       c-backslash-column 72
-       c-label-minimum-indentation 0
-       mdw-fill-prefix mdw-c-comment-fill-prefix)
+  (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
   (make-local-variable 'font-lock-keywords)
@@ -1670,12 +1829,8 @@ (defun mdw-fontify-c-and-c++ ()
 ;;;--------------------------------------------------------------------------
 ;;; AP calc mode.
 
-(defun apcalc-mode ()
-  (interactive)
-  (c-mode)
-  (setq major-mode 'apcalc-mode)
-  (setq mode-name "AP Calc")
-  (run-hooks 'apcalc-mode-hook))
+(define-derived-mode apcalc-mode c-mode "AP Calc"
+  "Major mode for editing Calc code.")
 
 (defun mdw-fontify-apcalc ()
 
@@ -1684,9 +1839,6 @@ (defun mdw-fontify-apcalc ()
   (modify-syntax-entry ?/ ". 14")
 
   ;; Other stuff.
-  (mdw-c-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
   (setq comment-start "/* ")
   (setq comment-end " */")
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
@@ -1724,25 +1876,22 @@ (defun mdw-fontify-apcalc ()
 
 ;; Make indentation nice.
 
-(defun mdw-java-style ()
-  (c-add-style "[mdw] Java style"
-              '((c-basic-offset . 2)
-                (c-offsets-alist (substatement-open . 0)
-                                 (label . +)
-                                 (case-label . +)
-                                 (access-label . 0)
-                                 (inclass . +)
-                                 (statement-case-intro . +)))
-              t))
+(mdw-define-c-style mdw-java
+  (c-basic-offset . 2)
+  (c-backslash-column . 72)
+  (c-offsets-alist (substatement-open . 0)
+                  (label . +)
+                  (case-label . +)
+                  (access-label . 0)
+                  (inclass . +)
+                  (statement-case-intro . +)))
+(mdw-set-default-c-style 'java-mode 'mdw-java)
 
 ;; Declare Java fontification style.
 
 (defun mdw-fontify-java ()
 
   ;; Other stuff.
-  (mdw-java-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
@@ -1921,25 +2070,22 @@ (defun mdw-fontify-scala ()
 
 ;; Make indentation nice.
 
-(defun mdw-csharp-style ()
-  (c-add-style "[mdw] C# style"
-              '((c-basic-offset . 2)
-                (c-offsets-alist (substatement-open . 0)
-                                 (label . 0)
-                                 (case-label . +)
-                                 (access-label . 0)
-                                 (inclass . +)
-                                 (statement-case-intro . +)))
-              t))
+(mdw-define-c-style mdw-csharp
+  (c-basic-offset . 2)
+  (c-backslash-column . 72)
+  (c-offsets-alist (substatement-open . 0)
+                  (label . 0)
+                  (case-label . +)
+                  (access-label . 0)
+                  (inclass . +)
+                  (statement-case-intro . +)))
+(mdw-set-default-c-style 'csharp-mode 'mdw-csharp)
 
 ;; Declare C# fontification style.
 
 (defun mdw-fontify-csharp ()
 
   ;; Other stuff.
-  (mdw-csharp-style)
-  (setq c-hanging-comment-ender-p nil)
-  (setq c-backslash-column 72)
   (setq mdw-fill-prefix mdw-c-comment-fill-prefix)
 
   ;; Now define things to be fontified.
@@ -2252,21 +2398,19 @@ (defun mdw-fontify-rust ()
 
 ;; Make Awk indentation nice.
 
-(defun mdw-awk-style ()
-  (c-add-style "[mdw] Awk style"
-              '((c-basic-offset . 2)
-                (c-offsets-alist (substatement-open . 0)
-                                 (statement-cont . 0)
-                                 (statement-case-intro . +)))
-              t))
+(mdw-define-c-style mdw-awk
+  (c-basic-offset . 2)
+  (c-offsets-alist (substatement-open . 0)
+                  (c-backslash-column . 72)
+                  (statement-cont . 0)
+                  (statement-case-intro . +)))
+(mdw-set-default-c-style 'awk-mode 'mdw-awk)
 
 ;; Declare Awk fontification style.
 
 (defun mdw-fontify-awk ()
 
   ;; Miscellaneous fiddling.
-  (mdw-awk-style)
-  (setq c-backslash-column 72)
   (mdw-standard-fill-prefix "\\([ \t]*#+[ \t]*\\)")
 
   ;; Now define things to be fontified.
@@ -2492,6 +2636,7 @@ (defun mdw-fontify-asm ()
   (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 ()