当 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 了。