コード内で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はそのテキストを実行するようにシェルに指示します。
出典
2012-11-26 02:47:47
zck
これは非常に役に立ちます。ありがとうございます。私は今持っている: '(defun自動化接続) (対話型) (シェル) (" TERM = xterm \ n ssh -Y -C \ nスクリーン-rd "を挿入) (comint-send-input)私がすでにR-in-shellプロセスを実行していない限り '(ess-remote)'は実行されていないようです。私は '(comint-send-input)'と '(ess-remote)'の間で何かする必要があると思います –
Solomon