命令

2012-09-25 47 views
11

據我瞭解,在Emacs我可以運行命令如M-X(其中的方式,我相信代表execute-extended-command)。此命令M-x本身用於運行諸如customize_face例如在minibuffer中輸入M-x customize-face命令

我的問題是:

Q.1。customize-face a 命令?或者它是一個函數?我們是否說customize-face傳遞給命令M-x作爲自變量

Q.2是否所有的Emacs命令都有關聯的Emacs 函數? (即,當我輸入M-x customize-face時,我認爲調用了定義的函數)。如果是這樣,我怎樣才能從命令名查找函數名? (反之亦然)

+0

M-x不是函數,它是綁定到函數的鍵序列。碰巧,它被綁定到一個函數,它將一個命令作爲參數;當交互調用時,它的「交互式」表單會導致它提示輸入命令名稱。 – tripleee

回答

19

是的,所有的Emacs命令都是函數,但並不是所有的函數都是Emacs命令。您可以任意elisp的功能使用(interactive)通過M-x訪問的命令:

(defun my-command() 
"This is the docstring" 
(interactive) 
(do-foo) 
(do-bar)) 

現在,您已經定義my-command互動,您可以立即與M-x my-command訪問它。 Emacs會自動爲您完成所有名稱簿記。

這是全部您必須添加新命令!然後,您可以將其綁定到類似以下的鍵:

(global-set-key (kbd "C-c f") 'my-command) 

此外,每個鍵綁定都與一個類似這樣的交互功能相關聯。您可以使用C-h k並輸入您的密鑰序列來查找哪個密鑰調用哪個函數。這將爲您提供將在該鍵序列上調用的函數的文檔。如果您運行的代碼我給你,做C-h k C-c f會給你包含緩衝(除其他事項外)您的文檔字符串:

C-c f runs the command my-command, which is an interactive Lisp 
function. 

It is bound to C-c f. 

(my-command) 

This is the docstring 

所以:所有的Emacs命令只是(interactive)定義的功能。 (實際上,Emacs的C核也有一些原始功能,但這並不重要)。

命令和函數之間的這種簡單而優雅的關係 - 在任何方向都很容易遵循 - 是部分讓Emacs如此容易定製。如果您想知道您的常規操作稱爲什麼功能,那麼您可以輕鬆查看它們,並且如果您想添加更多命令,則只需在函數中添加一行。

+2

http://www.gnu.org/software/emacs/manual/html_node/elisp/Command-Overview.html可能是進一步閱讀的好起點。 – tripleee

+1

謝謝@Tikhon Jelvis。還有一個問題,你解釋了我可以如何查找每個鍵使用'C-h k'調用哪個函數,但是如何找到命令調用的函數? (例如,在使用** Dired + **時使用'M-x dired') –

+3

您可以執行'C-h F'並輸入命令名稱。如果你想查找一個函數,而不是一個命令,你可以使用'C-h f',它適用於範圍內的所有函數。 –

6

另一個細節:對於那些想知道爲什麼需要添加(interactive)來將函數標記爲也是命令的人,竅門是interactive用於解釋如何爲函數提供參數。所以(interactive)說:「這也是一個命令,當交互式運行時,只需調用函數沒有參數」,其中(interactive (list 2))說「這也是一個命令,當交互式運行,評估表達式(list 2)將建立參數列表傳遞到命令「。

有許多人討論關於擴大interactive,這樣,而不是僅僅採取形式(interactive ARGs-FORM)它也可以採取的形式(interactive ARGS-FORM RETURN-FORM)其中RETURN-FORM指定了與返回值,當交互稱爲做。典型的例子:current-column功能不打印任何東西,但只返回一個數字,而是以交互方式運行時(即用作命令),如果它不打印任何東西就顯得無用武之地,所以RETURN-FORM將採取返回的數量並打印出來。