6

I use Vim and Bash side-by-side in Tmux. I have Vim configured to autosave files as I switch between them, but I'd really like it to autosave when I switch to the Bash pane.

Is there a way to get Tmux to send some kind of code to Vim when its pane loses focus?

2 Answers 2

6

This is probably best done using vim's client-server model. There's some good guidance about using it in :help remote.txt.

Firstly, you'll need a vim client compiled with the +clientserver option. If your distribution doesn't package it this way, get the source (through apt-get source, abs, et al) and add that option.

Once that's done, you'll need to rebind your keys in tmux so that when you change windows it also sends something like the following to the active window:

vim --servername foo --remote-send '<C-\><C-N>:w<CR>'  

Something like the following should work (not tested):

bind-key 0 run-shell "vim --servername foo --remote-send '<C-\><C-N>:w<CR>'" \; select-window -t :0
1
  • 1
    That's a good direction, but there are too many ways to switch panes. I might select-pane, last-pane, swap-pane, or even click a pane. There are just as many ways to switch to a different window. I can't rebind every possible way to activate a different pane. I'm looking, then, for a way to get commands to run every time I activate a pane. Perhaps that's not possible in tmux.
    – Peeja
    Mar 3, 2012 at 18:42
2

Someone else has already done this work for you in a vim plugin - https://github.com/sjl/vitality.vim

From the README:

(Vit)ality is a plugin that makes (V)im play nicely with (i)Term 2 and (t)mux.

If you're using vim and tmux together you might also be interested in the vimux plugin.

By default when you call RunVimTmuxCommand vimux will create a 20% tall horizontal pane under your current tmux pane and execute a command in it without losing focus of vim. Once that pane exists whenever you call RunVimTmuxCommand again the command will be executed in that pane.

Think re-running tests frequently.

3
  • 1
    Actually, that's not what Vitality does. Vitality maps iTerm's focus lost/gained codes—which trigger when you change GUI windows—into Vim's FocusLost/Gained events, but it doesn't notice if you change tmux windows.
    – Peeja
    Apr 19, 2012 at 12:47
  • @Peeja: ah, ok. I misread it, thanks for the clarification. Apr 20, 2012 at 7:31
  • vitality.vim now does this with a fork of tmux: github.com/sjl/vitality.vim/issues/2 github.com/aaronjensen/tmux Feb 19, 2013 at 4:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.