2013-02-08 55 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