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 ファイルを弄っておくといい感じに補完やジャンプできるようになると思います

0 件のコメント:

コメントを投稿