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 に指示します。