6

ローカルの emacs インスタンス (aquamacs) を使用してリモート サーバーで R プロセスを実行していますが、サーバーへの接続プロセスを自動化したいと考えています。プロセスは次のとおりです。

【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 を知りませんし、少しググってみましたが、これを自動化する関数を実際に定義する方法をまとめることはできないようです (たとえば、.emacs.el で)。誰かがこのようなものを実装しましたか?

4

1 に答える 1

5

shellコードで呼び出したいだけだとしましょう。Lisp では、すべてが括弧で囲まれた接頭表記です。したがって、これをバッファ (たとえば、スクラッチ バッファ) に入力します。

(shell)

ポインタを閉じ括弧の後の行末に移動し、タイプ<C-x C-e>して Lisp コードを実行します。shell関数が呼び出されたことがわかります。

では、これを関数にして、他のものを追加できるようにしましょう。関数を作成するコマンドはdefunで、関数の名前、引数リスト (括弧内)、関数の本体を受け取ります。

(defun automate-connection ()
  (shell))

カーソルをコードの最後に移動して を押す<C-x C-e>と、関数が定義されます。実行することでLispから呼び出すことができます

(automate-connection)

OK、あとはテキストをシェル バッファに入れるだけです。

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

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

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

これは改行を入れますが、実際にはコマンドを実行しません。なぜだめですか?エンターキーの機能を見てみましょう。*shell*バッファに移動し、 と入力<C-h c>してリターン キーを押します。( <C-h c>runs describe-key-briefly、指定されたキーを押すことによって呼び出される関数の名前を出力します)。つまり、RET を押すと、改行が挿入されるのではなく、実際に が呼び出されるということcomint-send-inputです。それでは、それをしましょう:

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

これで、任意の Lisp コードから `(automate-connection) を実行すると、指定されたものが送信されます。他のコマンドを追加するための演習として、読者に任せます。

ちょっと待って!まだ終わっていませんよね?Lisp スクラッチ バッファに移動して と入力し(automate-connection)、そのコードを評価する必要はないと思います。と入力するだけで終わりです。先ほど作成した関数では、デフォルトでそれを行うことはできません。(interactive)幸いなことに、それを許可するのは簡単です:関数に への呼び出しを追加するだけです:

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

これで、必要に応じて呼び出すことができます。*shell*バッファが開き、テキストが挿入され、シェルにそのテキストを実行するように Emacs に指示します。

于 2012-11-26T02:47:47.477 に答える