2013-02-19 33 views
1

我想在函數中調用global-set-key,併爲其提供參數以創建全局集合鍵。將字符串轉換爲全局設置鍵(elisp)的函數命令

(defun global-setter (arg1 arg2) 
(global-set-key arg1 '(concat "example" arg1 arg2)) 
) 

(global-setter "*" "^") 

這應該創建綁定在按下*時,功能example-*^應該叫。

我不知道如何獲取字符串作爲函數/命令名稱傳遞。我究竟做錯了什麼?

到目前爲止,我嘗試了`',@,(intern),(eval),(function)的組合,但我不知道我該怎麼做。

回答

2

一個原因你的代碼不工作是因爲你引用了(CONCAT ..)的表達,所以它永遠不會計算。全局集合鍵期望一個lambda或一個符號。

可以使用實習生構建一個符號,然後提供符號設置鍵:

(defun my-test() (interactive) (message "ok")) 
(global-set-key "\C-c!" (intern (concat "my" "-" "test"))) 

注意,通過全局設置的密鑰和變量調用的任何函數必須互動

+0

我只能說我一定錯過了缺乏'''的特定組合。但是,現在確實看起來有意義。非常感謝! – PascalVKooten 2013-02-19 09:56:08

0

使用lexical-let以限定closure,匿名函數值從在其被定義的環境引用:

(defun global-setter (arg1 arg2) 
    (lexical-let ((arg1 arg1) (arg2 arg2)) 
    (global-set-key arg1 (lambda() 
          (interactive) 
          (concat "example" arg1 arg2))))) 

的Emacs 24 natively supports詞法結合和關閉,所以lexical-let不再是必要的:

(defun global-setter (arg1 arg2) 
    (global-set-key arg1 (lambda() 
         (interactive) 
         (concat "example" arg1 arg2)))) 

爲了達到此目的,請務必在您的.emacs中將lexical-binding設置爲t,並將其添加到文件末尾t o確保詞彙結合用於字節編譯:

;; Local Variables: 
;; lexical-binding: t 
;; End: 
+0

它不工作,但不幸的是。你是否用這個函數創建了一個名爲'example - * ^'的函數?我懷疑它不起作用,因爲一旦你調用函數,它沒有包含arg1/arg2(因此不能將它們連接)。如我錯了請糾正我。 – PascalVKooten 2013-02-19 09:54:02

+0

@Dualinity閉包比構造函數名稱更強大 - 你可以在閉包中使用arg1和arg2做*任何*。 (在我的例子中,我展示瞭如何調用'concat'函數,因爲我明白這就是你想要做的事情。雖然'concat'沒有副作用,但這個例子沒什麼意義。)如果你只是想要動態構造函數的*名稱*,Joost的答案就是要走的路。 – user4815162342 2013-02-19 10:42:13