経緯
pryって便利ですよねえ。
と言いつつ「pryのコピーってどうするの・・・?」とずっと思ってました。
まあ、もちろん普通のコピペのやり方であれば無難に出来るんですけど長文の結果が出てきたときにコピーするの大変じゃないですか・・・。
pbcopyどこなの・・・という気持ちを抑えながら(´ε` )
なので、とりあえず簡易的にコピペできるコマンドを書きました!
やりたいこと
- 最後に実行したコマンドをコピー
- 最後に実行したコマンドの結果をコピー
- 最後に実行したコマンドと結果をコピー
コマンド
- ということで、下記コマンドを
.pryrc
にぺぺっと貼ってください。 - それで、pryを立ち上げてaliasに設定したコマンドを実行するとうまくいくと思います。
def pbcopy(str)
IO.popen('pbcopy', 'r+') {|io| io.puts str }
_pry_.output.puts text.green("--- Copy to ClipBoard ---")
_pry_.output.puts str
end
Pry.config.commands.command "copy-history", "History copy to clipboard" do |n|
pbcopy _pry_.input_ring[n ? n.to_i : -1]
end
Pry.config.commands.command "copy-result", "Last result copy to clipboard" do
pbcopy _pry_.last_result
end
Pry.config.commands.command "copy", "Copy to clipboard" do |str|
unless str
str = "#{_pry_.input_ring[-1]}#=> #{_pry_.last_result}\n"
end
pbcopy str
end
Pry.config.commands.alias_command 'co', 'copy'
Pry.config.commands.alias_command 'ch', 'copy-history'
Pry.config.commands.alias_command 'cr', 'copy-result'
実行結果
pry(main)> 1+1+1
=> 3
pry(main)> ch
--- Copy to ClipBoard ---
1+1+1
# ペーストすると 1+1+1 がコピーされていることが分かる
pry(main)> 1+1+1
=> 3
pry(main)> cr
--- Copy to ClipBoard ---
3
# ペーストすると 3 がコピーされていることが分かる
pry(main)> 1+1+1
=> 3
pry(main)> co
--- Copy to ClipBoard ---
1+1+1
#=> 3
# ペーストすると
# 1+1+1
# #=> 3
# がコピーされていることが分かる
ちなみに
_pry_.input_ring
の中身はこうなっているらしいです。bufferから値を取得してるのかな。
pry(main)> 1+1+1
=> 3
pry(main)> 2+2+2
=> 6
pry(main)> 3+3+3
=> 9
pry(main)> _pry_.input_ring
=> #<Pry::Ring:0x00007fe7b36b0308
@buffer=[nil, "1+1+1\n", "2+2+2\n", "3+3+3\n", "_pry_.input_ring\n"],
@count=5,
@max_size=100,
@mutex=#<Thread::Mutex:0x00007fe7b36b02e0>>
一応、chをこう使うこともできます。引数を与えてあげるとindexに基づいた値を取得してくれる。
最新の値は -1
から始まって -1
ずつ古くなっていきます。
(Enter押すと ""
空文字がBufferに入っていく)
# 上記の状態から
pry(main)> ch -2
--- Copy to ClipBoard ---
3+3+3
Pry#input_array is deprecated
input_array
を使ってたんですけど推奨されてないようなので input_ring
を使用しています。
warning: method Pry#input_array is deprecated. Use Pry#input_ring instead
pryのwikiはこちらです。
まとめ
これでめちゃくちゃ長い値も簡単にコピーできるようになって嬉しい・・・!