2013-05-31 94 views
1

我在Emacs下列全局快捷键: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

如果你明确要作为后备全局绑定,那么这是不是重复;但是下面是肯定相关的:[Elisp:有条件地更改键绑定](http://stackoverflow.com/questions/16090517/elisp-conditionally-change-keybinding)和[Emacs键绑定后备](http://stackoverflow.com /问题/ 2494096/emacs的键绑定,回退)。 – phils

回答

4

我认为你正在寻找的功能(lookup-key keymap key &optional accept-defaults)

这个函数返回键映射键的定义。本章中描述的所有查找关键字的函数都使用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))) 
+1

但是你可能想重命名'follow-link-or - ** next-word **':) –

+0

@MisrableVariable好点 - 我改变了它 – djf