讓我們假設你只是想在代碼中調用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運行該文本。
來源
2012-11-26 02:47:47
zck
這是非常有益的,謝謝。我現在有:(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