Ruby の完全なクラス名(FQCN)を一発で取得する方法 ~ ruby-fqcn.nvim ~
Ruby のコードを書いていると、あるクラスの完全な名前がほしくなるときがよくあります。
例えば以下のクラスであれば :: で区切られた Foo::Bar::Baz という文字列が欲しいです。
module Foo
module Bar
class Baz
# ..
end
end
end取得したあと、別のクラスから呼び出すときに利用したり..
baz = Foo::Bar::Baz.new(...)テストコードを書くときに使えますよね。
RSpec.describe Foo::Bar::Baz do
# ..
endその他にも、人あるいはAIとのテキストでのやり取りのときに、誤解が起こらないように完全なクラス名を使いたいことはよくあるのではないでしょうか。
ちなみに、このような完全なクラス名は FQCN (Fully Qualified Class Names) と呼ばれるようです。
要求は単純、しかし意外に手間がかかる
"FQCNが欲しい" という非常に単純な要求である一方、意外と取得するのが面倒くさいです。
1から手入力するのはクラスが長いと大変ですし、タイポする可能性があるのであまりやりたくないところです。
しかし、コピーするにもいい感じにコピーはできないので、module や class キーワードごとコピーしたあとに不要なワードを消しつつ :: で連結するというようなことをしないといけないです。
なんとか、楽ができないでしょうか。
そうして ruby-fqcn.nvim が作られた
前回の記事 で ruby-block-toggle.nvim というブロックの書き方を do-end <-> {} でトグルするプラグインを開発している中で、Treesitter の可能性にようやく気がついた私は、同じように Treesitter を使って AST を取得すれば正確なクラス名がサクッと取得できるのではないかと考え、試してみました。
その結果、ruby-fqcn.nvim というそのままの名前の Neovim プラグインができました。
:CopyRubyFQCN コマンドを実行すると、カーソル位置を基準とし、その位置における FQCN を取得してクリップボードにコピーできます。
カーソル位置を基準とするため、1ファイル内に複数のクラスが存在する場合でも問題ありません。
また、class や module 以外の Struct.new や Data.define など名前空間を区切るものにも対応しています。
実際には、:CopyRubyFQCN コマンドを打つのも面倒なため、私は <leader>ry というキーマップでコピーができるようにしています。
おわりに
まだ1週間くらいしか使っていませんが、もう何回も使っていて結構お気に入りになりそうです。
Treesitter でプラグインのネタがどんどん広がっていきそうです。Ruby をよく書く Neovim 使いの方はよければ使ってみてください。

h3pei
フリーランスのソフトウェアエンジニア。Ruby / Rails アプリケーションの開発が得意領域。設計・実装・運用まで含めてプロダクト開発が好きです。
Questalという目標達成コミュニティサービスを開発しました。仲間と一緒に目標達成に取り組みたい方はぜひご利用ください。
