ラベル robe の投稿を表示しています。 すべての投稿を表示
ラベル robe の投稿を表示しています。 すべての投稿を表示

2023年5月18日木曜日

(emacs)robeを再起動する方法

(emacs)robeを再起動する方法

概要

robe-start すると inf-ruby 経由で pry バッファが起動します
新規でファイルを追加したり既存のファイルを変更すると pry バッファには反映されません

今回はそんなときに使える pry バッファの再起動方法を紹介します

環境

  • macOS 11.7.6
  • emacs 28.2
  • robe 20221207.225
  • pry 0.14.2

仕組み

robe を再起動するということは pry バッファを削除し再度 robe-start を実行することと同義です

なのでそれを行う関数を定義するだけです

コード

(defun restart-pry-buffer ()
  "Restart the Pry buffer by killing it and starting robe again."
  (interactive)
  (let ((pry-buffer (get-buffer "*pry*")))
    (when pry-buffer
      (kill-buffer pry-buffer)))
  (robe-start))

使い方

  • M-x restart-pry-buffer

注意点

kill-buffer と robe-start の際に確認を求められます

改良版: kill-buffer 時に確認を求められない

(defun restart-pry-buffer ()
  "Restart the Pry buffer by killing it and starting robe again."
  (interactive)
  (let ((pry-buffer (get-buffer "*pry*"))
        (kill-buffer-query-functions nil)
        (kill-buffer-hook nil))
    (when pry-buffer
      (kill-buffer pry-buffer)))
  (robe-start))

2022年12月12日月曜日

robe で Date などのビルトインクラスのソースを確認する方法

robe で Date などのビルトインクラスのソースを確認する方法

概要

Date や String のメソッドに関しては pry-doc のリファレンスを参照することができますがクラスそのものにジャンプすることはできません (Can’t find the location になる)

一応たどる方法があるので紹介します

環境

  • macOS 11.7
  • emacs 28.1

方法: pry で show-source を実行し CRuby のソースコードを入手する

emacs で pry バッファに移動して以下のように show-source Date を実行しましょう

[11] pry(main)> show-source Date
Identifier not found - do you want to install CRuby sources to attempt to resolve the identifier there?
This allows the lookup of C internals Y/N Y
Downloading and setting up Ruby 3_1_2 source...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 14.3M    0 14.3M    0     0  2518k      0 --:--:--  0:00:05 --:--:-- 2429k
Generating tagfile!
...Finished!

これで再度 Date からジャンプすればソースコードを参照できるようになります

最後に

ちなみに Date を継承している DateTime はこの方法でも参照できないようです
おそらく pry-doc で show-source DateTime すると親クラスの Date のソースが確認できるのでそもそも無理なのかもしれません

そもそもビルトイン関係の実装まで確認したいケースは少ないと思いますが一応これで確認できます
面倒な場合は emacs からでなく直接 CRuby のソースをダウンロードして見るのでもいいと思います

2022年12月6日火曜日

emacs robe 使い方 Tips

emacs robe 使い方 Tips

概要

基本的な設定や使い方はこちらを御覧ください
本記事ではトラブルシューティングや Tips を紹介します

環境

  • macOS 11.7
  • emacs 28.1

too long; didn’t read

  • vim vendor/ruby/3.1.0/bin/pry
require 'bundler'
Bundler.require
['lib', 'controller'].each { |dir| Dir["#{__dir__}/../../../../#{dir}/*.rb"].each {|file| require file } }

Can’t find the location と Method not found 対策

インストールした gem にしろ自分で作成した Ruby ファイルにしろ ruby-load-file で emacs に認識させないと上記のエラーになります

認識させたいファイルを開いて C-c C-l でロードできます

pry バッファで全部ロードする

robe-start すると pry が実行できるインタラクティブバッファが作成されるのでそこで自作の rb ファイル require するのはありです

例えば lib 配下にあるファイルをすべて ruby-load-file するには以下を実行します

Dir["./lib/*.rb"].each {|file| require file }

複数のディレクトリがある場合は以下のような書き方もありです

['lib', 'controller'].each { |dir| Dir["#{__dir__}/../../../../#{dir}/*.rb"].each {|file| require file } }

自動化するには

例えば pry ファイルに上記のロードスクリプトを一行足しても OK です
サンプルは相対パスを使っていますがフルパスでも OK です

  • vim vendor/ruby/3.1.0/bin/pry
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'pry' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'
Dir["#{__dir__}/../../../../lib/*.rb"].each {|file| require file }

Gem.use_gemdeps

version = ">= 0.a"

str = ARGV.first
if str
  str = str.b[/\A_(.*)_\z/, 1]
  if str and Gem::Version.correct?(str)
    version = str
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('pry', 'pry', version)
else
gem "pry", version
load Gem.bin_path("pry", "pry", version)
end

一部の gem がなぜかロードされていない

例えば slack-incoming-webhooks gem の Slack::Incoming::Webhooks がなぜか参照できません
理由は不明ですがこれも ruby-load-file で vendor ディレクトリ以下からロードすればちゃんとジャンプできるようになります

対策

これも pry でロードすれば OK です
以下 pry バッファで実行しましょう

require 'bundler'
Bundler.require

自動化するには

これも pry ファイルに書いてしまいましょう

  • vim vendor/ruby/3.1.0/bin/pry
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'pry' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'bundler'
Bundler.require
Dir["#{__dir__}/../../../../lib/*.rb"].each {|file| require file }

require 'rubygems'

Gem.use_gemdeps

version = ">= 0.a"

str = ARGV.first
if str
  str = str.b[/\A_(.*)_\z/, 1]
  if str and Gem::Version.correct?(str)
    version = str
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('pry', 'pry', version)
else
gem "pry", version
load Gem.bin_path("pry", "pry", version)
end

Bundler.require は基本的に追記して OK だと思います
自分で作成したスクリプトを require する場合はメインとなるスクリプトを require してしまうと実行されてしまうので注意しましょう

ファイルが追加されたり gem が追加された場合は

pry を再起動したくなります
簡単なのは emacs をまるごと再起動すれば OK です
emacs を起動したまま robe を再起動したい場合は pry バッファを kill して再度 robe-start すれば OK です

複数のプロジェクトを開く場合には

複数のプロジェクトで robe-start してしまうと2つ目に開いたプロジェクトが1つ目の pry バッファを参照してしまいうまく動作しません
2つ目のプロジェクトで robe を起動したい場合は inf-ruby-console-auto を実行しましょう

最後に

面倒ですが robe-start 前に pry ファイルを弄っておくといい感じに補完やジャンプできるようになると思います