Help us understand the problem. What is going on with this article?

pryにコードをコピペするためにしておきたい設定

More than 5 years have passed since last update.

rails consoleなどでirbやpryといったREPL(Read-Eval-Print-Loop)を多用する開発をしていると、終いにはプログラムをそこに貼り付けて評価したくなるものです。しかし、REPLは、改行付きメソッドチェーンを上手く評価してくれないという問題があります。

関連して、Rubyでメソッドチェーンを改行して書くとき、ドットを行末に書くか、それとも行頭に書くかという議論がときどきありますが1、ドットを行末に書きたいメインの理由が「REPLに貼り付けたいから」だったりします。

とは言え、そのためだけにコーディングルールを変更したくもないわけで、ここでは、REPL側で解決するための二つの方法と、そのための設定を書きます。

方法1:一つの式にしてしまう

REPLが1行ごとに評価されるのは仕方がないので、一つの式にしてしまいましょう。ちなみにRubyはクラスやメソッド定義も式として扱ってくれるので、基本的に何も考えず()で囲むだけで十分です。

irb(main):001:0> (
irb(main):002:1* '1'
irb(main):003:1> .to_i
irb(main):004:1> )
=> 1

ただ、pryでメソッドチェーンを正しく認識してもらうにはもうひとつ障害があって、ドットから始めるとシェルコマンドを叩くコマンドとして認識されてしまいます。

[1] pry(main)> (
[1] pry(main)*   '1'
[1] pry(main)*   .to_i
Error: there was a problem executing system command: to_i

このコマンドはコマンドライン操作も含めてRubyでやろうという素敵な機能ですが、メソッドチェーンの方が大事なので外します2。以下のコードを~/.pryrcなどに書きましょう。

Pry.commands.delete '.<shell command>'

方法2:pasteboardの中身を直接評価する

基本的にMacでローカルでサーバー立てて開発してるというのであれば、pasteboardを直接評価してしまうコマンドを追加するという方法があります。適当にエディタで書いたプログラムをサクッと評価できるので地味に便利。

Pry.commands.delete '.<shell command>'

Pry.commands.block_command (/^.$/), "Evaluate string of `pbpaste`", keep_retval: true do
  string = `pbpaste`
  puts Pry::Helpers::BaseHelpers.colorize_code(string)
  target.eval string
end

# [1] pry(main)> .
# 1
#   .to_i
# => 1

以上です。


  1. https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains 

  2. 同じ思想のものとして Emacs Lisp で書かれた eshell などがあります。 

Altech
Wantedly People というサービスを作っています。サービスのコンセプトの設計から仮説検証、負債の管理からアーキテクチャ設計、プロジェクトマネジメントまでサービス開発に関わることであれば何でもやります。
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした