2012-11-22 10 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) 
はクローズ括弧の後の行の末尾にポインタを移動し、Lispのコードを実行する <C-x C-e>を入力し

shell関数が呼び出されるはずです。

今、それを関数にして、他のものを追加することができます。関数を作成するコマンドはdefunあり、そしてそれは、関数の名前を取り、(カッコ内)引数リスト、およびその関数の本体:

(defun automate-connection() 
    (shell)) 

コードの末尾にカーソルを移動します、<C-x C-e>を押すと、その関数が定義されます。

(automate-connection) 

これで、テキストをシェルバッファに入れるだけでよいのです。

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

これを実行すると、「TERM = xterm」がシェルバッファに入れられます。しかし、実際にはコマンドを送信しません。改行を入れてみましょう。

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

これは改行を入れますが、実際にコマンドを実行するわけではありません。何故なの? Enterキーが何をするのか見てみましょう。 *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)と入力し、そのコードを評価していると仮定します。あなたはたぶん入力し、それを1日と呼ぶだけです。今作成したばかりの関数では、デフォルトではこれを行うことはできません。幸いにも、それはそれを許可するように簡単です:ちょうどあなたの関数で(interactive)への呼び出しを追加します。

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

今、あなたが望むようにそれを呼び出すことができ、そしてそれは、*shell*バッファを開くテキストに入れ、教えてあげますEmacsはそのテキストを実行するようにシェルに指示します。

+0

これは非常に役に立ちます。ありがとうございます。私は今持っている: '(defun自動化接続) (対話型) (シェル) (" TERM = xterm \ n ssh -Y -C \ nスクリーン-rd "を挿入) (comint-send-input)私がすでにR-in-shellプロセスを実行していない限り '(ess-remote)'は実行されていないようです。私は '(comint-send-input)'と '(ess-remote)'の間で何かする必要があると思います – Solomon

関連する問題