Texts distorted after pasting on vim

I want to paste a series of lines from a web page or a vim window into another vim window. I used a mouse to copy and paste the original:

// Calculate the sum // sum = 0; while (len > 1) { sum += *buf++; if (sum & 0x80000000) sum = (sum & 0xFFFF) + (sum >> 16); len -= 2; } if ( len & 1 ) // Add the padding if the packet lenght is odd // sum += *((uint8_t *)buf); 

after pasting them into another vim, these lines become:

  // Calculate the sum // // sum = 0; // while (len > 1) // { // sum += *buf++; // if (sum & 0x80000000) // sum = (sum & 0xFFFF) + (sum >> 16); // len -= 2; // } // // if ( len & 1 ) // // Add the padding if the packet lenght is odd // // sum += *((uint8_t *)buf); // // // Add the pseudo-header 

Why is this happening? and how to make the insert as expected? thanks!

+6
source share
3 answers

ok, I am adding one answer.

consider set paste before paste (especially for indented codes). note that the paste option may have "side effects". read the help for this.

Better set the paste back to false after pasting. it would be convenient to display the key for the en / disable paste parameter if you paste a lot. :)

+7
source

For you, this makes automatic indentation or intellectual indentation. Do this before inserting:

 : set noai : set nosi 

And then insert. he should insert ok. When you are done pasting, follow these steps:

 :set ai :set si 

ai abbreviated for autoindent .

si abbreviated for smartindent .


Following Kent's comment on the question, you can also do this with :set paste . Here is an explanation of why from official help:

  *'paste'* *'nopaste'* 'paste' boolean (default off) global {not in Vi} Put Vim in Paste mode. This is useful if you want to cut or copy some text from one window and paste it in Vim. This will avoid unexpected effects. Setting this option is useful when using Vim in a terminal, where Vim cannot distinguish between typed text and pasted text. In the GUI, Vim knows about pasting and will mostly do the right thing without 'paste' being set. The same is true for a terminal where Vim handles the mouse clicks itself. This option is reset when starting the GUI. Thus if you set it in your .vimrc it will work in a terminal, but not in the GUI. Setting 'paste' in the GUI has side effects: eg, the Paste toolbar button will no longer work in Insert mode, because it uses a mapping. When the 'paste' option is switched on (also when it was already on): - mapping in Insert mode and Command-line mode is disabled - abbreviations are disabled - 'textwidth' is set to 0 - 'wrapmargin' is set to 0 - 'autoindent' is reset - 'smartindent' is reset - 'softtabstop' is set to 0 - 'revins' is reset - 'ruler' is reset - 'showmatch' is reset - 'formatoptions' is used like it is empty These options keep their value, but their effect is disabled: - 'lisp' - 'indentexpr' - 'cindent' NOTE: When you start editing another file while the 'paste' option is on, settings from the modelines or autocommands may change the settings again, causing trouble when pasting text. You might want to set the 'paste' option again. When the 'paste' option is reset the mentioned options are restored to the value before the moment 'paste' was switched from off to on. Resetting 'paste' before ever setting it does not have any effect. Since mapping doesn't work while 'paste' is active, you need to use the 'pastetoggle' option to toggle the 'paste' option with some key. 
+2
source

You have either autoindent or smartindent . To disable them, use

 :set noai :set nosi 

Delete none to enable them again.

+1
source

All Articles