« ^ »

Emacsで子プロセスを実行する

所要時間: 約 3分

Emacsで子プロセスを実行するには `start-process` を使います。第一引数にはEmacsが管理するためのサブプロセスの名前、第二引数はそのサブプロセスが使うバッファを指定します。

(start-process "SXIMADA" "TESTING-BUFFER" "/usr/local/bin/python3")

`TESTING-BUFFER` と言う名前のバッファに結びついた `SXIMADA` と言う名前で `/usr/bin/python` が起動します。 /usr/bin/pythonはPythonなのでPythonインタラクティブシェルが起動します。TESTING-BUFFERはこのようになります。

Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

このPythonにコードを送信して処理させてみましょう。プロセスにデータを送るためには2つの方法があります。

  • process-send-string: 指定した文字列をプロセスに送る
  • process-send-region: 指定したリージョンの文字列をプロセスに送る

process-send-stringを使って'Hello world!'をprintで表示してみます。

(process-send-string "SXIMADA" "print('Hello world!')\n")

TESTING-BUFFERは次のように表示されます。

>>> print('Hello world!')^M
Hello world!^M
>>>

Hello world!が表示できました。改行文字の表示^Mが邪魔なので表示させないようにしましょう。

(with-current-buffer "TESTING-BUFFER"
  (setq buffer-display-table (make-display-table))
  (aset buffer-display-table ?\^M []))

再度、Hello world!を表示させます。

(process-send-string "SXIMADA" "print('Hello world!')\n")

TESTING-BUFFERは次のように表示されます。

>>> print('Hello world!')
Hello world!
>>>

^Mが表示されなくなりました。

日本語も送信できるのか試してみましょう。

(process-send-string "SXIMADA" "print('こんにちわ')\n")

TESTING-BUFFERは次のように表示されます。

>>> print('こんにちわ')
こんにちわ
>>>

良さそうですね。日本語も正しく処理されています。

実行しているプロセスに送信した情報のアラインメントがおかしくなってC-cを送信して送信状態をリセットしたいことがあります。C-cするとプロセスにはSIGINTシグナルが送信されます。SIGINTは `interrupt-process` を使って送信します。

(interrupt-process "SXIMADA")

第一引数はプロセス名です。TESTING-BUFFERはこのようになります。

KeyboardInterrupt
>>>

送信したデータが中途半端な状態になってしまった場合はこれを行いましょう。

作業が終わったらプロセスを停止させます。ほとんどのプログラムはEOFを送信すると終了します。EOFを送信するには `process-send-eof` を使います。

(process-send-eof "SXIMADA")

TESTING-BUFFERはこのようになります。

>>> ^D

Process SXIMADA finished

Pythonが終了しました。プロセスは終了しても、バッファが消えるわけではありません。バッファの削除には `kill-buffer` を使います。

(kill-buffer "TESTING-BUFFER")

evalするとTESTING-BUFFERが削除されます。

先ほどprocess-send-oefを使ってプロセスを停止しました。他にdelete-processを使って停止することもできます。これはSIGKILLをプロセスに送信します。例えばプログラムがハングアップしてEOFを使っても停止しなくなった場合にはSIGKILLで終了する必要がありますが、その場合にdelete-processを使います。いわゆる強制終了になるので実行しているプログラムによってはデータが消えるなどの問題が発生する場合があります。

(start-process "SXIMADA" "TESTING-BUFFER" "/usr/local/bin/python3") ;; 起動
(delete-process "SXIMADA") ;; 停止

TESTING-BUFFERは次のように出力されます。

Python 3.6.3 (v3.6.3:2c5fed86e0, Oct  3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Process SXIMADA killed: 9