emacs, dot-emacs.el: Extend and semi-automate evil-keymap hacking.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 9 Mar 2009 12:54:35 +0000 (12:54 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 9 Mar 2009 12:54:35 +0000 (12:54 +0000)
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
emacs

index 3311867..b8d5381 100644 (file)
@@ -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 (file)
--- a/emacs
+++ b/emacs
 (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 ---