From 16fe7c41f6a107a5a897ea36dd82e9905bac6423 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 9 Mar 2009 12:54:35 +0000 Subject: [PATCH] emacs, dot-emacs.el: Extend and semi-automate evil-keymap hacking. It seems that org-mode-map isn't the only evil keymap provided by Org mode: the org-agenda-mode-map has some of the same defects. Rather than tediously write out all of the necessary fixing for each mode, I've written a keymap-fixing function which reads an alist of keys to remap. --- dot-emacs.el | 37 +++++++++++++++++++++++++++++++++++++ emacs | 18 ++++-------------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/dot-emacs.el b/dot-emacs.el index 3311867..b8d5381 100644 --- a/dot-emacs.el +++ b/dot-emacs.el @@ -188,6 +188,43 @@ 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" diff --git a/emacs b/emacs index 6e9201a..fb51fec 100644 --- a/emacs +++ b/emacs @@ -402,20 +402,10 @@ (and (not mdw-fast-startup) (fboundp 'hippie-expand) (global-set-key [?\M-/] 'hippie-expand)) -(defun mdw-clobber-org-mode-map () - (dolist (key '([S-up] [S-down] [S-left] [S-right] - [?\e left] [?\e right] - [M-left] [M-right])) - (define-key org-mode-map key nil)) - (define-key org-mode-map [?\C-c left] 'org-shiftleft) - (define-key org-mode-map [?\C-c right] 'org-shiftright) - (define-key org-mode-map [?\C-c up] 'org-shiftup) - (define-key org-mode-map [?\C-c down] 'org-shiftdown) - (define-key org-mode-map [C-left] 'org-metaleft) - (define-key org-mode-map [C-right] 'org-metaright) - (define-key org-mode-map [C-up] 'org-metaup) - (define-key org-mode-map [C-down] 'org-metadown)) -(add-hook 'org-mode-hook 'mdw-clobber-org-mode-map) +(add-hook 'org-mode-hook + #'(lambda () (mdw-clobber-evil-keymap org-mode-map))) +(add-hook 'org-agenda-mode-hook + #'(lambda () (mdw-clobber-evil-keymap org-agenda-mode-map))) ;; --- Recognising types of files --- -- 2.11.0