当 Vim 的自动缩进打开的时候,你粘贴到终端 Vim 的 code 会出现缩进错乱的情况。当然这个问题只是出现在从其他应用里面复制内容,并且不是用的 MacVim 或者 Gui Vim 的时候。
原因是在终端的 vim 中没有相应的程序来处理这个从其他应用复制粘贴的过程,所以 Vim 通过插入键盘输入的 buffer 来模拟这个粘贴的过程,这个时候 Vim 会以为这是用户输入的。
问题就是出在这:当上一行结束,光标进入下一行时 Vim 会自动以上一行的的缩进为初始位置。这样就会破坏原始文件的缩进。
好在 Vim 提供了 past 和 pastetoggle 选项,你只要把这一行加入你的 vimrc 文件。
set pastetoggle=
还有更高级的
nnoremap :set invpaste paste? imap :set invpaste paste? set pastetoggle=
这样可以在状态栏中显示 paste,不赖吧。。。

最后广告时间:我的 vimrc 文件 https://github.com/vincent178/dotfiles/blob/master/vim/.vimrc
谢谢@Rei 的 writings.io,很好用。这篇 blog 就是在上面写的。 http://vincent178.writings.io/articles/9
我来锦上添花好了,放个给极度懒人用的大招:
autocmd InsertEnter * setlocal paste
autocmd InsertLeave * setlocal nopaste
这个的效果呢,就是当你进入 Insert 模式的时候自动开启 paste,此时你从外面复制粘贴进来的东西就会保持原有队形了。之后你回到 Normal 模式的时候,Vim 会自动关闭 paste。
这个比较适合不喜欢按快捷键的纯粹懒人,不过请小心,一直处于 paste 开启的状态下虽然不影响基本的功能,但是可能会影响其他的插件正常工作哦!
最好的办法还是使用键位映射在你需要粘贴的时候手动开启 paste,不过可以保留离开时自动 nopaste 的功能,省点事儿,因为有时候你开启 paste 复制完,然后退出 Insert 时忘记了 nopaste,那么下次再进入 Insert 的时候还是 paste 的。
不过实际使用中最好把 autocmd 的命令用一个自定义的 augroup 包起来,并在最开始用 autocmd! 重置一下,以避免重复修改 .vimrc 造成的 autocmd 重载多次。
具体的作法我放个图:

截图里还给了一个有用的设置,让从 Insert 模式下离开的时候没有延迟,Vim 默认的设置会有点迟钝的感觉。
楼主,可不可以解释一下这两行的作用
nnoremap <F2> :set invpaste paste?<CR>
imap <F2> <C-O>:set invpaste paste?<CR>
#24 楼 @JohnLu 第一行的作用是在命令模式下,按 F2 会在状态栏显示 paste 第二行的作用是在 insert 模式下,按 F2 会在状态栏显示 paste
http://vimdoc.sourceforge.net/htmldoc/options.html :se[t] inv{option} Toggle option: Invert value. {not in Vi}
#29 楼 @simlegate 如果你使用 terminal 中的 vim,可以加这一句到配置文件
" Use System Clipboard
if $TMUX == ''
set clipboard+=unnamed
endif
@Vincent178 问个弱弱的问题。。假如我复制的时候。源文件都是 tab 空格的。但是复制到另外的文件中的时候为啥变成 space 空格了。。有没有好的办法解决啊。。复制到另外的文件的时候还是 tab 空格。。
@Vincent178 别见笑。所有的配置。。感觉跟你们比弱爆了。。 filetype plugin on syntax enable syntax on colorscheme desert nnoremap :set invpaste paste? imap :set invpaste paste? set pastetoggle= set autoindent set noexpandtab set tabstop=4 set shiftwidth=4
vim7.4 发布了,升级一下吧。看一下你编辑后的版本 (vim --version),如果包含+clipboard(其它都请当作背景):
+clipboard +iconv +path_extra -toolbar
+cmdline_compl +insert_expand -perl +user_commands
然后在.vimrc 里设置
set clipboard=unnamed
就可以正常写入读取 cliboard 了。