2012-10-05 73 views
0

我在多種模式下使用emacs(ESS,Auctex,Slime,elisp等),所有模式都使用惡模式密鑰綁定。每種交互模式都具有類似的功能,用於評估我使用空格鍵作爲前綴綁定到快捷方式的區域,行或緩衝區。將來自不同模式的類似命令綁定到相同的密鑰

;; bind slime's eval and elisp eval to the key sequence "<SPC>e" 
(evil-define-key 'normal lisp-mode-map (kbd "<SPC>e") 'slime-eval-last-expression) 
(evil-define-key 'normal lisp-interaction-mode-map (kbd "<SPC>e") 'eval-last-sexp) 

我想設置一個默認鍵的功能「類型」,所以,我並不需要有像上面我用的每一次互動模式,對每一個指令的條目。這將有希望給一個更可讀的.emacs初始化文件,並使未來更容易更改我的密鑰綁定。

我確信我可以使用一系列鉤子自己做這件事,但我想知道是否有任何現有的或內置的支持?

感謝

張量積

回答

2

我不知道什麼邪,所以我給正常Emacs的解決方案:

(global-set-key [?\s ?e] #'my-eval-last-sexp) 
(defvar my-eval-last-sexp-command #'undefined) 
(defun my-eval-last-sexp() 
    (interactive) 
    (call-interactively my-eval-last-sexp-command)) 
(add-hook 'emacs-lisp-mode-hook 
      (lambda() (set (make-local-variable 'my-eval-last-sexp-command) #'eval-last-sexp)) 
(add-hook 'lisp-mode-hook 
      (lambda() (set (make-local-variable 'my-eval-last-sexp-command) #'slime-eval-last-expression)) 
... 

正如你所看到的,還有的只是一個提你想要的鑰匙(在這種情況下[?\ s?e])。但是,您不必在編寫的代碼量上節省很多。您可以通過使my-eval-last-sexp稍微複雜一點來改進它(例如,它可以嘗試從主模式名稱中猜測命令名稱),或者用全局alist替換掛鉤函數。

希望在未來的某些Emacs中,與某些解釋器/編譯器交互的所有這些源代碼模式將共享更多的代碼,這樣您的問題就會消失。

+0

是的,這是我正在考慮實施的。我只是希望可能已經有了一些東西。 – laffoyb

相關問題