diff --git a/outshine.el b/outshine.el index 82212a6..9720ebf 100644 --- a/outshine.el +++ b/outshine.el @@ -846,8 +846,7 @@ This function will be hooked to `outline-minor-mode'." ;; copied and adapted from Alexander Vorobiev ;; http://www.mail-archive.com/emacs-orgmode@gnu.org/msg70648.html -(defmacro outshine-define-key - (keymap key def condition &optional mode) +(defmacro outshine-define-key (keymap key def condition &optional mode) "Define key with fallback. Binds KEY to definition DEF in keymap KEYMAP, the binding is @@ -855,6 +854,8 @@ active when the CONDITION is true. Otherwise turns MODE off and re-enables previous definition for KEY. If MODE is nil, tries to recover it by stripping off \"-map\" from KEYMAP name. +DEF must be a quoted symbol of an interactive command. + This interns a named function `outshine-kbd-[key-name]' with the appropriate docstring so that calling `describe-key' on KEY produces a more informative output." @@ -894,6 +895,48 @@ Otherwise, fallback to the original binding of %s in the current mode." (key-binding ,key)))))) (define-key ,keymap ,key ',fn-name)))) +;;;;;; original macro (obsolete) + +;; Note: the new macro uses a quoted symbol for the binding DEF, matching +;; the signature of `define-key'. +(make-obsolete 'outshine-define-key-with-fallback 'outshine-define-key "3.0") +(defmacro outshine-define-key-with-fallback + (keymap key def condition &optional mode) + "Define key with fallback. +Binds KEY to definition DEF in keymap KEYMAP, the binding is +active when the CONDITION is true. Otherwise turns MODE off and +re-enables previous definition for KEY. If MODE is nil, tries to +recover it by stripping off \"-map\" from KEYMAP name." + (declare (indent 2)) + `(define-key + ,keymap + ,key + (lambda (&optional arg) + (interactive "P") + (if ,condition ,def + (let* ((,(if mode mode + (let* ((keymap-str (symbol-name keymap)) + (mode-name-end + (- (string-width keymap-str) 4))) + (if (string= + "-map" + (substring keymap-str mode-name-end)) + (intern (substring keymap-str 0 mode-name-end)) + (message + "Could not deduce mode name from keymap name") + (intern "dummy-sym")) + )) nil) + ;; Check for `'. It translates to `TAB' which + ;; will prevent `(key-binding ...)' from finding the + ;; original binding. + (original-func (if (equal (kbd "") ,key) + (or (key-binding ,key) + (key-binding (kbd "TAB"))) + (key-binding ,key)))) + (condition-case nil + (call-interactively original-func) + (error nil))))))) + ;;;;; Normalize regexps ;; from http://emacswiki.org/emacs/ElispCookbook#toc6