emacs, dot-emacs.el: Extend and semi-automate evil-keymap hacking.
[profile] / dot-emacs.el
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"