X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/50d3dd032afd25cc6a777984d254e77a3a28371c..b6f44b18d89f8dae5dd00791d42504d37a2e9907:/el/dot-emacs.el diff --git a/el/dot-emacs.el b/el/dot-emacs.el index 04eb3c0..1c484e6 100644 --- a/el/dot-emacs.el +++ b/el/dot-emacs.el @@ -200,13 +200,16 @@ fringes is not taken out of the allowance for WIDTH, unlike ((>= width 0) (+ width (mdw-horizontal-window-overhead))) ((< width 0) width)))) +(defun mdw-preferred-column-width () + "Return the preferred column width." + (if (and window-system (mdw-emacs-version-p 22)) mdw-column-width + (1+ mdw-column-width))) + (defun mdw-divvy-window (&optional width) "Split a wide window into appropriate widths." (interactive "P") - (setq width (cond (width (prefix-numeric-value width)) - ((and window-system (mdw-emacs-version-p 22)) - mdw-column-width) - (t (1+ mdw-column-width)))) + (setq width (if width (prefix-numeric-value width) + (mdw-preferred-column-width))) (let* ((win (selected-window)) (sb-width (mdw-horizontal-window-overhead)) (c (/ (+ (window-width) sb-width) @@ -217,6 +220,17 @@ fringes is not taken out of the allowance for WIDTH, unlike (other-window 1)) (select-window win))) +(defun mdw-set-frame-width (columns &optional width) + (interactive "nColumns: +P") + (setq width (if width (prefix-numeric-value width) + (mdw-preferred-column-width))) + (let ((sb-width (mdw-horizontal-window-overhead))) + (set-frame-width (selected-frame) + (- (* columns (+ width sb-width)) + sb-width)) + (mdw-divvy-window width))) + ;; Don't raise windows unless I say so. (defvar mdw-inhibit-raise-frame nil @@ -457,26 +471,52 @@ Evil key bindings are defined in `mdw-evil-keymap-keys'." (dolist (key replacements) (define-key keymap key binding)))))) -(eval-after-load "org-latex" - '(progn - (push '("strayman" - "\\documentclass{strayman} +(defvar mdw-org-latex-defs + '(("strayman" + "\\documentclass{strayman} \\usepackage[utf8]{inputenc} \\usepackage[palatino, helvetica, courier, maths=cmr]{mdwfonts} -\\usepackage[T1]{fontenc} \\usepackage{graphicx, tikz, mdwtab, mdwmath, crypto, longtable}" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) - org-export-latex-classes))) + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))) + +(eval-after-load "org-latex" + '(setq org-export-latex-classes + (append mdw-org-latex-defs org-export-latex-classes))) + +(eval-after-load "ox-latex" + '(setq org-latex-classes (append mdw-org-latex-defs org-latex-classes) + org-latex-default-packages-alist '(("AUTO" "inputenc" t) + ("T1" "fontenc" t) + ("" "fixltx2e" nil) + ("" "graphicx" t) + ("" "longtable" nil) + ("" "float" nil) + ("" "wrapfig" nil) + ("" "rotating" nil) + ("normalem" "ulem" t) + ("" "textcomp" t) + ("" "marvosym" t) + ("" "wasysym" t) + ("" "amssymb" t) + ("" "hyperref" nil) + "\\tolerance=1000"))) + (setq org-export-docbook-xslt-proc-command "xsltproc --output %o %s %i" org-export-docbook-xsl-fo-proc-command "fop %i.safe %o" org-export-docbook-xslt-stylesheet "/usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl") +;; Glasses. + +(setq glasses-separator "-" + glasses-separate-parentheses-p nil + glasses-uncapitalize-p t) + ;; Some hacks to do with window placement. (defun mdw-clobber-other-windows-showing-buffer (buffer-or-name) @@ -535,6 +575,12 @@ Pretend they don't exist. They might be on other display devices." '(progn (define-key compilation-shell-minor-mode-map "\C-c\M-g" 'recompile))) +(defadvice compile (around hack-environment compile activate) + "Hack the environment inherited by inferiors in the compilation." + (let ((process-environment process-environment)) + (setenv "LD_PRELOAD" nil) + ad-do-it)) + (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 @@ -599,9 +645,9 @@ to force interactive compilation." #'flymake-get-make-cmdline))))) (setq flymake-allowed-file-name-masks - '(("\\.\\(?:c\\|C\\|cc\\|cpp\\|cxx\\|c\\+\\+\\)\\'" + '(("\\.\\(?:[cC]\\|cc\\|cpp\\|cxx\\|c\\+\\+\\)\\'" mdw-flymake-make-init) - ("\\.\\(?:h\\|H\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'" + ("\\.\\(?:[hH]\\|hh\\|hpp\\|hxx\\|h\\+\\+\\)\\'" mdw-flymake-master-make-init) ("\\.p[lm]" flymake-perl-init))) @@ -711,7 +757,79 @@ Use this to arrange for per-server settings.") proc)) (eval-after-load "erc" - '(load "~/.ercrc.el")) + '(load "~/.ercrc.el")) + +;; Heavy-duty Gnus patching. + +(defun mdw-nnimap-transform-headers () + (goto-char (point-min)) + (let (article lines size string) + (block nil + (while (not (eobp)) + (while (not (looking-at "\\* [0-9]+ FETCH")) + (delete-region (point) (progn (forward-line 1) (point))) + (when (eobp) + (return))) + (goto-char (match-end 0)) + ;; Unfold quoted {number} strings. + (while (re-search-forward + "[^]][ (]{\\([0-9]+\\)}\r?\n" + (save-excursion + ;; Start of the header section. + (or (re-search-forward "] {[0-9]+}\r?\n" nil t) + ;; Start of the next FETCH. + (re-search-forward "\\* [0-9]+ FETCH" nil t) + (point-max))) + t) + (setq size (string-to-number (match-string 1))) + (delete-region (+ (match-beginning 0) 2) (point)) + (setq string (buffer-substring (point) (+ (point) size))) + (delete-region (point) (+ (point) size)) + (insert (format "%S" (mm-subst-char-in-string ?\n ?\s string))) + ;; [mdw] missing from upstream + (backward-char 1)) + (beginning-of-line) + (setq article + (and (re-search-forward "UID \\([0-9]+\\)" (line-end-position) + t) + (match-string 1))) + (setq lines nil) + (setq size + (and (re-search-forward "RFC822.SIZE \\([0-9]+\\)" + (line-end-position) + t) + (match-string 1))) + (beginning-of-line) + (when (search-forward "BODYSTRUCTURE" (line-end-position) t) + (let ((structure (ignore-errors + (read (current-buffer))))) + (while (and (consp structure) + (not (atom (car structure)))) + (setq structure (car structure))) + (setq lines (if (and + (stringp (car structure)) + (equal (upcase (nth 0 structure)) "MESSAGE") + (equal (upcase (nth 1 structure)) "RFC822")) + (nth 9 structure) + (nth 7 structure))))) + (delete-region (line-beginning-position) (line-end-position)) + (insert (format "211 %s Article retrieved." article)) + (forward-line 1) + (when size + (insert (format "Chars: %s\n" size))) + (when lines + (insert (format "Lines: %s\n" lines))) + ;; Most servers have a blank line after the headers, but + ;; Davmail doesn't. + (unless (re-search-forward "^\r$\\|^)\r?$" nil t) + (goto-char (point-max))) + (delete-region (line-beginning-position) (line-end-position)) + (insert ".") + (forward-line 1))))) + +(eval-after-load 'nnimap + '(defalias 'nnimap-transform-headers + (symbol-function 'mdw-nnimap-transform-headers))) ;;;-------------------------------------------------------------------------- ;;; Utility functions. @@ -878,6 +996,12 @@ options." (concat (shell-quote-argument (dired-get-filename nil)) " " args))) +(defadvice dired-do-flagged-delete + (around mdw-delete-if-prefix-argument activate compile) + (let ((delete-by-moving-to-trash (and (null current-prefix-arg) + delete-by-moving-to-trash))) + ad-do-it)) + (eval-after-load "dired" '(define-key dired-mode-map "X" 'mdw-dired-run)) @@ -900,8 +1024,12 @@ If NEW-SESSION-P, start a new session." (w3m-browse-url url new-session-p)) (select-window window))))) +(eval-after-load 'w3m + '(define-key w3m-mode-map [?\e ?\r] 'w3m-view-this-url-new-session)) + (defvar mdw-good-url-browsers - '(browse-url-mozilla + '(browse-url-chromium + browse-url-mozilla browse-url-generic (w3m . mdw-w3m-browse-url) browse-url-w3) @@ -990,10 +1118,6 @@ It in turn is a list of things: "*Standard regexp matching parts of a hanging indent. This is mainly useful in `auto-fill-mode'.") -;; Setting things up. - -(fset 'mdw-do-auto-fill (symbol-function 'do-auto-fill)) - ;; Utility functions. (defun mdw-maybe-tabify (s) @@ -1011,11 +1135,11 @@ This is mainly useful in `auto-fill-mode'.") context and return the static fill prefix to use. Point must be at the start of a line, and match data must be saved." (cond ((not l) nil) - ((looking-at (car (car l))) - (mdw-maybe-tabify (apply #'concat - (mapcar #'mdw-do-prefix-match - (cdr (car l)))))) - (t (mdw-examine-fill-prefixes (cdr l))))) + ((looking-at (car (car l))) + (mdw-maybe-tabify (apply #'concat + (mapcar #'mdw-do-prefix-match + (cdr (car l)))))) + (t (mdw-examine-fill-prefixes (cdr l))))) (defun mdw-maybe-car (p) "If P is a pair, return (car P), otherwise just return P." @@ -1034,26 +1158,26 @@ at the start of a line, and match data must be saved." "Expand a dynamic prefix match element. See `mdw-fill-prefix' for details." (cond ((not (consp m)) (format "%s" m)) - ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m)))) - ((eq (car m) 'pad) (mdw-padding (match-string - (mdw-maybe-car (cdr m))))) - ((eq (car m) 'eval) (eval (cdr m))) - (t ""))) + ((eq (car m) 'match) (match-string (mdw-maybe-car (cdr m)))) + ((eq (car m) 'pad) (mdw-padding (match-string + (mdw-maybe-car (cdr m))))) + ((eq (car m) 'eval) (eval (cdr m))) + (t ""))) (defun mdw-choose-dynamic-fill-prefix () "Work out the dynamic fill prefix based on the variable `mdw-fill-prefix'." (cond ((and fill-prefix (not (string= fill-prefix ""))) fill-prefix) - ((not mdw-fill-prefix) fill-prefix) - (t (save-excursion - (beginning-of-line) - (save-match-data - (mdw-examine-fill-prefixes mdw-fill-prefix)))))) + ((not mdw-fill-prefix) fill-prefix) + (t (save-excursion + (beginning-of-line) + (save-match-data + (mdw-examine-fill-prefixes mdw-fill-prefix)))))) -(defun do-auto-fill () +(defadvice do-auto-fill (around mdw-dynamic-fill-prefix () activate compile) "Handle auto-filling, working out a dynamic fill prefix in the case where there isn't a sensible static one." (let ((fill-prefix (mdw-choose-dynamic-fill-prefix))) - (mdw-do-auto-fill))) + ad-do-it)) (defun mdw-fill-paragraph () "Fill paragraph, getting a dynamic fill prefix." @@ -1067,9 +1191,9 @@ This is just a short-cut for setting the thing by hand, and by design it doesn't cope with anything approximating a complicated case." (setq mdw-fill-prefix - `((,(concat rx mdw-hanging-indents) - (match . 1) - (pad . ,(or mat 2)))))) + `((,(concat rx mdw-hanging-indents) + (match . 1) + (pad . ,(or mat 2)))))) ;;;-------------------------------------------------------------------------- ;;; Other common declarations. @@ -1094,8 +1218,7 @@ case." (and mdw-auto-indent (cond ((eq major-mode 'lisp-mode) (local-set-key "\C-m" 'mdw-indent-newline-and-indent)) - ((or (eq major-mode 'slime-repl-mode) - (eq major-mode 'asm-mode)) + ((derived-mode-p 'slime-repl-mode 'asm-mode 'comint-mode) nil) (t (local-set-key "\C-m" 'newline-and-indent)))) @@ -1530,6 +1653,18 @@ doesn't match any of the regular expressions in (mdw-define-face magit-diff-removed-highlight (((min-colors 64)) :foreground "#eecccc" :background "#663333") (((class color)) :foreground "red" :background "blue")) +(mdw-define-face magit-blame-heading + (((min-colors 64)) :foreground "white" :background "grey25" + :weight normal :slant normal) + (((class color)) :foreground "white" :background "blue" + :weight normal :slant normal)) +(mdw-define-face magit-blame-name + (t :inherit magit-blame-heading :slant italic)) +(mdw-define-face magit-blame-date + (((min-colors 64)) :inherit magit-blame-heading :foreground "grey60") + (((class color)) :inherit magit-blame-heading :foreground "cyan")) +(mdw-define-face magit-blame-summary + (t :inherit magit-blame-heading :weight bold)) (mdw-define-face dylan-header-background (((min-colors 64)) :background "NavyBlue") @@ -1804,7 +1939,7 @@ name, as a symbol." (defvar mdw-c-comment-fill-prefix `((,(concat "\\([ \t]*/?\\)" - "\\(\*\\|//]\\)" + "\\(\\*\\|//\\)" "\\([ \t]*\\)" "\\([A-Za-z]+:[ \t]*\\)?" mdw-hanging-indents) @@ -2211,10 +2346,6 @@ name, as a symbol." "[lLfFdD]?") '(0 mdw-number-face)) - ;; Identifiers with trailing operators. - (list (concat "_\\(" punctuation "\\)+") - '(0 mdw-trivial-face)) - ;; And everything else is punctuation. (list "\\(\\s.\\|\\s(\\|\\s)\\|\\s\\\\|\\s/\\)" '(0 mdw-punct-face))) @@ -2509,15 +2640,15 @@ name, as a symbol." "const" "continue" "create" "do" "else" "enum" "extern" - "false" "final" "fn" "for" + "final" "fn" "for" "if" "impl" "in" "let" "loop" "macro" "match" "mod" "move" "mut" "offsetof" "override" - "priv" "pub" "pure" + "priv" "proc" "pub" "pure" "ref" "return" - "self" "sizeof" "static" "struct" "super" - "true" "trait" "type" "typeof" + "sizeof" "static" "struct" "super" + "trait" "type" "typeof" "unsafe" "unsized" "use" "virtual" "where" "while" @@ -2528,7 +2659,8 @@ name, as a symbol." "f32" "f64" "i8" "i16" "i32" "i64" "isize" "u8" "u16" "u32" "u64" "usize" - "char" "str"))) + "char" "str" + "self" "Self"))) (setq font-lock-keywords (list @@ -3348,6 +3480,9 @@ strip numbers instead." (unless modified (restore-buffer-modified-p nil))))))) +(setq LaTeX-syntactic-comments nil + LaTeX-fill-break-at-separators '(\\\[)) + ;;;-------------------------------------------------------------------------- ;;; SGML hacking. @@ -3508,6 +3643,9 @@ that character only to be normal punctuation.") (mdw-define-face eshell-ls-readonly (t nil)) (mdw-define-face eshell-ls-symlink (t :foreground "cyan")) +(defun mdw-eshell-hack () (setenv "LD_PRELOAD" nil)) +(add-hook 'eshell-mode-hook 'mdw-eshell-hack) + ;;;-------------------------------------------------------------------------- ;;; Messages-file mode. @@ -3771,6 +3909,15 @@ that character only to be normal punctuation.") (and mdw-auto-indent (indent-for-tab-command))) +(defadvice comint-line-beginning-position + (around mdw-calculate-it-properly () activate compile) + "Calculate the actual line start for multi-line input." + (if (or comint-use-prompt-regexp + (eq (field-at-pos (point)) 'output)) + ad-do-it + (setq ad-return-value + (constrain-to-field (line-beginning-position) (point))))) + (defun mdw-setup-m4 () ;; Inexplicably, Emacs doesn't match braces in m4 mode. This is very @@ -3853,13 +4000,25 @@ This allows you to pass a list of arguments through `ansi-term'." (ad-set-arg 2 (car program)) (ad-set-arg 4 (cdr program)))))) +(defadvice term-exec-1 (around hack-environment compile activate) + "Hack the environment inherited by inferiors in the terminal." + (let ((process-environment process-environment)) + (setenv "LD_PRELOAD" nil) + ad-do-it)) + +(defadvice shell (around hack-environment compile activate) + "Hack the environment inherited by inferiors in the shell." + (let ((process-environment process-environment)) + (setenv "LD_PRELOAD" nil) + ad-do-it)) + (defun ssh (host) "Open a terminal containing an ssh session to the HOST." (interactive "sHost: ") (ansi-term (list "ssh" host) (format "ssh@%s" host))) (defvar git-grep-command - "env PAGER=cat git grep --no-color -nH -e " + "env GIT_PAGER=cat git grep --no-color -nH -e " "*The default command for \\[git-grep].") (defvar git-grep-history nil) @@ -3869,7 +4028,8 @@ This allows you to pass a list of arguments through `ansi-term'." (interactive (list (read-shell-command "Run git grep (like this): " git-grep-command 'git-grep-history))) - (grep command-args)) + (let ((grep-use-null-device nil)) + (grep command-args))) ;;;-------------------------------------------------------------------------- ;;; Magit configuration. @@ -3886,6 +4046,7 @@ This allows you to pass a list of arguments through `ansi-term'." (magit-wip-after-apply-mode 1) (magit-wip-before-change-mode 1) (add-to-list 'magit-no-confirm 'safe-with-wip) + (add-to-list 'magit-no-confirm 'trash) (push '(:eval (if (or magit-wip-after-save-local-mode magit-wip-after-apply-mode magit-wip-before-change-mode) @@ -3900,6 +4061,17 @@ This allows you to pass a list of arguments through `ansi-term'." magit-revision-mode-refresh-popup)) (magit-define-popup-switch popup ?R "Reverse diff" "-R")))) +(defadvice magit-wip-commit-buffer-file + (around mdw-just-this-buffer activate compile) + (let ((magit-save-repository-buffers nil)) ad-do-it)) + +(defadvice magit-discard + (around mdw-delete-if-prefix-argument activate compile) + (let ((magit-delete-by-moving-to-trash + (and (null current-prefix-arg) + magit-delete-by-moving-to-trash))) + ad-do-it)) + (setq magit-repolist-columns '(("Name" 16 magit-repolist-column-ident nil) ("Version" 18 magit-repolist-column-version nil) @@ -3933,6 +4105,26 @@ there is sadness." (propertize (number-to-string n) 'face (if (> n 0) 'bold 'shadow)))))) +(defun mdw-try-smerge () + (save-excursion + (goto-char (point-min)) + (when (re-search-forward "^<<<<<<< " nil t) + (smerge-mode 1)))) +(add-hook 'find-file-hook 'mdw-try-smerge t) + +;;;-------------------------------------------------------------------------- +;;; GUD, and especially GDB. + +;; Inhibit window dedication. I mean, seriously, wtf? +(defadvice gdb-display-buffer (after mdw-undedicated (buf) compile activate) + "Don't make windows dedicated. Seriously." + (set-window-dedicated-p ad-return-value nil)) +(defadvice gdb-set-window-buffer + (after mdw-undedicated (name &optional ignore-dedicated window) + compile activate) + "Don't make windows dedicated. Seriously." + (set-window-dedicated-p (or window (selected-window)) nil)) + ;;;-------------------------------------------------------------------------- ;;; MPC configuration.