2013-02-08 63 views
2

我想知道是否有方法說地圖Emacs相同的鍵盤映射不同的命令

s-Y到兩個不同的命令。

我想我想SY彈出終端在分割窗口,這是較低的, 然後彈出的bash然後再以相同的改變重點,以新的窗口,以便

(defun bash-window() 
    (interactive) 
    (split-window-below) 
    (other-window 1) 
    (shell) 
) 

然後命令終止shell進程,並拆除較低的窗口是否有辦法我可以用lisp做到這一點,它似乎lisp不保持在emacs lisp編程狀態....除非我對此不正確。

+1

我不知道究竟是如何做到這一點,但不會是:SY綁定到一個elisp的功能的,它分裂和填充,並重新綁定sY以映射到函數B.函數B關閉分割,並將sY重新綁定到函數A..emacs初始地將sY綁定到函數A. – Dave 2013-02-08 21:16:53

+0

@Dave,這實際上是真的聰明 - 我將不得不把這個把戲放在下一次! XD(但認真,這很酷。) – 2013-02-08 21:22:47

+0

;;修復反向功能aka撤銷功能 (defun bash-window() (全局設置密鑰(kbd「sY」)'bash-window-undo) (交互式) (拆分窗口下) (其他-window 1) (殼) ) (defun定義的bash窗口-撤消() (全球設置鍵(KBD 「SY」)「的bash窗口) (交互) (其他窗口-1 ) (刪除其他窗口垂直) ) – 2013-02-08 21:35:49

回答

2

爲什麼不寫一個新的函數,然後綁定呢?

Emacs Lisp(和大多數Lisps一般)確實有有狀態,你只需要知道在哪裏尋找它。 (這是CLISP的被單純的功能最大起飛。)

例如,

(setq bash-window-active nil) 

(defun bash-window nil 
    (interactive) 
    (if bash-window-active 
     (function-to-reverse-those-performed-below) 
     (progn 
     (split-window-below) 
     (other-window 1) 
     (shell) 
     (setq bash-window-active t))) 

(global-set-key "\C-cb" 'bash-window) 
+0

哇謝謝你們這兩個偉大的作品,甚至更好的謝謝! – 2013-02-08 21:38:58

+0

Btw有沒有更多的方法可以讓狀態變量在函數中保存它們的值?那我怎麼能封裝,bash窗口活動零到bash窗口函數? – 2013-02-08 21:42:17

+0

您可以使用'let'表達式來引入本地綁定(可以使用'setq'進行突變並因此用作變量)。文檔[here](http://www.gnu.org/software/emacs/emacs-lisp-intro/html_node/Parts-of-let-Expression.html)。 – 2013-02-08 22:08:39