2012-12-28 91 views
1

我有一個可執行文件,可以從終端命令行使用。從emacs呼叫shell

$ foo "bar" 返回文本

我希望能夠在編輯文件來調用這個函數的單行。

我可以看到,我可以做以下

M-! ~/Library/yolo/bin/foo "bar" 和我得到正是我所期待的。

所以我想寫一個函數,然後我可以綁定到鍵。但我很難過。

(setq foobar-path "~/Library/yolo/bin/foo ") 
(defun foo-bar (func) 
    (shell-command (concat foobar-path func))) 

(global-set-key (kbd "M-p") foo-bar) 

但我知道(emacs告訴我),我的方式。

我將理想地結了的是,可發送的代碼行鍵綁定(如評估最後一個表達式)到外部的功能和顯示在該消息欄中的屏幕的底部返回。

任何提示?

回答

2

你的代碼有兩個問題:

  • 需要引用傳遞給global-set-key符號。
  • 該功能必須是一個「命令」。這是通過包含頂級interactive表單標記爲交互式可調用的任何emacs功能。

特別是,如果你想從迷你緩衝區的func參數傳遞,你可以這樣做:

(setq foobar-path "~/Library/yolo/bin/foo ") 
(defun foo-bar (func) 
    (interactive "sEnter func: ") 
    (shell-command (concat foobar-path func))) 

(global-set-key (kbd "M-p") 'foo-bar) 
+0

太棒了!只有兩個問題......如果發送給foo-bar的第一個字符是/程序返回但沒有值。有沒有辦法使輸入的字符串成爲「字符串」?所以'M-p欄 - >「欄」。其次,是否有類似於交互的功能,需要一行文本(如來自文件)? – beoliver

+0

我認爲你必須手動引用字符串。我不認爲有一種替代交互式的方法,並且請注意,您仍然需要交互式而沒有參數來使一個函數可以與一個鍵綁定。 – ataylor

+0

請注意,如果您在elisp中構建shell命令,您可能希望調用'shell-quote-argument'。 – phils