iexとControl-g

# 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 でヘルプがみられるらしい。

``` diff
  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` でいいようです。

``` diff
  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 のコードを実行して確認してみましょう。

``` diff
  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` で一覧をみてみましょう。　

``` diff
  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` を押します。

``` diff
  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 にするには、こうしないといけなかったようです。もう一度最初からです。


``` diff
  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モードというらしい。まさか、**J**ob **C**ontro **L** !?