2012-11-22 68 views
6

我正在使用本地emacs實例(aquamacs)在遠程服務器上運行R進程,並且想要自動執行連接到我的服務器的過程。該過程如下:如何自動執行這些emacs ESS(ess-remote)命令?

[emacs中]

M-x shell 

[在所得控制檯]

TERM=xterm 
ssh -Y -C <my remote server> 
screen -rd [and/or] R 

[emacs中]

M-x ess-remote 
r 

我發現了這個一般方法這裏:http://blog.nguyenvq.com/2010/07/11/using-r-ess-remote-with-screen-in-emacs/。 -Y -C選項允許您使用xterm查看圖。我不知道lisp和tho我搜索了一下,我似乎無法拼湊出如何實際定義一個函數來自動執行此操作(例如在.emacs.el中)。有沒有人執行過這樣的事情?

回答

6

讓我們假設你只是想在代碼中調用shell。在Lisp中,所有內容都是由括號括起來的前綴符號。所以,我們進入到緩衝區(比如,臨時緩衝區):

(shell) 

將鼠標指針移到緊密括號後的行的結尾,然後鍵入<C-x C-e>執行Lisp代碼。您應該看到調用shell函數。

現在,讓我們把它作爲一個函數,所以我們可以添加其他的東西。創建函數的命令是defun,而之所以如此命名的功能,參數列表(括號內),然後函數體:

(defun automate-connection() 
    (shell)) 

將光標移動到代碼的末尾,點擊<C-x C-e>,該功能將被定義。你可以通過執行從Lisp調用它

(automate-connection) 

好的,現在我們只需要將一些文本放入shell緩衝區。

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm")) 

現在,當我們運行該程序時,我們將「TERM = xterm」放入shell緩衝區。但它並不實際發送命令。我們試着換一個換行符。

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm\n")) 

這會放入一個換行符,但實際上並沒有使命令運行。爲什麼不?讓我們看看輸入鍵的作用。轉到*shell*緩衝區,然後鍵入<C-h c>,然後按回車鍵。 (<C-h c>運行describe-key-briefly,它打印通過按下給定鍵調用的函數的名稱)。這就是說,當你擊中RET時,它不會換行,但實際上調用了comint-send-input。因此,讓我們做到這一點:

(defun automate-connection() 
    (shell) 
    (insert "TERM=xterm") 
    (comint-send-input)) 

現在,當您從任何Lisp代碼`(自動連接),你應該送贈予的東西。我把它作爲練習給讀者添加你的​​其他命令。

但是等等!我們沒有真正做完,是嗎?我假設你不想移動到Lisp臨時緩衝區,輸入(automate-connection),然後評估該代碼。你可能只是想打字,然後每天給它打電話。您不能使用我們剛剛創建的功能默認執行此操作。幸運的是,它是簡單的允許:

(defun automate-connection() 
    (interactive) 
    (shell) 
    (insert "TERM=xterm") 
    (comint-send-input)) 

現在你可以調用它,只要你想,它會打開*shell*緩衝區,把文本,並告訴:只是在你的函數中添加一個調用(interactive) Emacs告訴shell運行該文本。

+0

這是非常有益的,謝謝。我現在有:(defun automate-connection() (interactive) (shell) (insert「TERM = xterm \ n ssh -Y -C \ n screen -rd」) (comint-send-input) (ess-remote) )' 但'(ess-remote)'似乎並沒有運行,除非我已經有一個R-in-shell進程在運行。我猜我需要在'(comint-send-input)'和'(ess-remote)'之間做些什麼 – Solomon