Erlang
Elixir
ElixirDay 15

iexとControl-g

More than 1 year has passed since last update.

Emacs と Control-g と私

私は Emacs というエディタを使っています。

Emacsでは「固まったりして困ったらとりあえずControl-g(以下 C-g)を押せ」ということになっているので、
困ると C-g を押すクセが私にはあります。

iex と C-g と私

iex を使っているときにも意図せずうっかり C-g を押してしまうことがあります。
すると

iex(1)>
User switch command
 -->

こんな状態になってしまい、このあと何をしていいのかさっぱりわからないので、
いつも C-c a で abort して、もう一回 iex をし直すというのを繰り返していました。

さすがに毎回iexを抜けるのはもう嫌なので、今回はここを掘り下げてみたいと思います。

ヘルプ

ググると、どうやら h でヘルプがみられるらしい。

  iex(1)>
  User switch command
+  --> h
+   c [nn]            - connect to job
+   i [nn]            - interrupt job
+   k [nn]            - kill job
+   j                 - list all jobs
+   s [shell]         - start local shell
+   r [node [shell]]  - start remote shell
+   q                 - quit erlang
+   ? | h             - this message

iex に戻りたい

単純に iex に戻りたいだけなら、 c でいいようです。

  iex(1)>
  User switch command
   --> h
    c [nn]            - connect to job
    i [nn]            - interrupt job
    k [nn]            - kill job
    j                 - list all jobs
    s [shell]         - start local shell
    r [node [shell]]  - start remote shell
    q                 - quit erlang
    ? | h             - this message
+ --> c

何も出ないので、不安になりますが、これでもうiexに戻っているようです。
elixir のコードを実行して確認してみましょう。

  iex(1)>
  User switch command
   --> h
    c [nn]            - connect to job
    i [nn]            - interrupt job
    k [nn]            - kill job
    j                 - list all jobs
    s [shell]         - start local shell
    r [node [shell]]  - start remote shell
    q                 - quit erlang
    ? | h             - this message
   --> c
+ self
+ #PID<0.88.0>
+ iex(2)>

めでたしめでたし。

remote?

r [node [shell]]  - start remote shell

というのが気になるので、試してみたいと思います。

2 つ iex を立ち上げておきます。

[手元のMac]$ iex --name temoto@192.168.1.100
[リモートのUbuntu]$ iex --name remote@192.168.1.200

remote と temoto。では r を試してみます。

iex(temoto@192.168.1.100)1>
User switch command
 --> r 'remote@192.168.1.200'
 -->

またしても何もでないので、うまく行ってないのかと思いきや、なんとこれで成功しています。
j で一覧をみてみましょう。 

  iex(temoto@192.168.1.100)1>
  User switch command
   --> r 'remote@192.168.1.200'
+  --> j
+    1  {erlang,apply,[#Fun<Elixir.IEx.CLI.1.131305237>,[]]}
+    2* {'remote@192.168.1.200',shell,start,[]}
+  -->

*(アスタリスク) がついているのが、現在選択されている shell(?) らしいです。
この状態で c を押します。

  iex(temoto@192.168.1.100)1>
  User switch command
   --> r 'remote@192.168.1.200'
   --> j
     1  {erlang,apply,[#Fun<Elixir.IEx.CLI.1.131305237>,[]]}
     2* {'remote@192.168.1.200',shell,start,[]}
+  --> c
+ Eshell V9.1  (abort with ^G)
+ (remote@192.168.1.200)1>

つながりました!つながりましたが、Eshell って出ちゃってますね...

iex にするには、こうしないといけなかったようです。もう一度最初からです。

  iex(temoto@192.168.1.100)1>
  User switch command
+  --> r 'remote@192.168.1.200' 'Elixir.IEx'
   --> j
     1  {erlang,apply,[#Fun<Elixir.IEx.CLI.1.131305237>,[]]}
+    2* {'remote@192.168.1.200','Elixir.IEx',start,[]}
   --> c
+ Interactive Elixir (1.5.2) - press Ctrl+C to exit (type h() ENTER for help)
+ iex(remote@192.168.1.200)1> System.cmd("whoami", [])
+ {"ubuntu\n", 0}

おー!ちゃんとリモートの iex に繋がったようですね。

以上、今回は C-g で出てくるアイツと仲良くなる、でした。
Erlang界では JCLモードというらしい。まさか、Job Contro L !?