94

In Vim, if I paste this script:

#!/bin/sh
VAR=1
while ((VAR <  10))
    do
        echo "VAR1 is now $VAR"
        ((VAR = VAR +2))
    done
    echo "finish"

I get these strange results:

#!/bin/sh
#VAR=1
#while ((VAR <  10))
#       do
#                       echo "VAR1 is now $VAR"
#                                       ((VAR = VAR +2))
#                                               done
#                                                       echo "finish"
#                                                       

Hash signs (#) and tabs have appeared. Why?

  • 31
    This might be a better question for vi.stackexchange.com – Eric Renouf Apr 28 '15 at 18:10
  • @EricRenouf why? (honest question) – Qix Apr 29 '15 at 4:48
  • 3
    @qix my thought was this is a question about how vim works, which is a common tool to be used on *nix, but *nix isn't a requirement for using vim – Eric Renouf Apr 29 '15 at 10:23
  • 1
    @JaredBurrows I sure hope it makes it – Eric Renouf Apr 29 '15 at 10:24
  • 1
    How are you triggering the paste? With the mouse? – Ben Voigt Apr 29 '15 at 16:00
117

There're two reasons:

For pasting in vim while auto-indent is enabled, you must change to paste mode by typing:

:set paste

Then you can change to insert mode and paste your code. After pasting is done, type:

:set nopaste

to turn off paste mode. Since this is a common and frequent action, vim offers toggling paste mode:

set pastetoggle=<F2>

You can change F2 to whatever key you want, and now you can turn pasting on and off easily.


To turn off auto-insert of comments, you can add these lines to your vimrc:

augroup auto_comment
    au!
    au FileType * setlocal formatoptions-=c formatoptions-=r formatoptions-=o
augroup END

vim also provides a pasting register for you to paste text from the system clipboard. You can use "*p or "+p depending on your system. On a system without X11, such as OSX or Windows, you have to use the * register. On an X11 system, like Linux, you can use both.

Further reading

  • 2
    I have been using Vim forever and never knew about this. Many thanks. – Caja Apr 28 '15 at 19:06
  • Most modern graphical terminal emulators support a feature called "bracketed paste mode". Vim can ask the terminal to enable this mode, which, in turn, will surround pasted text with certain escape sequences. Vim can recognize this and turn off wrapping/indenting for the duration of the paste. Long story stort: pasting will "work as expected". I'm not a vim user, but a quick websearch will sure tell you how to configure this mode. – egmont Apr 28 '15 at 19:10
  • 2
    @MichaelDurrant set paste should never be in your vimrc. It disables or resets a lot of things, including insert mode mappings, command line mappings, abbreviations, textwidth, wrapmargin, autoindent, smartindent, softtabstop, formatoptions, indentexpr, and a couple of others. :h paste has the whole list. Most people use some or all of these things and wonder why there settings are ignored. – FDinoff Apr 29 '15 at 3:44
  • 3
    I usually use :r!cat to paste verbatim. – Simon Richter Apr 29 '15 at 13:59
  • 1
    It may be worth discussing the interaction with set mouse, which can automatically enter and leave paste mode when pasting with mouse click. – Ben Voigt Apr 29 '15 at 16:01
35

Use the vim paste. What you want is to paste what is on the clipboard buffer "+p

This selects the + and pastes it in place.

If you're using Linux, * is the X/middle-click buffer (the last selected text).

Then vim knows it's a paste.

Otherwise vim thinks you have typed the keys being pasted and does its own auto-indentation (on top of your copied indentation) all the way to the end of the paste.

As a note for this to work over SSH you need to set the option for your clipboard to be shared -Y

See man ssh for more details.

  • 4
    This is actually the correct answer imho – Kristoffer Sall-Storgaard Apr 29 '15 at 6:56
  • It looks like this only works for the graphical vim (gvim); vim running in a terminal emulator pastes the last deleted text with "*p, not the current selection. – wurtel Apr 29 '15 at 7:18
  • I dont use gvim, only the terminal vim. what is your mouse setting ? my mouse setting is c. Not sure how it works when the mouse selection is allowed. set mouse? – exussum Apr 29 '15 at 7:28
  • 2
    also check vim --version se see if it was compiled with clipboard support +xterm_clipboard should be in the output – exussum Apr 29 '15 at 7:31
  • @wurtel: Maybe you have set clipboard with unnamed string. – cuonglm Apr 29 '15 at 9:10
7

The tabs were inserted because you have autoindent turned on and you can disable that behavior by turning off autoindent (:set noai) before you paste into terminal.

The commented lines are produced by auto commenting and can be disabled by turning that off.

Alternative to those you should get the desired behavior using the toggles :set paste, pasting your formatted code and :set nopaste to restore normal behavior.

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.