2011-02-18 49 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) 
相關問題