複数 Listener を使う - lisp-cookbook-ja/common-lisp GitHub Wiki
-
簡単にいうと、ひとつの Lisp 上にマルチプロセスでREPLをたくさん持てるという機能です。
-
eli ではひとつの Lisp に複数の Listener を持たせることができます。
-
それぞれの Listener は、Lisp 内の別プロセスとして動作します。OSのプロセスとしては Lisp 単体です。
-
それぞれの Listener は、Emacs 上の別々のバッファに紐付けられます。
-
このエントリでは、複数 Listener の起動と終了手順を紹介します。
-
前提として、M-x fi:common-lisp にて Emacs のサブプロセスとしてLisp を起動したものとします。
CL-USER(2): :processes
:processes
P Bix Dis Sec dSec Pri State Process Name, Whostate, Arrest
# 2 3 3 2.5 0 runnable Initial Lisp Listener
# 3 6 0 0.0 0 waiting Connect to Emacs daemon, waiting for input
# 4 2 0 0.0 0 inactive Run Bar Process
# 5 5 0 0.0 0 waiting Editor Server, waiting for input
CL-USER(3):
これは、M-x fi:common-lisp を実行した直後のプロセス状態です。Listener がひとつあります。
- (fi:open-lisp-listener -1 "my-lisp-listener") を Emacs 上で elisp として評価します。(M-: または scratch バッファにて C-x C-e を実施するなど)
- "my-lisp-listener" というバッファ名で REPL が現れます。これで完了です。
- :processes でプロセス状態を確認してみます。
CL-USER(3): :processes
:processes
P Bix Dis Sec dSec Pri State Process Name, Whostate, Arrest
# 6 3 0 0.0 0 waiting *my-lisp-listener*, waiting for input
# 2 2 3 0.0 0 runnable Initial Lisp Listener
# 3 6 0 0.0 0 waiting Connect to Emacs daemon, waiting for input
# 4 0 0 0.0 0 inactive Run Bar Process
# 5 0 0 0.0 0 waiting Editor Server, waiting for input
CL-USER(4):
my-lisp-listener というプロセス名で Listener プロセスができています。
- なお、fi:open-lisp-listener で起動したREPLのメジャーモードは、fi:inferior-common-lisp-mode ではなく、fi:lisp-listener-mode になります。
- :processes にて終了したい Listener が紐付いているプロセスを確認します。上の例では、my-lisp-listener でした。
- :kill でそのプロセスを終了します。
CL-USER(5): :kill '*my-lisp-listener*
CL-USER(6): :processes
:processes
P Bix Dis Sec dSec Pri State Process Name, Whostate, Arrest
# 2 4 3 0.1 0 runnable Initial Lisp Listener
# 4 0 0 0.0 0 inactive Run Bar Process
# 5 0 0 0.0 0 waiting Editor Server, waiting for input
# 3 0 0 0.0 0 waiting Connect to Emacs daemon, waiting for input
CL-USER(7):
ちゃんと消えてますね。
- :exit を実行すると、どの Listener で評価したかに関わらず、Lisp 自体が終了しますので要注意です。
- fi:open-lisp-listener で開いたREPLのバッファは、fi:inferior-common-lisp-modeにはなりません。fi:lisp-listener-modeになります。
- そのため、hook等の設定は、fi:inferior-common-lisp-modeのものは適用されません。
- fi:lisp-listener-mode の hook に個別に設定してあげてもよいですが、次の構成関係に従って、メジャーモード間でhookの設定を共有するのが便利です。
fi:inferior-common-lisp-mode fi:lisp-mode-hook
fi:subprocess-mode-hook
fi:inferior-common-lisp-mode-hook
fi:lisp-listener-mode fi:lisp-mode-hook
fi:subprocess-mode-hook
fi:lisp-listener-mode-hook
fi:common-lisp-mode fi:lisp-mode-hook
fi:common-lisp-mode-hook