I have two files opened in vim, each in one tmux pane. I would like to copy let's say 10 lines from one file to another.
How can I accomplish this not using the mouse's Copy
-> Paste
?
You'll have to use tmux shortcuts. Assuming your tmux command shortcut is the default: Ctrl+b, then:
Ctrl+b, [ Enter copy(?) mode.
Move to start/end of text to highlight.
Ctrl+Space
Start highlighting text (on Arch Linux). When I've compiled tmux from source on OSX and other Linux's, just Space on its own usually works. Selected text changes the colours, so you'll know if the command worked.
Move to opposite end of text to copy.
Alt+w Copies selected text into tmux
clipboard.
On Mac, use Esc+w. Try Enter if none of the above work.
Move cursor to opposite tmux pane, or completely different tmux window. Put the cursor where you want to paste the text you just copied.
Ctrl+b, ] Paste copied text from tmux clipboard.
tmux
is quite good at mapping commands to custom keyboard shortcuts.
See Ctrl+b,? for the full list of set keyboard shortcuts.
screen
shortcuts: Ctrl + A [
(enter copy-mode), Space
(start highlighting), Enter
(end highlighting), Ctrl + A ]
(paste).
Enter
key.
Commented
Dec 4, 2017 at 13:04
Unfortunately, I can't add a comment yet to Alex Leach's answer so I'm going to include an addendum here for Mac OS X users:
byobu
/tmux
with all default settings, this worked, Alt + w did not.
Commented
Mar 21, 2016 at 18:16
If you are using vim and tmux on macOS (Tested on macOS 10.12.2, tmux 2.3):
(Assume that prefix key combination of tmux is prefix. The prefix is ctrl + b in defaults.)
space
works, in step 5, pressing return
works.
return
does not work, but I can confirm that ctrl-W
does.
Commented
Oct 13, 2021 at 18:09
I am connecting to my CentOS server on a Windows machine using ZOC terminal ssh client. Here is what works for me:
<prefix>
+[
<Space>
<Enter>
<prefix>
+]
If you have vim
open, its better to use the vim copy paste to copy text.
Tmux copy paste will work, however there are several disadvantages.
First, when copying multiple lines of text, you will have to select multiple lines. Tmux copy paste typically doesnt understand that vim
has line numbers or there are markings in the vim gutter (such as relative numbers/absolute numbers). As a result, it will copy those as well.
Secondly, I have found that if the text has certain language specific formatting, and you directly try to copy paste using tmux to vim, it will mess up the formatting. This can be avoided by using set paste!
. However, this requires a lot more work.
"+y
to copy and "+p
to pasteVim
natively provides a method to copy paste between the vim buffer and the system clipboard, using either "+y
or "*y
. Then pasting using "+p
or "*p
. This will avoide copying the relative numbers in the gutter or other random marks which are not relevant to vim
You could use the system clip board with "*y and "*p instead of the normal y and p.
"+2yy
– copy two lines to X11 clipboard "+dd
– cut line to X11 clipboard "+p
– paste X11 clipboard
h,j,k,l
to move . I have also seen sometimes on my ubuntu VM, the "+" register vanishes, for unknown reason. To verify that you have the +
register, you can type :reg
and check whether there is string "+
in the first column.
Commented
Apr 12, 2018 at 15:05
y
and p
to "+y
and "+p
?
I have chosen to use Ctrl+Alt+C
and Ctrl+Alt+V
to copy and paste within tmux. Tmux's copy-mode-vi
enables navigation within a tmux pane with vim keys hjkl^$...
, rectangle mode is useful to copy table columns or when there are further splits within the pane, activate it with r
.
Here is how I set it up in ~/.tmux.conf
:
bind P paste-buffer
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection
bind-key -T copy-mode-vi r send-keys -X rectangle-toggle
# Also copy to system clipboard
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -sel clip -i'
# map copy mode to ctrl+alt+c
bind-key -n 'C-M-c' copy-mode
# map paste buffer to ctrl+alt+v
bind-key -n 'C-M-v' paste-buffer
I created this setup by modifying this blog post.
This copy-paste solution will also work if the 2 tmux panes (vim instances or anything else) are on different machines (one remote, one local).
A couple of options for vim use since the tmux shortcut sequence is bit long and I find it hard to remember
Like the answers above said you can use "+y
and "*y
to copy and then "+p
and "*p
respectively to paste. If you want vim to use the clipboard by default so you can just use y/p
directly then.
set clipboard=unamed "sets the default copy register to be *
set clipboard=unamedplus "sets the default copy register to be +
source for clipboard command: https://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim
I've had the issue myself and uploaded my .vimrc and .tmux.conf files here: tvp-repl
You can configure tmux to
All you need to set up vim to copy to clipboard [visual mode Ctrl+c]:
set clipboard=unnamedplus
vnoremap <C-c> "+y
Then have tmux command to run copying from vim and pasting the buffer to another pane [Ctrl+b Enter]:
bind-key Enter run "tmux send-keys -t 0 C-c" \;
run "tmux select-pane -t 1" \;
run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer" \;
run "tmux send-keys -t 1 Enter" \;
run "tmux select-pane -t 0"
Notice: a) This script requires xclip to interface with the clipboard. b) Assumption is vim is in pane 0; target pane is pane 1.
:w /tmp/lines
, then:r /tmp/lines
in the other instance). Or, if your Vim knows how to talk to your system clipboard, you could use the+
or*
registers to avoid the temporary file.tmux
's "copy mode" commands and default keyboard shortcuts in the man page for reference.