Simple | Small | Stable | Secure

i3 with tmux and vim

Someone ask on /r/vim: What are a sane set of key bindings between i3wm? It's good question, because all of the programs is keyboard friendly, less-mouse, navigation.

Before we look into my keybindings, you must understand why or how I use those three programs.

The key here is to trying,

  • not to customize as many as keybindings, so your brain can work in other non customized environment seamlessly.

  • not to use split pane on tmux, or split edit on vim. Use new window or new tab instead.


The meaning of workspaces in i3 is a group of application/projects/windows. For example, my i3 workspace names are,

  • net: for email and browser

  • devops: for devops related tasks

  • remote: for list of terminal that open SSH connection

  • backend: for list of terminal that open backend project

  • media: for watching movie, Spotify window

  • and so on.

So the only keybindings I need are switching between workspaces and moving windows between workspaces,

  • Ctrl+alt+left to move the the left workspace,

  • Ctrl+alt+right to move to the right workspaces,

  • Win+x , where x is number between 1-0, to quickly jump into workspaces;

  • Win+Shift+x, to move window into workspace number x (0-9)

A sample of keybindings config in i3,

bindsym $mod+1 workspace $WS1
bindsym $mod+2 workspace $WS2

bindsym Mod1+Control+Left workspace prev
bindsym Mod1+Control+Right workspace next

## move focused container to workspace
bindsym $mod+Shift+1 move container to workspace $WS1
bindsym $mod+Shift+2 move container to workspace $WS2


A single i3 workspace contains many programs (terminal, browser, etc). Each terminal must run with tmux.

For example, in the backend workspaces I have tmux session. The session name is equal with project name or remote name. Let say repo-x. Inside this session I usually open three or four tmux's shell (or window): one shell to edit, one shell to compile and running test, and other shell for everything else.

To create a new shell, I use standard tmux keybindings: Ctrl+b+c.

To move between shell, I use

  • Ctrl+pgup to switch to the right shell, and

  • Ctrl+pgdown to switch to the right shell.

A sample of keybindings in tmux config would be,

bind -n C-PPage        prev
bind -n C-NPage        next
bind -n S-PPage swap-window -t -1
bind -n S-NPage swap-window -t +1

I have list of predefined session name that I can open using rofi. If session is not exist it will create one, otherwise it will attach into it (similar with tmux new -As name).


I use vim with many tabs open. Each contains one buffer. To move to previous or next tab my keybindings are alt+[ and alt+]. Others keybindings are default.

A sample of keybindings in nvim config,

"" Shortcut to move tab to left / right.
map   :tabprevious
map!  :tabprevious

map   :tabnext
map!  :tabnext

"" ALT + {: move tab to the left
map   :tabmove -1
map!  :tabmove -1

"" ALT + page-down: move tab to the right
map   :tabmove +1
map!  :tabmove +1

Before someone complain that I use tabs wrong, I will said that you are using buffer wrong. Buffer is internal vim objects, user should not interact with it directly - listing buffer, displaying as tab, etc.