2013-02-19 68 views
2

emacs lisp有一個非常實用的功能,您可以在其中評估表達式的結果並將結果直接粘貼到緩衝區中。粘貼clojure評估結果時,如何讓emacs鍵盤宏正常工作?

說我想檢查加法作品。然後I型:

(* 3 2) 

和我定義鍵盤宏:

(setq last-kbd-macro 
    [down ?\(?i ?s ?= ? ?\C-\M-f ? ?\C-u ?\C-x ?\C-e ?\) home]) 

如果我然後將點上面的表達式,然後按F4執行宏,表達式變成:

(is= (* 3 2) 6) 

這是一個很好的迴歸測試。

不幸的是,在一個Clojure的/ nrepl緩衝結果執行相同的鍵盤宏:

(* 8 9)(is= ) 

和Clojure的有關不能夠解決這個符號is=

錯誤所以我覺得很奇怪正在發生事物的排序,而宏正試圖評估錯誤的事情。

任何人都可以得到這個與clojure一起工作嗎? (而事實上,解決一般問題,讓任意鍵盤宏工作確定與C-u C-x C-e就像他們用的Emacs Lisp做)


編輯,因爲人們似乎誤解:

做的按鍵手動工作正常在elisp或clojure緩衝區中。在一個C-u C-x C-e中帶有emacs lisp和外部clojure進程中的其他evals。

,問題就來嘗試運行一個鍵盤宏(記錄在Clojure的緩衝),它含有C-U C-X C-è

運行在Clojure的緩衝區宏,事情就莫名其妙地重新排序時。它看起來像宏可能正在執行,即使評估粘貼尚未完成。

我想知道是否有迫使鍵盤宏(或相應的功能)的方式以相同的順序,因爲它會通過手來執行。

如果有必要,我很樂意將鍵盤宏變成適當的elisp函數。

+0

C-xC-e是針對內部lisp prcocess(即clojure)而不是Emacs lisp的形式。因此錯誤。 – 2013-02-19 15:29:32

+0

菲爾,這取決於你'所以'的意思。看起來好像宏在繼續運行,而eval-paste仍在執行。有沒有辦法等待它完成,而不是(顯然)分叉一個線程? – 2013-02-19 19:23:30

回答

1

鍵盤宏是一種快速和骯髒的方式來重複一定的操作順序。因爲他們記得鍵按下,而不是功能它們調用,所以他們可能會產生依賴於調用它們的緩衝區,當前的命令歷史,窗口配置並沒有什麼很大的不同結果他們是非常脆弱的。

在你的情況,很可能的是,在宏的關鍵之一在Clojure中調用一個不同的命令/比在其中測試的宏緩衝nrepl緩衝。你真的需要在它將被使用的緩衝區中定義宏。

如果你打算重新使用這個宏,我建議你寫一個lisp函數,它可以做你想要的,而不是用宏來搞亂。

您可能會發現(format-kbd-macro nil t)有用的輸出,但是請注意,您應該使用像eval-last-sexp的命令在你的功能,使用該回報評價結果,而不是插入它變成一個較低級別的功能當前的緩衝區。

+0

謝謝sds,但這不是問題。同樣的按鍵手工操作也很好。我認爲這是與他們之間短暫停頓時做的事情,「手動」。 – 2013-02-19 19:25:07

+0

不要使用宏。編寫一個函數來評估clojure中的代碼並插入結果。這將解決您的時間問題。 – sds 2013-02-19 19:34:59

+0

好的,謝謝,會嘗試! – 2013-02-19 19:42:56

1

解決您尚未有一個問題,但很快就會:不要忘了計算表達式的結果之前插入一個'角色:你要(= (cons 1 nil) '(1)),不(= (cons 1 nil) (1))

+0

是的!謝謝。 – 2013-02-20 11:33:15