Posts List
moustapha.dev : My neovim and tmux workflow : writing code fun again blog post cover image

My neovim and tmux workflow : writing code fun again

August 15th 25

TL;DR: If you're feeling too lazy to read this post, get yourself Digestmark and summarize it 😉.

It's been a year or so since I started using neovim as my primary code editor and IDE and it's been an incredible adventure. I naturally got attracted to doing more and more things on the terminal and that lead me to using tmux too. Today, I'm using those two main components plus some other tools that makes writing code fun again. I want to share that with you, starting with what is neovim and tmux and why in the world would you want to use the terminal when you have incredible GUI apps like VScode and the Jetbrains toolset.

A brief history of editors and the terminal

Computing started in a fundamentally different world than the one we know today. In the early days of computing, from the 1960s through the 1980s, there were no graphical interfaces, no mouse cursors dancing across colorful screens, and certainly no drag-and-drop functionality. Everything happened through text-based terminals, green or amber characters glowing on black screens, where every interaction required typing commands. This wasn't a limitation; it was simply how computers worked.

Apple II command line interface

Apple II ProDOS Command-line interface. The catalog command shown lists the files on the current disk.

The transition to graphical user interfaces began in earnest during the 1980s, with systems like the Xerox Star (1981) and later the Apple Lisa (1983) and Macintosh (1984) introducing the mouse and windows paradigm to mainstream computing. Suddenly, computing became visual and intuitive. You could point, click, and manipulate objects on screen. This GUI revolution transformed how we interacted with computers and opened up computing to millions of non-technical users.

Apple Lisa 2 GUI screenshot

Apple Lisa 2 screenshot. One of the first computers using a mouse, with a graphical user interface . Photo Courtesy of David T. Craig.

But here's the thing : the terminal never really went away. While desktop users embraced GUIs, servers, supercomputers, and embedded systems remained firmly rooted in terminal-based interfaces. Why? Because when you're managing a server remotely, when you need to automate tasks across hundreds of machines, or when you're working in resource-constrained environments, the terminal is simply more efficient, scriptable, and reliable than graphical interfaces. Every cloud server, every Docker container, every Linux system running the modern web, they're all fundamentally terminal-based at their core. It was in this terminal-centric world that vi (pronounced "vee-eye") was born in 1976, created by Bill Joy at UC Berkeley. Vi was designed to work over slow network connections and on hardware with severe limitations. It had to be fast, efficient, and work reliably even when you couldn't predict how responsive your connection would be. Vi introduced the concept of modal editing, switching between different modes for inserting text versus navigating and editing, which seemed strange to newcomers but proved incredibly powerful for experienced users. As Unix systems evolved, so did vi. In 1991, Bram Moolenaar created Vim (Vi IMproved), which extended vi with features like syntax highlighting, multiple windows, extensibility through plugins, and compatibility across different operating systems. Vim became the de facto standard for terminal-based editing, beloved by system administrators, programmers, and anyone who spent serious time in the command line. However, by the 2010s, Vim was showing its age. Its codebase had grown organically over decades, making it difficult to add modern features like asynchronous plugins, better Unicode support, or built-in terminal emulation. The architecture that made Vim stable also made it resistant to the kind of fundamental improvements that modern development demanded. Enter Neovim in 2014, a complete refactoring and modernization of Vim that maintained backward compatibility while enabling a new generation of possibilities. Neovim introduced asynchronous plugin architecture (meaning plugins could run in the background without freezing the editor), a built-in terminal emulator, better scripting support through the Lua programming language, and a focus on extensibility that has spawned an entire ecosystem of modern development tools. It kept everything developers loved about Vim while removing the technical debt that held back innovation, creating a foundation for what many consider the future of terminal-based editing.

Why would you use this kind of workflow

There are many reason to use neovim. Personally, I discovered it out of curiosity and started using it to see something else, different from the typical VSCode editor I had for years. If I started with curiosity, it's not what kept me going. I have to say that getting comfortable at using neovim motions, and configuring, customizing the editor has a little bit of learning curve but specifically, this is why I continued using it :

And many more.

There is a lot we can say about neovim and why it's so trendy recently but I think it all boils down to the concept of PDE (Personalized Development Environment). There's a nice video from TJ Devries talking about it.

My workflow and how I get there

My entire neovim, tmux and other tools configuration is openly available at this repository. It's called a dotfiles repository and commonly includes a person's portable configuration. It's not necessarily related to neovim.

I started learning neovim and neovim motions (the different editing shortcuts and modes) with the Tutor, it's just a simple course file that you get from neovim by typing the :Tutor command. It has some exercices to practice and I even get back to read it every once in a while. After that, I started using neovim as a simple text editor, navigating a file, and updating it's content, without any language support. I then installed some neovim distributions (think of distributions as base and opionated configurations to help get started easily without configuring everything from scratch) like Lunarvim , NvChad and Lazyvim. I spend some months using those distros at work as a VSCode replacement, updating and extending the base configuration, adding my own plugins, and updating keymaps etc. After getting comfortable using and configuring neovim, I decided to go from Lunarvim to my own custom configuration, based on kickstart.nvim and it's what I'm still using today, to write this post. kickstart.nvim is a minimal, Neovim configuration designed to serve as a starting point for users to build their own custom Neovim setup. It was created by TJ DeVries, a core Neovim maintainer.

Here is my day to day workflow and the different set of tools I use :

A tmux session

An example of a tmux session with three windows : the frontend and backend opened in neovim and a third window with three panes : two of them for the frontend and backend servers and a third one, to explore the database.

At the time of writing this post, I have about seven sessions opened that I can navigate through with a lot of ease, instantly, enabling me to jump where I need quickly while staying focused on the project I'm currently working on, as each of these sessions and its windows are isolated.

A list of tmux session

A list of separate tmux sessions for working on different projects, taking notes, learning and experimenting new things.

How to get started

There is a lot of places where you can get started with neovim. I think the most straightforward way is to install neovim and a terminal, learn the basic motions and how it works in general, using the Tutor. You can then install a neovim distro to get started easily and start tweaking your editor. If you're using kickstart.nvim, which can be a good starting point as distros base configs can be overwhelming when starting out, you can check my dotfiles for inspiration.

I also recently saw a getting started with neovim course by Lee Robinson, from Vercel, available at vimforreactdevs.com, which can be interesting to check.

If you want to learn more about this workflow, you can also let me know by sending an email or message through one of my social links, and I'll be happy to make a full YouTube video.

What about AI ?

Yes I know, it's a hot topic. But even if I have vibe-coded some projects, I'm among the people that still prefer to write code by hand. I may talk about why in a future post but basically, I had Github Copilot plugin installed in the past, which I ended up disabling. I also tried avante.nvim which provides similar features that tools like Cursor has. If I need some AI assistance, I often prefer to completely switch to Cursor / Claude Code or jut use Claude to explore questions.

Feel free to use whatever you want

The community can be a little bit toxic. We like to joke saying that neovim is a superior code editor and only used by true engineers but that's just a flex. Using VSCode or any GUI can be as productive and enjoyable as using neovim. It's all about personal preferences. The right tool for you is the one that helps you get the work done in a productive and enjoyable way.

But if you give neovim a chance, it can lead you to nice places. So take the leap. Build your PDE.

Thanks for reading.

— Moustapha