Sitemap

I left PhpStorm after 10 years.

7 min readApr 11, 2026

--

Press enter or click to view image in full size

Not because of PHPStorm is bad. It’s a great IDE; and it was go to choice for me for years, but every time I open it now, I feel the weight of everything it shows you.

Panels. Toolbars. Inspections. Menus inside menus. Every feature visible at all times. That’s the trade-off with a full IDE — it gives you everything, and your brain has to filter out what you don’t need right now.

After a decade, that cognitive load was the thing I noticed most. I wanted keyboard-first flow. So I moved to LazyVim.

Learn Vim first

I want to be upfront about this: if you don’t already know Vim motions, don’t start with LazyVim.

Learn Vim first. The motions, the grammar (d2w, ci", vip), the mental model of modes. Use vimtutor. Use Vim keybindings in your current IDE. Get fluent enough that your hands think in Vim before your brain does.

LazyVim is a Neovim distribution — it gives you a pre-configured, IDE-like experience on top of Neovim. But if you don’t speak Vim, you’ll be fighting two things at once: the editor and the language. That’s a losing battle.

Vim fluency is the foundation. Everything else builds on top of it.

The timeline

It took 6–8 months before I felt genuinely productive. Not days. Not weeks. Months.

By month two I was working in it daily. But I wasn’t fast. I was constantly reaching for things that weren’t there yet. I spent more time configuring than coding. Every session ended with me tweaking something to match how I think.

That was the real work — replacing PhpStorm’s features one plugin at a time.

The replacement map

Here’s what I replaced and the order I replaced it in. This wasn’t a weekend project. It was months of swapping one thing at a time, living with the gaps in between, and slowly closing them.

Don’t let that scare you. The transition doesn’t have to be painful — it just has to be consistent. You don’t replace everything at once. You replace one thing, get comfortable, then replace the next. If you’re disciplined about it, each week gets a little smoother. It won’t happen overnight, but if you’re persistent, you will get there.

Month 1–2: The basics

The first things you need are the things you use every minute — navigation, code intelligence, and git. Without these, you can’t work at all.

LSP / IntelliSense → Intelephense + Mason

PhpStorm’s PHP support is best-in-class. In Neovim, Intelephense via Mason gets you 90% there — completions, definitions, references, diagnostics. I added custom diagnostic filtering to suppress Laravel-specific false positives (static method calls on facades, undefined helper functions).

For Go, gopls works out of the box. TypeScript, Python, Lua, Docker, Terraform, YAML — all configured through Mason with auto-install. See the LSP config →

File Navigation → Harpoon + Telescope

PhpStorm has tabs. I use Harpoon for my working set — mark up to 3 files and jump between them with <leader>j, <leader>k, <leader>l. Telescope handles everything else — file search, grep, LSP symbols.

No tabs. No file tree most of the time. Just the files I’m working on, one keypress away. See the Harpoon config →

Git → Lazygit

The feature I missed most was PhpStorm’s three-pane merge conflict UI. If you’ve resolved complex conflicts in a large codebase, you know how good it is — indentation-aware, visual, intuitive.

Then I found Lazygit.

Press enter or click to view image in full size

Its git integration is second to none. Staging, committing, rebasing, cherry-picking — all keyboard-driven, all fast. And the merge conflict resolution is genuinely on par. Three-way diff, inline editing, keyboard-first. <leader>gg opens it from anywhere.

This was the moment I stopped thinking about going back. See the full git config →

Month 3–4: The workflow

With the basics solid, I started replacing the tools I reached for every day — testing, Laravel navigation, API debugging.

Laravel Idea / Navigation → laravel.nvim + custom smart goto

This one hurt. Laravel Idea in PhpStorm is magic — click on config('app.name') and it jumps to the config file. Click on a view name and it opens the Blade template. Click on a route name and it finds the definition.

I rebuilt this with laravel.nvim plus a custom smart_goto function. It detects what’s under my cursor — config(), view(), route(), trans(), controller references — and jumps to the right file. If I’m on a function definition in a controller, it searches routes for what references it. If nothing Laravel-specific matches, it falls back to LSP definitions, and if I’m already at the definition, it shows references instead.

One key (gd) does the right thing everywhere. See the full Laravel config →

Test Runner → vim-test + Vimux

PhpStorm runs tests in a built-in panel. I use vim-test with Vimux, which sends test commands to a tmux pane.

Press enter or click to view image in full size

<leader>Tt runs the nearest test. <leader>Tf runs the file. <leader>Ts runs the suite. Results appear in a tmux split — I can see them without leaving my editor, and the pane persists between runs. See the test runner config →

REST Client → Kulala

PhpStorm has an HTTP client built in. I replaced it with kulala.nvim. Write requests in .http files, hit <leader>rs to send. It supports environments, variables, and formats JSON responses with jq.

It’s actually better than PhpStorm’s — the .http files are version-controlled and shareable. See the Kulala config →

Month 5–6: The hard ones

These were the features I kept going back to PhpStorm for. The ones where I’d open PhpStorm “just this once” and then close it again.

Database Client → vim-dadbod

PhpStorm’s database panel is excellent. vim-dadbod with vim-dadbod-ui gets close. SQL completion, saved queries, multiple connections.

I added environment-based background colors — staging gets an orange tint, production gets red. You never forget which database you’re connected to. See the dadbod config →

Xdebug / Debugger → nvim-dap

PhpStorm’s debugger is click-a-button simple. In LazyVim, I use nvim-dap with nvim-dap-ui and the PHP debug adapter via Mason.

Press enter or click to view image in full size

I have three layouts: a minimal view (scopes + breakpoints), a full sidebar (scopes, breakpoints, stacks, watches), and a bottom console. Breakpoints persist across sessions. Each project can define its own DAP config — path mappings, ports, Xdebug settings.

It works. It took the longest to get right. See my full DAP config →

Month 7–8: Beyond PhpStorm

By now I wasn’t replacing PhpStorm features anymore. I was building things PhpStorm never had — custom Telescope pickers for git workflows that fit exactly how I think.

Modified files since branch diverged. Commit search. Branch comparison. Unique commits between branches. Git reflog browser. Line-level blame history. Each one opens in Telescope with previews. See the extended git config →

The convergence

Slowly, everything came together.

Ghostty as my terminal. Tmux for panes and window management — switching between projects is Ctrl-b + a number. LazyVim for editing. Lazygit for version control. vim-tmux-navigator to move between tmux panes and Neovim splits with the same Ctrl-h/j/k/l keys.

My editor. My servers. My git workflow. My AI tools. All in one terminal. No window switching. No context loss. No searching through UI panels to find the right tool.

One screen. One keyboard. Everything I need.

Was it worth it?

The speed came — but the real gain wasn’t speed. It was focus. When there’s nothing to look at except your code, your brain stops filtering and starts thinking.

Was it worth 6–8 months of friction? Yes.

Would I go back? No.

Not because LazyVim is better than PhpStorm. But because the terminal became my entire environment — and once everything lives in one place, you don’t want to leave.

Full config

All configs referenced in this post are in one gist: brainlet-ali/phpstorm-to-lazyvim

PhpStorm featureLazyVim replacementConfigXdebug / Debuggernvim-dap + nvim-dap-uidap.luaTest Runnervim-test + Vimuxtest.luaREST Clientkulala.nvimrest.luaDatabase Clientvim-dadbod + dadbod-uidadbod.luaGit / Merge ConflictsLazygit + Telescope pickersgit.luaLaravel Idealaravel.nvim + smart gotolaravel.luaFile TabsHarpoonharpoon.luaTmux Navigationvim-tmux-navigatortmux-navigator.luaIntelliSense / LSPIntelephense + Masonlsp.luaRefactoringrefactoring.nvimrefactoring.lua

References

Editor

Terminal & Multiplexer

Debugging

Testing

Git

Database

REST Client

PHP / Laravel

Navigation

Other

--

--