Skip to main content

Just Good Enough Isn't

·1363 words·7 mins
klevermonicker
Author
klevermonicker
Links to Socials for the project!

So look, like a good CLI evangelist I converted to using Neovim several months ago. It works, is fully functional, let’s me code…lets me navigate, let’s me survive with just enough flair to get that “ooh” and “ahh” factor from GUI fans. That’s the problem though. It’s good….in fact it’s… Just Good Enough (JGE).

JGE along with enshittification is the bane of engineering. JGE is what made Microsoft what it is. Just a little pain that you have to get used too and you do and your pain threshold is reset. Until the next release and you have to adjust to some new level of terrible. My config isn’t painful enough to replace, it’s pain I’m used too. Pain I don’t know what I would do without, I wouldn’t say it’s comfortable but it’s familiar

JGE is where improvements die. Just ask IBM.

Findings
#

So I decided to actually look at my config. I know shocking, why look at something that isn’t broken? It’s a new year and I was already updating my tech stack, why not take a look at things that had been chafing at my proverbial knuckles.

Buggy Debugger

I have nvim-dap configured. I have to ready to GO, Python, and Rust. Full setup, custom keybinds, extra configs, everything. Why not? Complete with a typo in the config. The UI auto-open has been broken since I felt clever enough to install it.

I never noticed, why? I never actually used it. It’s there like a vestigial tail, it’s there because of course you should have debugging, not because I needed it, not because I use it.

Configuration Theater.

Deprecation is thy name

nvim-ts-rainbow. Archived, Unmaintained, Beloved, Disabled in my config with enable = false like the ghost of christmas past.

Still in my dependencies. Still downloading on every :Lazy sync.

I disabled it forever ago, never removed it. I’d say it’s a skeleton in my closet, except here it is, hanging out with me like it’s Weekend at Bernies.

Comments from the Past

vim.opt.clipboard:append("unnamedplus") -- Not sure if this cross platform or not

I literally wrote this comment. Not some crazy hacker hell bent on leaving little easter eggs all over my computer instead of adding me to a botnet. It was me, my own worst enemy.

I remember writing it and knowing it was wrong at the time and thinking it was cheeky and I’d have a laugh about it later. I’m not laughing now.

A Crossed-off TODO

My README says I organized all my keymaps into one file. Checked off, complete, dopamine hit received.

What they really are is scattered across 7 files. Fun things like <leader>gf for LSP format is firmly organized into the Trouble plugin. Cause that makes sense.

I lied in my own documentation and it felt good. No PM to hold me to it, No boss all up in my business, just me and some fantastically mid-vibes and an unearned air of superiority.

Closet Javascript

My README: “You all know my thoughts on Javascript.” My Treesitter config: ignore_install = { "javascript" } My LSP config: Biome (JS/TS formatter) fully installed.

It’s a confessional. I occasionally write Typescript. I have to, I do a lot with Obsidian. I hate everything about it. I pretend I don’t…..it’s literally made me think about dropping Obsidian to avoid JS…if it wasn’t so dug into my brain.

Realization
#

I’m a hypocrite. Why do something today I can put off until tomorrow?

I might as well curl a bash script and pipe it to sh. Copy from here, Copy from there, Paste in, Frankenstein it together and beat my chest about being amazeballs.

Problem is, it WORKS. Which in the word of the ineffable Admiral Ackbar - “It’s A TRAP”

Working isn’t the same as good. Working isn’t the same as intentional. Working monstrosity isn’t the same as mine with intention.

The Problem with “Just Good Enough”
#

JGE is insidious rot, it’s just another level of enshittification. It’s fine…we’re so used to using this app in this way for this reason. This is neovim, I don’t have to accept what I don’t like. I don’t have to be GOOD ENOUGH, I can make it pure magic.

It all works. But…is it amazing?

  • I don’t use all these plugins
  • I don’t know why each setting exists
  • Could I explain my config to someone else?
  • Is it customized to my workflow like my keyboards?

JGE means:

  • Never stopping to ask if I should instead of “Can I?”
  • Never removing the cruft of a dead plugin … because it’s not causing me heartburn, why remove it?
  • Never fixing cross-platform issues (because it mostly works on your machine)…I’m probably going to ditch this I’m all in on mac.
  • Never learning snippet keybinds …. typing and not using my tools is totally normal right?
  • Never adding session management - Hey I’m old let’s re-open the files all the time it’s only like 22 seconds and 17.3 keystrokes.

It’s a little death, which is worse than the whole thing breaking. It’s stepping on a lego in the middle of the night, not picking it up and just accepting that this is your life now. It’s container of food in your fridge that you sniff and think “should be good…….for tomorrow”.


Why am I writing about this?
#

Literally everyone is in JGE land.

All of you…every single one of you has at least one of the following:

  • Installed and forgotten plugins
  • Settings we copy/pasta’d cause hey it works - why understand it?
  • Features that looked PHENOMENAL on paper…and they languish unused
  • TODOs we crossed off early
  • Configs that work but aren’t ours

No offense to the Neovim community, you all show off some perfect configs! Dotfile repos with 379 stars, Configs that do everything. Sure imitation is the sincerest form of flattery.

Nobody really takes you on a dive into mastery. Nobody shows off the messy middle. The half-finished migrations, the half baked ideas that died when a new better idea popped in and took up the mental real estate. The keystone plugins, the left-pads of everyone’s configs.

This series is about the ugly, the messy, the pain, the failed attempts. The polish it took to go from nothing to something to something even better to hey I kind know what this is, to…magic.

My promise
#

I’m documenting the journey from terrible to JGE to intentional. If it bothers me, I will fix it or burn it down.

Phase 1: Catalog

Catalog the mess, post it, be brutally honest Hold myself to it. Fix my mistakes, fix my half baked, and fix my copy/paste without understanding

Phase 2: Bug Smashing

Fix the low hanging fruit. You know the obviously stupidly broken stuff.

Phase 3: Burn the debt

Remove nvim-ts-rainbow. Finally accept that JS is unfortunately for EVERYONE here to stay. Organize my keymaps for really reals.

Phase 4: Intention

Look kids, I’m not going to solve YOUR problems. This is my machine, I’m gunna solve mine…unapologetically.

Phase 5: Live it

Learn snippets..or admit I’m a neophyte and just remove them. Use the debugger or admit I don’t code as much as I used too. Session management or manual stuff…pick a lane.

Phase 6: Document everything

Not just a “Here’s my shiny config!” Rather a “here’s why, here’s what I tried, here’s what I fucked up, and here’s what I’ll never touch again.”

The End Goal
#

By the end of this series, I want:

  1. A config I understand - Every reason has a line
  2. A config I use - No orphaned features
  3. A config that’s mine - Customized unapologetically for MY workflow, not generic best practices
  4. A record for other - So when you Google “Neovim config mistakes” You find honest answers.

Join me
#

If you’re rebuilding your config, share it. Tag it, Write about it.

If you found a bug you should have noticed months ago…or you did notice and didn’t do anything about. I want to hear about it.

If your README is aspirational at best. You’re my people.

Let’s escape JGE land together.

Comments? Feedback? Your Own JGE Confessions?
#

Let’s talk about our broken configs. It’s therapeutic.