Taking the Plunge Into Living in the Terminal

December 30, 2024

Ever since I started working professionally as a developer I’ve used the terminal and was always eager to learn and unlock its full potential. Over time I learned quite a bit of tricks and gradually moved a lot of my development setup to it. Everything felt good, comfortable and efficient; everything except the editor. Using vim or its cousins other than to edit commit messages always felt like a hassle, so I never fully picked it up, until now.

A little backstory would help paint the picture of what I feel is a very familiar scenario for some. I started my development journey using Eclipse, NetBeans and hated them with a passion. They felt clunky and like a very complicated Swiss army knife, when all I wanted to do was hammer a nail. I thought to myself that It should be a very fast and straightforward experience. That’s where Sublime Text 2 came into my life. Wow. I could just open the app and start writing code, and it looked beautiful! This is also the time when I fell in love with the Monokai theme and realized the world of customization that existed.

I paired Sublime with the Terminal app in macOS, and I was running my local development servers and postgres databases out of it with blazing speed and comfort. As I got more comfortable with git I ditched GitHub Desktop and added that to the mix. Before I knew it the only thing I wasn’t running in the terminal was the editor. After a while I started down the rabbit whole of terminal multiplexers and started running tmux as my daily driver.

Other than eventually migrating from Sublime to VSCode my setup remained practically the same until this year, which is the reason I’m writing this.

I’m very picky with my editor, I want to have files and nothing else bothering on the screen. I had configured VSCode to dim most of the bright colors, remapped most hotkeys that triggered functionalities I never used, cleanup the sidebar. I had it pretty barebones and I thought that moving to something like vim wouldn’t be that big of a change since I already was using the vim plugin for VSCode. So when I changed jobs and received a fresh laptop, I finally mustered the courage and ditched VSCode for helix.

I would describe helix as a vim-like editor that has a lot of useful and simple configs and functionalities out of the box. The main difference is that it follows Kakoune’s philosophy of selection ⇒ action instead of vim’s action ⇒ selection. For example, in helix to delete a word you can do wd contrasting that to vim where that is actually dw. If you’re coming from vim already, that would totally change how you code, but starting fresh I’ve gotten used to it, and actually prefer it now.

Something I greatly appreciated was language-servers support. To setup ruby with auto-formatting and the ruby-lsp I just had to add this to the languages.toml file. No Lua or any programming required.

[[language]]
name = "ruby"
formatter = { command = "rubocop", args = ["--stdin", "foo.rb", "-A", "--stderr", "--fail-level", "fatal", "--server"] }
language-servers = ["ruby-lsp"]
auto-format = true

On top of helix I changed from tmux to zellij. This change was prompted mainly because of how cryptic I always felt the tmux configuration was and the amazing feature of floating panes which paired wonderfully with having helix as my editor. It also comes with a tmux mode, so I didn’t have to train my muscle memory and could keep my old tmux keybindings (I use ctrl+a as my prefix).

I never liked the integrated terminal being pinned at the bottom in every editor I used, so having it be in the middle and to be able to move it around and resize it, is an amazing improvement.

Lastly but not less important, I finally moved on from Monokai to Rosè Pine and was able to set it up both for helix and zellij, achieving a really homogeneous look.

Example of helix paired with zellij

Although I’m very happy with the final result, both in functionality and looks there’s some shortcomings, mainly from helix. It currently doesn’t support any type of file tree, nor global search and replace, so I’ve had to adapt those flows using other amazing tools such as yazi and serpl.

If you like the setup, stay tuned as I’m currently working on a more detailed write up on my config and how to achieve a full IDE experience with helix and zellij.