Lately I have been using a lot of Claude at work. Like a lot a lot. I have been working with 9 different projects in parallel. Each of them having its own Claude session. Different tech stacks across the 9 projects and unique implementations for each. The context switching between those projects has been challenging. I am so glad, however, that I have not been leaving my terminal during most of that time. That is one thing that has helped me during the past couple of months - not switching my visual context. In my opinion, embracing the terminal completely is the only way to reduce the friction that I have control over.
Switching between windows on a desktop is generally not a big issue. Not unless you have to do that hundreds of times every hour. Then it becomes very visible and very exhausting in the long run. And unless you are using a window manager or have your own approach to effectively organizing your layout, it becomes difficult to manage multiple windows to the point when looking for a particular one becomes a task on its own.
On top of that if you throw a multi-project work in parallel, going through the motions of that work becomes draining. Making one change across all of those active windows or tabs becomes challenging not only because it is a mundane repetitive action, but also because keeping track of what was updated and what wasn’t is a separate concern that you have to keep in mind.
To reduce context switching we have to find a way to put all of that context together and make operating it easy and convenient. I already mentioned using Claude, which lives in the terminal. What are the other tasks that I constantly switch to: running code and other tools and writing and reading code. Good news is that both should be available in the terminal.
Taking this a little further, I also believe that using more physical motions is what contributes to context switching fatigue. In this case that would be using a mouse or a trackpad: finding a cursor that blends in with the background text, and then, navigating the GUI to get to where we need to be. If I can eliminate that, it would help me focus better on tasks that matter.
To unify the experience in the terminal you would need the following tools: Neovim, Tmux, and the aforementioned Claude. Neovim brings the greatest experience working with code into your terminal, and Tmux helps you organize your work across many projects, keep terminal history separate, and customize your terminal layout. My terminal of choice today is Ghostty.
Neovim# #
Neovim is an amazing tool to use and I enjoy learning it every day. I am by far not an expert in it, but I have seen enough value in it, which made me want to commit to learning it and figuring it out. And let me tell you that it took me three separate occasions over a two year period to finally stick with Neovim. First two tries ended up in frustration and abandonment. Why? Because all of the freedom that it offers, all of the flexible customization, amazing shortcuts to cut down time on operations - all of that creates a steep learning curve. And while it might be hard in the beginning, I believe that it is worth it.
Vim Motions#
One of the hardest things to learn in Neovim is Vim motions. Neovim is the next iteration of Vim - its predecessor that is still being shipped with most Linux-based operating systems. That is where Vim motions come from. Vim motions are commands that you type that allow you to navigate the text in a precise and effective manner. They allow you to move/edit/delete not just characters, but words or paragraphs at a time. Neovim has three modes of operating: normal, insert, and visual. In normal mode you navigate text. In insert mode you type text. And in visual mode you select text.
In normal mode, we begin by using h/j/k/l to move left/down/up/right. Moving forward a word is w, and moving backward a word is b. General syntax for Vim motions could be described like this: [count]<operator>[count]<motion>. For example, a command d3w would delete three words from where the cursor currently sits. c3w would remove those same three words, but would put you into an insert mode. f<char> would find the next occurence of that character on the line where your cursor sits. Then you can also use entire text objects in your operations. You can delete an entire paragraph using dap or delete an entire sentence with das. You can traverse the text in paragraphs using { and } or move all the way to the top with gg or all the way to the bottom using G.
I did not even begin to scratch the surface of what is possible with Vim motions. They are worth learning. Spending time getting familiar and adept at using them would be of great benefit to any developer.
One of the best resources that I have used to learn Vim motions has been Moving Blazingly Fast with the Core Vim Motions by Barbarian Meets Coding. It is pretty much the top result in Google when you search “vim motions”, and it is that good. Another great resource that I would recommend that is available inside Neovim is Neovim Tutor, which could be accessed by typing :Tutor and hitting Enter.
Neovim Configuration#
Neovim allows you to customize your experience and look of your editor to the tiniest detail. Learning the configuration can take a while. That was one of the things that made me give up several times in the past - I was overwhelmed with how many options were available and did not know where to get started. What helped me was using a pre-built configuration that comes preset with defaults. I initially tried LazyVim, but did not stick with it, because that distribution felt a little too manufactured for me, and I could not call it my own.
One pre-built configuration that has helped me, which I am using to this day, is kickstart.nvim. It comes with a very well documented Neovim configuration file init.lua - which has all you need to get started with making Neovim your own. Here is a link to my configuration of kickstart.nvim.
There is a vast sea of configuration options to explore and a universe of community plugins to delve into. It helps to get started with sensible defaults and a helpful documented config.
Neovim Plugins#
Once you get acclimated to Neovim’s config, there are a lot of great plugins you can install to help improve the experience. Since I have been using kickstart.nvim, most of my favorite plugins come packaged in the config by default:
lewis6991/gitsigns.nvim: Adds git sign column indicators (added, modified, deleted lines) and utility mappings for git hunks.folke/which-key.nvim: Displays a popup window showing available keybindings corresponding to your current prefix (Spacebarin my case).nvim-telescope/telescope.nvim: The core fuzzy finder used for searching files, text (live grep), help tags, and more.
There is a large library of community plugins that are available for anyone to install. Furthermore, nothing would ever stop anyone from writing their own plugins. This makes Neovim into an extremely flexible editor that can accomodate anyone’s needs.
Boost your code reading and writing with Neovim#
With Neovim I can seamlessly browse and update my code. I can make it look and feel exactly how I would like it to be. Once I got more comfortable with the keybindings, that is where the payoff started to feel more real. I no longer was spending time looking up combinations, but rather navigating my codebase faster than before, with less noise of modern day IDEs while staying in the same terminal where I can execute commands and use my AI agents.
Tmux# #
Tmux is a terminal multiplexer - a program that runs a server which allows you to run multiple instances of terminal inside one terminal. These instances could be arranged as different windows, panes, which in turn are grouped together in sessions. One of the prominent features of tmux is its ability to keep running in the detached mode, i.e. if you accidentally close the terminal that is running tmux, those windows and sessions would be preserved, and all you need to do to get back to that workspaces is to reattach to tmux’s server.
Tmux is operated using keyboard shortcuts. Once tmux is launched using tmux, it sits and waits for a “prefix” shortcut, which is defined in the configuration file. The default prefix that tmux uses is Ctrl+b. In my configuration I remapped it to a popular Ctrl+a which is easier to use.
Session per Project#
Tmux helps me keep different projects in different sessions. When you initialize a new session in tmux using tmux new -s NewSessionName, you get a blank slate where you can add new windows and organize your layout however you like. Once I need to work in a different workspace like a different repository, I can quickly create a new session, which I will use solely for that project. Switching between the sessions is very easy and quick - Prefix+w opens up a session management window - helping me a lot especially when I work on many projects at the same time.
Window per Tool#
Tmux enables me to organize my workspace the way I want it - separate window for each tool. While it is totally possible to have a multi-pane layout with several horizontal and vertical splits, I generally prefer to keep one window per tool use, since that gives me the most display real estate to work with. I can create a new window using Prefix+c. I have set up the keybindings to use Shift+<left_arrow> and Shift+<right_arrow> for switching into adjacent windows that appear as tabs. Such quick navigation helps me switching between my Neovim instance, my Claude, and my dedicated shells.
### Reduce your context switching with dedicated windows and sessions in Tmux[#](#reduce-your-context-switching-with-dedicated-windows-and-sessions-in-tmux)
Using tmux helps me keep my workspaces separate, yet accessible within several keystrokes. All of this is acheived within one terminal instance (which usually runs in fullscreen for less distractions), which elimiantes the need to navigate multiple windows between IDEs, dev tooling, and multiple terminals.
## Ghostty[#](#ghostty)
Lastly, I have been using Ghostty for the last year or so, and I have been pleased with it. Before that I used to use iTerm2. Ghostty outpaces iTerm2 in speed and uses less memory. Paired with Neovim, Claude, and tmux, Ghostty helps me do my work fast and without hiccups.
Aside from the main point that I have been driving in this article - staying in one terminal - there are a couple of other large benefits to switching your dev stack to Neovim and Tmux. One of them is the access to the raw configuration of both tools. Neovim and Tmux allow and encourage you to explore, understand, and update the configuration to your liking. Both of these tools have plugins and extensions that could be installed. You can develop your own plugins and customizations for both of them. Paired with an AI agent like Claude you should be able to make anything happen. I have personally used Claude to troubleshoot both my tmux and nvim configurations several times when I either pulled down the latest version of kickstart.nvim and it contained breaking changes, or when I added a configuration option that got deprecated. Spinning up a Claude instance in your config directory and asking it to add certain features to your Neovim or tmux will make your configuration management, updates, and upgrades super easy and fast. Furthermore, experimentation in this field could lead you to creating some really useful plugins for yourself as well as for the broader community.
Another important aspect that unites Neovim, Tmux, and Claude is the ability to use Vim motions. As mentioned above, Vim motions offer you a very effective way to work with text: editing, traversing, and searching. All of these tools have an option to enable Vim mode. You can enable Vim in Claude’s configuration under “Editor Mode” option. Once enabled, you should be able to navigate prompt input box using vim commands and utilize different vim modes: normal, insert, and visual. In Tmux, you can enable Vim mode in tmux configuration using the following line: set-window-option -g mode-keys vi. This will allow you to use it in the “Copy Mode”, i.e. when you are searching through terminal’s output history. And you should be able to search terminal standard output using / or jump from paragraph to paragraph using { and }.
There is so much more that can be said about how Vim mode unifies the experience of using all of those tools. I hope I painted enough of a picture to make you curious about it. In addition to that, once you are familiar with Vim motions, you should check if other tools that you use on a day-to-day basis might have that as an option. For instance, there is a way to use Vim motions in Microsoft Word, Google Chrome, and pretty much most of the IDEs.
Putting all of your tools in one terminal allows you to use vim motions across all of those tools, use keyboard shortcuts to maximize the speed and give you the most control, customize all of your tools to your desired look and feel, and have a unified UI/UX which greatly reduces context switching fatigue and makes the process more fulfilling and gratifying. In a time when we are faced with working with an ever increasing amount of parallel projects, having a streamlined and standardized approach to your work could not only save you time, but also your overall mental workload.