How to fix automatic indenting when pasting into vim


Overview

When pasting text into a vim editor session, we occasionally run into an issue where line spacing is incorrect due to the autoindent or smartindent feature. When either of these options are set, vim tries to properly indent the lines based on the file type. However, if the original source is already indented, smartindent doubles the indentation.

Details

When the following options are configured in vim (autoindent and smartindent):

:set
--- Options ---
  autoindent          background=dark     helplang=en         modified            scroll=26           smartindent         ttyfast             ttymouse=xterm      window=0
  fileencoding=utf-8
  fileencodings=ucs-bom,utf-8,default,latin1
  iskeyword=@,48-57,_,192-255

Pasting a Python program with existing indentation looks like this:

#!/usr/bin/env python
from scapy.all import *
net_interface = "lo0"
# SNIFF filter
packet_filter = " and ".join([
        "udp dst port 53",
            "udp[10] & 0x80 = 0",
                "src host 127.0.0.1"
                    ])
def dns_reply(packet):
        # Construct the DNS packet
            eth = Ether()
                ip = IP(
                                src=packet[IP].dst,
                                        dst=packet[IP].src
                                                )
                    udp = UDP(
                                    dport=packet[UDP].sport,
                                            sport=packet[UDP].dport
                                                    )
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
-- INSERT                                      29,54         All

To temporarily disable smartindent while pasting text, execute the follow option while in command mode:

:set paste

When the set paste option is enabled, pasting a Python program in vim looks like this:

#!/usr/bin/env python
from scapy.all import *
net_interface = "lo0"
# SNIFF filter
packet_filter = " and ".join([
    "udp dst port 53",
    "udp[10] & 0x80 = 0",
    "src host 127.0.0.1"
    ])
def dns_reply(packet):
    # Construct the DNS packet
    eth = Ether()
    ip = IP(
        src=packet[IP].dst,
        dst=packet[IP].src
        )
    udp = UDP(
        dport=packet[UDP].sport,
        sport=packet[UDP].dport
        )
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~                     
~               
-- INSERT (paste) --                                                                         

To disable set paste, type:

:set nopaste