2013-05-31 61 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