DEV Community

Abubakar Azeem
Abubakar Azeem

Posted on

Why I Stopped Waiting on Ruby LSP and Built My Own Fuzzy Symbol Search for VS Code

If you've worked in a mid-to-large Rails codebase in VS Code, you've probably run into this: you want to jump to a method, you hit Ctrl/Cmd+T, you type a few letters — and either Ruby LSP hasn't finished indexing yet, or your search doesn't match because you're one character off from the real name.

Ruby LSP's workspace symbol search is genuinely useful once it's running, but it has two costs: it needs the gem install + LSP setup, and it needs a full index build before symbol search is reliable. On a large monolith, that's not instant. And even indexed, it does near-exact matching — abbreviate or misspell a symbol and you get nothing.

The alternative most people fall back on is VS Code's built-in text search (Cmd+Shift+F). It's fast and needs no setup, but it's just text matching — it doesn't know def process_payment is a method definition versus a comment mentioning "process_payment," and it has no concept of a Ruby symbol at all.

I wanted something in between: instant, zero-setup, and actually aware of Ruby syntax — not just literal text.

What I built

Ruby Symbol Search indexes Ruby symbols directly via lightweight pattern matching (not a full AST parse — deliberately, so indexing stays near-instant even on file save) across:

  • Classes and modules (including class << self)
  • Methods (def)
  • Constants
  • Attributes (attr_reader/writer/accessor, mattr_*, attribute, delegate, and friends)
  • Associations (belongs_to, has_many, has_one, has_and_belongs_to_many)
  • Scopes, aliases, namespaces, rake tasks

The headline feature is fuzzy search: Ctrl+Shift+R / Cmd+Shift+R opens a typo-tolerant search across every indexed symbol in your workspace. Get the name roughly right and it finds it. You can also scope results to one file with @filename.

It also wires the same index into VS Code's native "Go to Symbol in Workspace" picker (Ctrl/Cmd+T), Go to Definition (F12), and an Outline view in the sidebar — so it's not a separate tool bolted on the side, it's feeding the editor's built-in navigation too.

What it isn't

It's not a replacement for Ruby LSP if you want type inference, hover documentation, or diagnostics. It's specifically solving "get me to this symbol fast," and it works fine alongside Ruby LSP if you have it installed (there's a note in the README on avoiding duplicate results if both index the same symbols).

Try it

It's free and MIT licensed:

If you hit a Ruby symbol pattern it doesn't recognize, or a case where the fuzzy matching gets it wrong, open an issue — I'd rather know about the gaps than not.

Top comments (1)

Collapse
 
swapnoneel123 profile image
Swapnoneel Saha

the narrow scope and lightweight index make the tradeoff clear. i would add a small status for index age and pending files, then refresh results when a save changes a matched symbol. a test corpus with metaprogramming, comments, strings, and nested namespaces could show false positives from pattern matching. that would help users know when to use fuzzy search and when to switch to lsp.