2015-11-04 60 views
3

我想從Lisp函數中調用鍵盤宏。我希望在某些自定義錯誤處理中進行分層。Emacs我想從lisp函數調用execute-kbd-macro

mykey是以(fset ...)格式存儲在文本文件中的鍵盤宏。 我加載了load-file,用M-x mykey調用時效果很好。

當我執行此函數並插入mykey時,我只得到當前緩衝區中顯示的鍵的名稱,而不是它的執行。我錯過了一個步驟嗎?

(defun gn-batch-search (key-name) 
    "Execute a keyboard macro that has already been loaded." 
    (interactive "sName of macro key:") 
    (execute-kbd-macro key-name)) 
+0

備註:'load-file'是一個交互式命令。在編寫Elisp代碼時,你最好使用'load',它的縮短和其他方法都是一樣的。 – Stefan

回答

3

嘗試

(defun gn-batch-search (key-name) 
    "Execute a keyboard macro that has already been loaded." 
    (interactive "sName of macro key:") 
    (execute-kbd-macro (intern key-name))) 

你撞到的問題是,"sName of macro key:"交互規範提示用戶並返回,並且要運行命令其名稱所描述這個字符串。這就解釋了爲什麼它沒有做你想做的事情,爲什麼你需要intern

至於爲什麼它做到了這一點:鍵盤宏被表示爲事件的向量,其中事件可以是鼠標點擊或按鍵等事件。事實證明,一個字符串被認爲是一種矢量(一個矢量字符),而一個字符也是一個事件(它表示當你按下鍵盤上的那個字符時發送的事件),所以字符串"hi"是一個有效的鍵盤宏,代表按下的動作h然後按下i,所以當你運行這個宏時,它將(通常)最終在當前緩衝區中插入「自身」(除了特殊的緩衝區,如dired, *Help*,...其中hi被綁定到其他命令)。

而不是execute-kbd-macro您可以使用command-execute,它可以與「any」命令一起使用,無論它是定義爲鍵盤宏還是普通函數。

+0

非常感謝! (實習鍵名)做到了。正如你所建議的,它也適用於命令執行。想知道爲什麼我在文檔中看到的例子中沒有提到必須實習符號?也許在鍵盤宏中按順序完成的其他命令有內置的? –

+0

c meade:實際只需要在*字符串*中創建一個*符號*,而這隻有在您試圖將一個符號作爲'MACRO'參數傳遞給'execute-kbd-macro'時,纔會相關。據推測,你看到的例子都沒有使用這種組合。 – phils

+0

謝謝你phils。這就說得通了。宏是很不尋常的動物。 –