2011-02-18 96 views
1

我想做一个击键,说C-F12,做delete-other-windowswinner-undo。如果我已经学习了Emacs Lisp编程,并且设置了一个布尔标志,我认为这很容易。也就是说,如果之前运行的是delete-other-window,现在它将运行winner-undo在Emacs中,我们可以做一个按键来做不同的命令吗?

你如何在Emacs Lisp中做到这一点?

感谢

回答

3

尝试这样的事情

(setq c-f12-winner-undo t) 

(define-key (current-global-map) [C-f12] 
    (lambda() 
    (interactive) 
    (if c-f12-winner-undo 
     (winner-undo) 
     (delete-other-windows)) 
    (setq c-f12-winner-undo (not c-f12-winner-undo)))) 
+0

真棒!那么,我试着去了解那些代码。嗯,..和其他编程语言一样。我猜第一个代码是准备布尔标志。 (我不知道什么是lambda()),交互式。在那里你有`如果c-f12-winner-undo` ..和其余的^ _^ 谢谢@oleg! – swdev 2011-02-18 10:13:12

+0

顺便说一句,这感觉很奇怪,当一个文本编辑器可以编程,而不仅仅是定制文件。 .. :) – swdev 2011-02-18 10:14:39

+1

lambda是一个匿名函数。就在这种情况下,你不想给所有在本地使用的小函数提供名字。互动是必要的,以便能够交互调用此功能(通过C-f12)。其他一切都很简单。是的,我喜欢Emacs,因为我可以编程它,因为我想 – 2011-02-18 10:35:27

1
(defun swdev-toggle-sole-window() 
    (interactive) 
    (if (cdr (window-list)) 
     (delete-other-windows) 
    (winner-undo))) 
(global-set-key (kbd "<C-f12>") 'swdev-toggle-sole-window) 
  1. 第一行开始了一个名为swdev-toggle-sole-window函数的声明,不采取任何说法。
  2. 此功能被声明为交互式,即可以用M-x或通过键绑定来调用。
  3. 如果窗口列表中包含多个元素,即如果有多个窗口,...
  4. ...然后删除其他窗口...
  5. ...否则取消该窗口删除。
  6. 将功能绑定到密钥C-f12
1

下面是使用Emacs的recenter顶底功能采取的方法解决:

(defun delete-other-window-or-winner-undo() 
    "call delete-other-window on first invocation and winner-undo on subsequent invocations" 
    (interactive) 
    (if (eq this-command last-command) 
     (winner-undo) 
    (delete-other-windows))) 

(global-set-key (kbd "<C-f12>") 'delete-other-window-or-winner-undo) 
相关问题