概要
基本的な設定や使い方はこちらを御覧ください
本記事ではトラブルシューティングや 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 ファイルを弄っておくといい感じに補完やジャンプできるようになると思います
0 件のコメント:
コメントを投稿