124

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 ?

  • 1
    You could involve tmux, but there are generally simpler ways. Are both the Vim instances on the same (local?) machine? Usually, I would just use a temporary file for that (i.e. visually select the lines, :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. – Chris Johnsen Dec 19 '12 at 5:39
179

You'll have to use tmux shortcuts. Assuming your tmux command shortcut is the default: Ctrl+b, then:

  1. Ctrl+b, [ Enter copy(?) mode.

  2. Move to start/end of text to highlight.

  3. Ctrlspace

    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.

  4. Move to opposite end of text to copy.

  5. Alt+w Copies selected text into tmux clipboard. (On Mac use Esc+w.)

  6. Move cursor to opposite tmux pane, or completely different tmux window. Put the cursor where you want to paste the text you just copied.

  7. 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.

  • 4
    Thanks. Just a sidenode: The Alt + w did not work on Mac. Alt was mapped to Esc by default. Hence it is Esc+w. – Karan Mar 22 '16 at 7:58
  • 11
    if you use screen shortcuts: Ctrl + A [ (enter copy-mode), Space (start highlighting), Enter (end highlighting), Ctrl + A ] (paste). – jfs Aug 2 '16 at 9:58
  • 9
    Worth noting that "enter" works for me whereas alt+w does not. – Elijah Lynn Nov 29 '17 at 1:02
  • 3
    As noted in awhan.wordpress.com/2010/06/20/copy-paste-in-tmux, if you have vi key bindings, step 5 should be replaced with Enter key. – Ying Xiong Dec 4 '17 at 13:04
  • 2
    what If I need to copy and paste to a text editor? For some reason it doesn't seem to pick up that selected text even after pressing 'enter' after selecting the text. – uday Dec 5 '17 at 20:38
32

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:

  1. Enter Copies the selected text
  • 1
    thanks! I am on Ubuntu Xenial, using byobu/tmux with all default settings, this worked, Alt + w did not. – Andrea Zonca Mar 21 '16 at 18:16
  • This doesn't work on OS X Yosemite with tmux 2.0, nor does alt+w, nor does esc+w :( – weberc2 Apr 6 '16 at 15:59
  • Works for me too on Windows using a Zoc terminal. – jdhao Oct 22 '18 at 9:24
14

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.)

  • Copy:
    1. Press prefix + [ to enter copy mode.
    2. Use arrow keys to go to the start/end of text selection.
    3. Press ctrl + space (If you have set ctrl + space as prefix, Press ctrl + space + space instead)
    4. Use arrow keys to move to the other side of selection.
    5. Press ctrl + w.
  • Paste:
    1. Press prefix + ] in insert mode.
6

I am connecting to my CentOS server on a Windows machine using ZOC terminal ssh client. Here is what works for me:

  • Enter copy mode: <prefix>+[
  • Start copy: <Space>
  • Copy text: <Enter>
  • Paste text: <prefix>+]
1

You could use the system clip board with "*y and "*p instead of the normal y and p.

  • 1
    To use system clipboard you have to use "+2yy – copy two lines to X11 clipboard "+dd – cut line to X11 clipboard "+p – paste X11 clipboard – Patryk Jan 9 '13 at 12:59
  • Do I need to type anything before using these commands? – Thomas Ahle Mar 9 '18 at 12:46
  • @ThomasAhle, no.. its literally the double quotes ("), followed by plus (+) followed by 2ys (y). Make sure you are in normal mode. If you are in normal mode, you should be able to use 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. – alpha_989 Apr 12 '18 at 15:05
1

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.

Use "+y to copy and "+p to paste

Vim 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

0

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

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.