Inception: Xmonad > Tmux > Vim
Let me tell you the story of my current desktop setup. Xzibit could be proud, because everything is deeply nested.
Level 1 - Xmonad - Key: super
Monitors
Here I am, staring at my 3 physical monitors. They all have different input (laptop, HDMI and VGA) and resolutions, but Xmonad handle them with no issue.
In the Xmonad world the super key is king. It always have the same function and it's never shadowed by any application.
So to move the focus between these 3 monitors, I simply press super+q, super+w and super+e on the top row.
Workspaces
Each monitor is in charge of displaying a workspace. I usually have 10 of them, but only 3 can be shown at any time.
To switch between workspace, I press super+1, super+2 using the numbers row.
For instance, to display the firefox workspace (number 2) on the HDMI output: super+wsuper+2.
X Windows
What's displayed on each workspace? X windows! There can be many of them and they are organized in a layout: in columns, in rows, in accordions…. Here again it's Xmonad responsibility to tile them and make sure they never overlap.
To open a new terminal in the focused workspace super+return. Press again to open another on the side. To navigate between these X windows: super+hjkl.
What's next? Typing tmux
in one of the terminal.
Level 2 - Tmux - Key: ^a
Sessions and clients
By typing the tmux
command, two things happen in the current terminal. A session is created in background by the tmux server and a tmux client is attached to it. In another terminal, you can choose to create a client connected to the same session or to a new one. The beauty is that if 2 clients are connected to the same session, the display is synchronized between them. Which means that you can achieve some kind of mirror mode by displaying a tmux client on 2 different physical monitors.
Tmux windows
Each session can have many tmux windows attached. Their names is displayed in the status bar at the bottom. ^a n and ^a p let you switch to the next or previous window.
Tmux panes
Tmux windows can be split in tmux panes. Each pane displays its own terminal. To move the focus between these panes ^a hjkl is used. Notice that it's a similar approach than to move between X windows. Only the prefix key changes.
Let's type vim
in one this tmux pane…
Level 3 - Vim - Key: space
When vim is loaded, here's what is displayed: 1 tabpage, containing 1 window, in charge of 1 buffer. Wow! And to rule them all, let me introduce you space, vim's leader key remap just under your thumbs.
Tabpages
In vim, a tabpage usually handles 1 (code) project. So you can decide to have many tabpages opened for different projects, but only one is shown at any given time. Many commands starting by :tab
are used to switch between them.
Windows and splits
At the beginning only 1 vim window is displayed. But if you need to display two files side by side, or even the same file but you need to see the beginning and the end simultaneously, you can split the window. Horizontally or vertically. To change the focus between splits? Easy: space hjkl! Same logic.
Extra level - Neovim :term
If you use neovim, a new :term
has been added recently. With this new functionality, you can open a real terminal in a split…. A step too far?
Recap
Ready to dive again?
Physical monitor → Xmonad Workspace → X window → Tmux client → Tmux window → Tmux pane → Vim tabpage → Vim split → Vim window → Vim buffer
Don't get lost. It could have been worse with terminator as terminal emulator.