X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/e7186cbee63e87bc3d0f041f136ce101efbc5c26..60c22e1bb67d984e0c897e0970aca35620e6ceb8:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index bb8ccaa..80fc05a 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -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,63 @@ 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 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")) @@ -1450,28 +1511,108 @@ doesn't match any of the regular expressions in 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]*/?\\)" @@ -1490,11 +1631,7 @@ doesn't match any of the regular expressions in (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) @@ -1679,9 +1816,6 @@ doesn't match any of the regular expressions in (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) @@ -1719,25 +1853,22 @@ doesn't match any of the regular expressions in ;; 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. @@ -1916,25 +2047,22 @@ doesn't match any of the regular expressions in ;; 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. @@ -2247,21 +2375,19 @@ doesn't match any of the regular expressions in ;; 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. @@ -2425,6 +2551,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. @@ -2487,6 +2656,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 () @@ -2959,6 +3129,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. @@ -3479,6 +3668,56 @@ This allows you to pass a list of arguments through `ansi-term'." git-grep-command 'git-grep-history))) (grep command-args)) +(setq magit-diff-refine-hunk 'all + magit-view-git-manual-method 'man + 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) + (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) + ("LU" 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.