Neomux, or why you don't need tmux
As a long-time vim user, one of the things I’ve always been background level jealous of is the claim, sometimes made by our long-lost emacs brethren, that emacs is an operating system and vim is just a text editor. There’s some truth to that, until recently vim was much less extensible than emacs. Neovim’s arrival on the scene has changed things however.
Neovim added a bunch of new and useful features to vim, but one that’s been a bit under-rated is the terminal emulator. This lets you run a shell directly inside a vim window, which is something that I never knew I always wanted.
Unfortunately, using nvim as a tmux replacement doesn’t work very well in the
default configuration. The default keybinding (
<C-\><C-n>) to exit terminal
mode is clunky, and worse, the shell isn’t well integrated with neovim, so most
people end up going back to tmux.
Neomux aims to fix that. It does so by setting up some (imo) sane keymaps and default behavior, and more interestingly, by setting up some helper functions to make neovim and the terminal play together nicely. The key idea behind neomux is that it should be easy to manipulate your vim files and buffers from the shell, and vice versa. This plugin is mostly a wrapper around the excellent neovim-remote, and allows you to do cool things like pipe a command into a vim window.
All Neomux terminals come pre-loaded with some handy new shell scripts.
Opening files in new windows:
vs, and (kind of)
The simplest of the new neomux shell commands are
tab, and are straightforward to use.
If you have a neomux shell open and wanted to open a file you were looking at in a new window, you would simply do:
vs <some-file>, and
t <some-file> would open
a vertical split, or a new tab, respectively.
Working with windows by window-number:
One of the most commonly used neomux commands is
vw (vim-window), it allows
you to open a file in an already open window.
For example if you have 3 windows open in your current nvim session/tab and you
wanted to open a file named
my-file.txt in the 2nd window you’d do:
vw 2 my-file.txt
You can also use pass
- as the filename to stream the contents of
into a vim-window, which when combined with the shell’s
| characters makes
for some interesting possibilities.
vwp (vim-window-print) command does the reverse of the
vw command. It
takes the contents of any vim window and streams it out to standard out. When
you combine this with your shell’s process substition
functionality, you can do some interesting things such as interactively working
on a bash script without having to first write it to a file. Check out vid above
for more details
Copying/yanking and pasting text to and from neomux
Neomux comes with two helpers for working with vim’s registers to copy and paste
vp, which stand for vim-copy and vim-paste respectively.
With these, you can manipulate the contents of vim’s yank ring and registers from the command line. If you’re not familiar with vim’s register system, I recommend first checking out vim’s documentation on the topic and/or this tutorial.
vp, work on the default register (
@") if no register is
specified. To work with a specific register just pass it as the first cmd-line
param. For example, to work with register
@a), you would use
vw a, and
To put data in a register pipe it in via stdin:
$ echo "This is what's in register a." | vc a
And get it out with
$ vp a
This is what's in register a.
All vim register semantics are preserved, so you can append to the contents of a register by capitalizing the register name:
$ echo " Appended to register a." | vc A
$ vp a
This is what's in register a. Appended to register a.
Special registers such as
+ work just like any other register, so
you could even use these as a replacement for
xsel by using
$ echo "hi from the system clipboard" | pbcopy # replace pbcopy with xsel --clipboard --input on linux
$ vp +
hi from the system clipboard