Emacs:如何获取全局快捷方式值

时间:2013-05-31 23:39:54

标签: emacs lisp elisp

我在Emacs中有以下全局键盘快捷键:

(global-set-key (kbd "C-<right>") 'forward-word)

对于组织模式,我决定重新定义这个快捷方式。如果光标位于链接上,则转到链接位置。否则 - 使用forward-word函数。

(defun is-link-p ()
      (if (org-in-regexp org-bracket-link-regexp)
            t))

(defun follow-link-or-next-word ()
      (interactive)
      (if (is-link-p)
            (org-open-at-point)
            (forward-word)))

(add-hook 'org-mode-hook (lambda () 
      (define-key org-mode-map (kbd "C-<right>") 'follow-link-or-next-word)))

是否可以通过以下方式更改组织模式快捷方式:不是调用(前向单词),而是查找全局绑定到"C-<right>"的函数并改为调用它。

因此,如果我决定更改全局快捷方式,我将不需要更改(前向单词)两次。

1 个答案:

答案 0 :(得分:4)

我认为你正在寻找函数(lookup-key keymap key &optional accept-defaults)

  

此函数返回keymap中key的定义。所有其他的   本章中描述的查找键的函数使用lookup-key。   以下是示例:

      (lookup-key (current-global-map) "\C-x\C-f")
          ⇒ find-file
      (lookup-key (current-global-map) (kbd "C-x C-f"))
          ⇒ find-file

您可以扩展您的功能:

(defun is-link-p ()
    (if (org-in-regexp org-bracket-link-regexp)
         t))

(defun follow-link-or-default-action()
    (interactive)
       (let ((global-default (lookup-key (current-global-map) (kbd "C-<right>"))))
           (if (is-link-p)
               (org-open-at-point)
               (funcall global-default))))

(add-hook 'org-mode-hook (lambda () 
      (define-key org-mode-map (kbd "C-<right>") 'follow-link-or-default-action)))