Ruby の Debug に便利そうな SeeingIsBelieving をエディタに組み込む

# 概要

[Seeing Is Believing](https://github.com/JoshCheek/seeing_is_believing)

チェインで記述しているコードを一行ごとに評価して、結果を表示してくれる Gem。

例えばこんなコードがあったら

```rb
(1..10).map {|i| i * 2 }
  .select {|i| i % 5 == 0 }
  .map(&:odd?)
```

こうなる

```rb
(1..10).map {|i| i * 2 }     # => [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  .select {|i| i % 5 == 0 }  # => [10, 20]
  .map(&:odd?)               # => [false, false]
```

途中でバグを埋め込んでないか確認するのに便利そう。
Vim, Emacs, Atom, Sublime, TextMate と色々なエディタに組み込めるようなので、Sublime に入れてみる。

# 入れてみる

まずは、install する

```
gem install seeing_is_believing
```

なんか変なの表示された

```
Fetching: seeing_is_believing-3.1.1.gem (100%)
              .7
     .      .M
      .  . .N
      M.  ..O
     =. .. .M
     N . .  .N
      O.. . . O
        MN:. . M
           OM...N
             N .OM                 .NM8MMMMMM
             O ..N             ...MM=:Z7?Z7??MMMMIMMOM8N
             M...O        ,MMMMMMMMMM$$:=ZZ$~:$?7ZMMMMM8?M
           .N .  M       MMI$7:==?:77MMMM7$O~+~ZO~~I=7ZMMMM
           O$...N        M=$ZZI=MMM7ZZI=?MMZ+:$I?8Z~?ZO~=ZIMM
        .MN ...O         M~?Z==ZZZ=MM$$=$ZZMMO=~~?$=$Z~~OO+=MM
        OM ...,M      DAAAAAAAAAAAAAAAAAAAAAAAM=Z=+OOI=+ZO$O+MM
      NOM.. . N     DAAAAAAAAAAAAM?:DAAAAAAAAAAAAM$ZZ?$+IZ7+8?M8
     NOM.....O     DAAAAAAAAM:....DAAAAAAAAAAAAAAM78OI+D=78=$MM
    NO.. ...MN     DAAAAAAAM.......DAAAAAAAAAAAAAM,MMMO7?I8Z7OM
   MN.... ..O       DAAAAAM.........DAAAAAAAAAAAAM..~MM?NMM7O8MM
  NOM..  ..MN        DAAM............DAAAAAAAAAAM.......MM7.MMM
 NOM.. .. .OM         M................DAAAAAAAM...........MM:M
 NOM. .. ..NO        M...................~DAAM..............I,,M
 NOM.. .. .MN       MM...ZMMMMMM.............................=MM
 NOM. . ... O       M..MMMNMMMMMMMMZ..........................$MI
 NOM8.. .. .MM      MZMMMMMMMMMMMMMMM.........M~...............MM
  NOM .. . . NOM    M........................8M$................MM
   NOMO. . . . .    M.MMMMMMMMMMMMNMMMMNMMMMMM..................MM,
     NOMM8.  .     M:MM  MM......................................MM
           .    .MMMM     MMMM.............7ZMM..................MM
               .MNOM      MMMMMMMMMMMMMMMMMMM....................OMM
                 H         MMMMMMMMMMMMMMMMM.......,..............MM
                            MMMMMMMMMMMM=.........MM..............MMN
                              :MMMM................M.......M......MMM
                                 MMM..............MN.....:7.......MMM .MMMMMM
   Seeing                        MMMM.........M...M.....M.........MMMM......MM
                                 M..MMM.......M...M....=I........MM.........M
      is                         M..MMMM.....M....M....M.....MMM:..........MM
                                MM..M  MMM...M...MM...M....MMM.............M,
  Believing                    .M..MM   MMMMMM...M....M...................MM
                       ..MMMMMMMM..M   M..MMM...MM...OM..............MN..MM
                     M.............M  MMM..MM...MMMMMMM.............M..+MM
                     :MM7....M..IMM  D ..M?M...MM     M...........MM..MM,
                          .M..M..    ... gM+...M      NM........MMM..MM
                                  .MM+gZMM.....M       MMMMMMMMMM....M
                                  MI..8MM,....MM           .MMM..M..M
                                 MMM...MMMM..MI       ..OMMM..OMM..MM
                                M...MD....M M        M.....NMM..MM..M
                                MMMM.....M ..M      .M:...M....M....M
                                           MM          MMMM......MMMI
Successfully installed seeing_is_believing-3.1.1
Parsing documentation for seeing_is_believing-3.1.1
Installing ri documentation for seeing_is_believing-3.1.1
Done installing documentation for seeing_is_believing after 0 seconds
1 gem installed
```

[RSpec の Progress Bar をカスタマイズする](http://qiita.com/pekepek/items/1f725447ff25dda1f75d)で AA の辛さを知ったから、尊敬するな...

install が終わったら Sublime の Package 管理のディレクトリに移動して、
[sublime-text-2-and-3-seeing-is-believing](https://github.com/JoshCheek/sublime-text-2-and-3-seeing-is-believing) を SeeingIsBelieving という名前で clone してくる

```
cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages
git clone git@github.com:JoshCheek/sublime-text-2-and-3-seeing-is-believing.git SeeingIsBelieving
```

最後に、[setting](https://github.com/JoshCheek/sublime-text-2-and-3-seeing-is-believing/blob/master/Seeing%20Is%20Believing.sublime-settings) を自分の環境に合わせて書き換える。

私の場合、rbenv を使っているので `ruby_command` はそのまま、Ruby の version は 2.3.0 なので `RBENV_VERSION` を書き換える。

```
{
  "ruby_command": "~/.rbenv/shims/ruby",
  ...
  "environment_variables": {
    "RBENV_VERSION": "2.3.0",
    "LANG": "UTF-8"
  },
  ...
```

準備完了！！

# 使ってみる

Sublime で以下のコードを書いて

```rb
(1..10).map {|i| i * 2 }
  .select {|i| i % 5 == 0 }
  .map(&:odd?)
```

`⌥ + ⌘ + B`！

```rb
(1..10).map {|i| i * 2 }     # => [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  .select {|i| i % 5 == 0 }  # => [10, 20]
  .map(&:odd?)               # => [false, false]
```

おー！
もっとわけわからないコードを書いてみると

```rb
(1..10).map {|i|
    a = i * 2
    b = i * 3
    a + b
  }.select {|i|
    n = (i + 4) * 3 - 4
    n % i == 1
  }.map(&:odd?)
```

`⌥ + ⌘ + B`！

```rb
(1..10).map {|i|         # => 1..10
    a = i * 2            # => 2, 4,  6,  8,  10, 12, 14, 16, 18, 20
    b = i * 3            # => 3, 6,  9,  12, 15, 18, 21, 24, 27, 30
    a + b                # => 5, 10, 15, 20, 25, 30, 35, 40, 45, 50
  }.select {|i|          # => [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
    n = (i + 4) * 3 - 4  # => 23,    38,    53,    68,    83,    98,    113,   128,   143,   158
    n % i == 1           # => false, false, false, false, false, false, false, false, false, false
  }.map(&:odd?)          # => []
```

おー！！
途中にバグがあった場合はエラーを表示してくれます。

```rb
(1..10).map {|i|         # => 1..10
    {i: i}               # => {:i=>1}, {:i=>2}, {:i=>3}, {:i=>4}, {:i=>5}, {:i=>6}, {:i=>7}, {:i=>8}, {:i=>9}, {:i=>10}
  }.select {|i|          # => [{:i=>1}, {:i=>2}, {:i=>3}, {:i=>4}, {:i=>5}, {:i=>6}, {:i=>7}, {:i=>8}, {:i=>9}, {:i=>10}]
    n = (i + 4) * 3 - 4  # ~> NoMethodError: undefined method `+' for {:i=>1}:Hash
    n % i == 1
  }.map(&:odd?)

# ~> NoMethodError
# ~> undefined method `+' for {:i=>1}:Hash
# ~>
# ~> path/to/hoge.rb:5:in `block in <main>'
# ~> path/to/hoge.rb:4:in `select'
# ~> path/to/hoge.rb:4:in `<main>'
```

おー！！！
表示した値は `⌥ + ⌘ + V` で非表示にできます。

たまに途中で Debug したいときとか [tapp](https://github.com/esminc/tapp) を使って途中結果を表示させたりしていたんですが、これで一発でわかりますね。便利！