今天各种实验我的vim,发现一个问题就是我把从vim外的复制粘贴到vim里时,缩进完全无解错乱恶心,好在,强大的网友给出了很完美的答案
参考原贴:解决粘贴到终端 Vim 缩进错乱
以下内容是个人的一些整理
方法一
Via vincent178
当Vim的自动缩进打开的时候,你粘贴到终端Vim的code会出现缩进错乱的情况。当然这个问题只是出现在从其他应用里面复制内容,并且不是用的MacVim或者Gui Vim的时候.
原因是在终端的vim中没有相应的程序来处理这个从其他应用复制粘贴的过程,所以Vim通过插入键盘输入的buffer来模拟这个粘贴的过程,这个时候Vim会以为这是用户输入的。
问题就是出在这:当上一行结束,光标进入下一行时Vim会自动以上一行的的缩进为初始位置。这样就会破坏原始文件的缩进。
好在Vim提供了past和pastetoggle选项,你只要把这一行加入你的vimrc文件。
set pastetoggle=<F2>
还有更高级的
nnoremap <F2> :set invpaste paste?<CR>
imap <F2> <C-O>:set invpaste paste?<CR>
set pastetoggle=<F2>
第一行的作用是在命令模式下,按F2会在状态栏显示paste
第二行的作用是在insert模式下,按F2会在状态栏显示paste
这样可以在状态栏中显示paste,不赖吧。。。
方法二
`autocmd InsertEnter * set local paste`
`autocmd InsertLeave * set local nopaste`
这个的效果呢,就是当你进入 Insert
模式的时候自动开启 paste
,此时你从外面复制粘贴进来的东西就会保持原有队形了。之后你回到 Normal 模式的时候,Vim 会自动关闭paste
。
这个比较适合不喜欢按快捷键的纯粹懒人,不过请小心,一直处于 paste 开启的状态下虽然不影响基本的功能,但是可能会影响其他的插件正常工作哦!
最好的办法还是使用键位映射在你需要粘贴的时候手动开启 paste
,不过可以保留离开时自动 nopaste
的功能,省点事儿,因为有时候你开启 paste
复制完,然后退出 Insert
时忘记了 nopaste
,那么下次再进入 Insert
的时候还是 paste
的。
不过实际使用中最好把 autocmd
的命令用一个自定义的 augroup
包起来,并在最开始用 autocmd!
重置一下,以避免重复修改 .vimrc
造成的 autocmd
重载多次。
具体的作法我放个图:
截图里还给了一个有用的设置,让从 Insert 模式下离开的时候没有延迟,Vim 默认的设置会有点迟钝的感觉。