X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/95575d1fdc976ebc74d7336fd537e28a89165429..f50c1bed963ac02b75f39124dda23c69441c0bff:/dot-emacs.el diff --git a/dot-emacs.el b/dot-emacs.el index d81aff4..0d27f52 100644 --- a/dot-emacs.el +++ b/dot-emacs.el @@ -188,6 +188,115 @@ symbols `sunday', `monday', etc. (or a mixture). If the date stored in (nth 2 when)))))))) (eq w d))) +;; --- Fighting with Org-mode's evil key maps --- + +(defvar mdw-evil-keymap-keys + '(([S-up] . [?\C-c up]) + ([S-down] . [?\C-c down]) + ([S-left] . [?\C-c left]) + ([S-right] . [?\C-c right]) + (([M-up] [?\e up]) . [C-up]) + (([M-down] [?\e down]) . [C-down]) + (([M-left] [?\e left]) . [C-left]) + (([M-right] [?\e right]) . [C-right])) + "Defines evil keybindings to clobber in `mdw-clobber-evil-keymap'. +The value is an alist mapping evil keys (as a list, or singleton) +to good keys (in the same form).") + +(defun mdw-clobber-evil-keymap (keymap) + "Replace evil key bindings in the KEYMAP. +Evil key bindings are defined in `mdw-evil-keymap-keys'." + (dolist (entry mdw-evil-keymap-keys) + (let ((binding nil) + (keys (if (listp (car entry)) + (car entry) + (list (car entry)))) + (replacements (if (listp (cdr entry)) + (cdr entry) + (list (cdr entry))))) + (catch 'found + (dolist (key keys) + (setq binding (lookup-key keymap key)) + (when binding + (throw 'found nil)))) + (when binding + (dolist (key keys) + (define-key keymap key nil)) + (dolist (key replacements) + (define-key keymap key binding)))))) + +;;;----- Mail and news hacking ---------------------------------------------- + +(define-derived-mode mdwmail-mode mail-mode "[mdw] mail" + "Major mode for editing news and mail messages from external programs +Not much right now. Just support for doing MailCrypt stuff." + :syntax-table nil + :abbrev-table nil + (run-hooks 'mail-setup-hook)) + +(define-key mdwmail-mode-map [?\C-c ?\C-c] 'disabled-operation) + +(add-hook 'mdwail-mode-hook + (lambda () + (set-buffer-file-coding-system 'utf-8) + (make-local-variable 'paragraph-separate) + (make-local-variable 'paragraph-start) + (setq paragraph-start + (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" + paragraph-start)) + (setq paragraph-separate + (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" + paragraph-separate)))) + +;; --- How to encrypt in mdwmail --- + +(defun mdwmail-mc-encrypt (&optional recip scm start end from sign) + (or start + (setq start (save-excursion + (goto-char (point-min)) + (or (search-forward "\n\n" nil t) (point-min))))) + (or end + (setq end (point-max))) + (mc-encrypt-generic recip scm start end from sign)) + +;; --- How to sign in mdwmail --- + +(defun mdwmail-mc-sign (key scm start end uclr) + (or start + (setq start (save-excursion + (goto-char (point-min)) + (or (search-forward "\n\n" nil t) (point-min))))) + (or end + (setq end (point-max))) + (mc-sign-generic key scm start end uclr)) + +;; --- Some signature mangling --- + +(defun mdwmail-mangle-signature () + (save-excursion + (goto-char (point-min)) + (perform-replace "\n-- \n" "\n-- " nil nil nil))) +(add-hook 'mail-setup-hook 'mdwmail-mangle-signature) +(add-hook 'message-setup-hook 'mdwmail-mangle-signature) + +;; --- Insert my login name into message-ids, so I can score replies --- + +(defadvice message-unique-id (after mdw-user-name last activate compile) + "Ensure that the user's name appears at the end of the message-id string, +so that it can be used for convenient filtering." + (setq ad-return-value (concat ad-return-value "." (user-login-name)))) + +;; --- Tell my movemail hack where movemail is --- +;; +;; This is needed to shup up warnings about LD_PRELOAD. + +(let ((path exec-path)) + (while path + (let ((try (expand-file-name "movemail" (car path)))) + (if (file-executable-p try) + (setenv "REAL_MOVEMAIL" try)) + (setq path (cdr path))))) + ;;;----- Utility functions -------------------------------------------------- (or (fboundp 'line-number-at-pos) @@ -324,57 +433,6 @@ get itself into a twist." (defadvice write-file (after mdw-autorevert activate) (mdw-check-autorevert)) -(define-derived-mode mdwmail-mode mail-mode "[mdw] mail" - "Major mode for editing news and mail messages from external programs -Not much right now. Just support for doing MailCrypt stuff." - :syntax-table nil - :abbrev-table nil - (run-hooks 'mail-setup-hook)) - -(define-key mdwmail-mode-map [?\C-c ?\C-c] 'disabled-operation) - -(add-hook 'mdwail-mode-hook - (lambda () - (set-buffer-file-coding-system 'utf-8) - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-start) - (setq paragraph-start - (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" - paragraph-start)) - (setq paragraph-separate - (concat "[ \t]*[-_][-_][-_]+$\\|^-- \\|-----\\|" - paragraph-separate)))) - -;; --- How to encrypt in mdwmail --- - -(defun mdwmail-mc-encrypt (&optional recip scm start end from sign) - (or start - (setq start (save-excursion - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point-min))))) - (or end - (setq end (point-max))) - (mc-encrypt-generic recip scm start end from sign)) - -;; --- How to sign in mdwmail --- - -(defun mdwmail-mc-sign (key scm start end uclr) - (or start - (setq start (save-excursion - (goto-char (point-min)) - (or (search-forward "\n\n" nil t) (point-min))))) - (or end - (setq end (point-max))) - (mc-sign-generic key scm start end uclr)) - -;; --- Some signature mangling --- - -(defun mdwmail-mangle-signature () - (save-excursion - (goto-char (point-min)) - (perform-replace "\n-- \n" "\n-- " nil nil nil))) -(add-hook 'mail-setup-hook 'mdwmail-mangle-signature) - ;;;----- Dired hacking ------------------------------------------------------ (defadvice dired-maybe-insert-subdir @@ -707,6 +765,16 @@ the regular expressions in `mdw-backup-disable-regexps'." :foreground ,(if window-system "SeaGreen1" "green")) (woman-bold :weight bold) (woman-italic :slant italic) + (p4-depot-added-face :foreground "green") + (p4-depot-branch-op-face :foreground "yellow") + (p4-depot-deleted-face :foreground "red") + (p4-depot-unmapped-face + :foreground ,(if window-system "SkyBlue1" "cyan")) + (p4-diff-change-face :foreground "yellow") + (p4-diff-del-face :foreground "red") + (p4-diff-file-face :foreground "SkyBlue1") + (p4-diff-head-face :background "grey10") + (p4-diff-ins-face :foreground "green") (diff-index :weight bold) (diff-file-header :weight bold) (diff-hunk-header :foreground "SkyBlue1") @@ -748,19 +816,42 @@ the regular expressions in `mdw-backup-disable-regexps'." (define-key c-mode-map "*" nil) (define-key c-mode-map "/" nil))) +(defun mdw-c-lineup-arglist (langelem) + "Hack for DWIMmery in c-lineup-arglist." + (if (save-excursion + (c-block-in-arglist-dwim (c-langelem-2nd-pos c-syntactic-element))) + 0 + (c-lineup-arglist langelem))) + +(defun mdw-c-indent-extern-mumble (langelem) + "Indent `extern \"...\" {' lines." + (save-excursion + (back-to-indentation) + (if (looking-at + "\\s-*\\\\s-*\"\\([^\\\\\"]+\\|\\.\\)*\"\\s-*{") + 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-offsets-alist (substatement-open . 0) - (label . 0) - (case-label . +) - (access-label . -) - (inclass . +) - (inline-open . ++) - (statement-cont . 0) - (statement-case-intro . +))) + (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) + (inextern-lang . [0]) + (label . 0) + (case-label . +) + (access-label . -) + (inclass . +) + (inline-open . ++) + (statement-cont . 0) + (statement-case-intro . +))) t)) (defun mdw-fontify-c-and-c++ () @@ -2014,6 +2105,10 @@ strip numbers instead." ;; --- Lispy languages --- +;; Unpleasant bodge. +(unless (boundp 'slime-repl-mode-map) + (setq slime-repl-mode-map (make-sparse-keymap))) + (defun mdw-indent-newline-and-indent () (interactive) (indent-for-tab-command) @@ -2032,7 +2127,7 @@ strip numbers instead." (make-variable-buffer-local 'lisp-indent-function) (setq lisp-indent-function 'common-lisp-indent-function)) -(setq lisp-simple-loop-indentation 1 +(setq lisp-simple-loop-indentation 2 lisp-loop-keyword-indentation 6 lisp-loop-forms-indentation 6) @@ -2087,14 +2182,30 @@ strip numbers instead." 'comint-watch-for-password-prompt)) (defun mdw-term-mode-setup () - (setq term-prompt-regexp "^[^]#$%>»}\n]*[]#$%>»}] *") + (setq term-prompt-regexp shell-prompt-pattern) (make-local-variable 'mouse-yank-at-point) (make-local-variable 'transient-mark-mode) (setq mouse-yank-at-point t) - (setq transient-mark-mode nil) (auto-fill-mode -1) (setq tab-width 8)) +(defun term-send-meta-right () (interactive) (term-send-raw-string "\e\e[C")) +(defun term-send-meta-left () (interactive) (term-send-raw-string "\e\e[D")) +(defun term-send-ctrl-uscore () (interactive) (term-send-raw-string "\C-_")) +(defun term-send-meta-meta-something () + (interactive) + (term-send-raw-string "\e\e") + (term-send-raw)) +(eval-after-load 'term + '(progn + (define-key term-raw-map [?\e ?\e] nil) + (define-key term-raw-map [?\e ?\e t] 'term-send-meta-meta-something) + (define-key term-raw-map [?\C-/] 'term-send-ctrl-uscore) + (define-key term-raw-map [M-right] 'term-send-meta-right) + (define-key term-raw-map [?\e ?\M-O ?C] 'term-send-meta-right) + (define-key term-raw-map [M-left] 'term-send-meta-left) + (define-key term-raw-map [?\e ?\M-O ?D] 'term-send-meta-left))) + ;;;----- That's all, folks -------------------------------------------------- (provide 'dot-emacs)