Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
26
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

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

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 などがあります。 

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
26
Help us understand the problem. What are the problem?