複数 Listener を使う - lisp-cookbook-ja/common-lisp GitHub Wiki

eli listener スレッド

複数 Listener を使う

  • 簡単にいうと、ひとつの 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 がひとつあります。

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 になります。

Listener 終了

  • :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 自体が終了しますので要注意です。

補足:lisp-listener-mode

  • 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
⚠️ **GitHub.com Fallback** ⚠️