Vim做为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情。每当学会了vim的一个新功能,就会很大地提升工做效率。有人使用vim几十年,尚未彻底掌握vim的功能,这也说明了vim的强大。而这样未尝不是一件好事呢,只要有的学习,就有的提升。vim
最近使用Vim来写博客,发如今Vim中粘贴Python代码后,缩进就全乱了。仔细研究了如下,原来是自动缩进的缘故,因而作以下设置: 编辑器
:set noai nosi
取消了自动缩进和智能缩进,这样粘贴就不会错行了。但在有的vim中不行,仍是排版错乱。学习
后来发现了更好用的设置:spa
:set paste
进入paste模式之后,能够在插入模式下粘贴内容,不会有任何变形。这个真是灰常好用,不由自主看了一下帮助,发现它作了这么多事:orm
下面的选项值不变,但却被禁用:blog
怪不得以前只设置noai和nosi不行,原来与这么多因素有关!ip
但这样仍是比较麻烦的,每次要粘贴的话,先set paste,而后粘贴,而后再set nopaste。有没有更方便的呢?你可能想到了,使用键盘映射呀,对。咱们能够这样设置::ci
:map <F10> :set paste<CR> :map <F11> :set nopaste<CR>
这样在粘贴前按F10键启动paste模式,粘贴后按F11取消paste模式便可。其实,paste有一个切换paste开关的选项,这就是pastetoggle。经过它能够绑定快捷键来激活/取消 paste模式。好比::文档
:set pastetoggle=<F11>
这样减小了一个快捷键的占用,使用起来也更方便一些。terminal
但,这是最方便的吗?Vimer们对高效的追求永无止境。还有其余更好地方法吗?
你可能想到了,vim寄存器。对,使用vim寄存器 “+p 粘贴便可。根本不用考虑是否自动缩进,是否paste模式,直接原文传递!:
"+p
要说vim寄存器,就要从vim文件间的复制粘贴提及。
Vim中,若要复制当前行,普通模式下按 yy 便可,在要粘贴的地方按 p 。这是vim将复制内容保存到了本身的寄存器中的缘故。若是在其余地方执行yy,新的内容将覆盖掉原寄存器中内容。若是想保存原寄存器中内容而同时增长新的内容呢?这时就要在yy前增长标签了。标签以双引号开始,跟着的是标签名称,能够是数字0-9,也能够是26个字母,而后就是复制操做,这样就把复制内容保存到该标签寄存器里。经过下面命令显示全部寄存器内容::
:reg
其中注意两个特殊的寄存器:”* 和 “+。这两个寄存器是和系统相通的,前者关联系统选择缓冲区,后者关联系统剪切板。经过它们能够和其余程序进行数据交换。
若寄存器列表里无”* 或 “+ 寄存器,则多是因为没有安装vim的图形界面所致。Debian/Ubuntu下能够经过安装vim-gnome解决。
$ sudo apt-get install vim-gnome
选择缓冲区和系统剪切板啥子区别?让咱们继续研究。
不一样于Windows,Linux系统里存在两个剪切板:一个叫作选择缓冲区(X11 selection buffer),另外一个才是剪切板(clipboard)。
选择缓冲区是实时的,当使用鼠标或键盘选择内容时,内容已经存在于选择缓冲区了,这或许就是选择缓冲区的由来吧。
使用下面的命令查看选择缓冲区的内容::
$ xclip -out
若是没有xclip命令,Debian/Ubuntu下能够经过以下命令安装::
$ sudo apt-get install xclip
可使用鼠标中键或键入Shift+Insert来粘贴选择缓冲区的内容。但对于有些GUI程序,好比gedit,只能经过鼠标中键调用选择缓冲区的内容,使用Shift+Insert的话,调用的是剪切板的内容。
剪切板和Windows的剪切板相似,在选择文字内容后,执行Ctrl + c或在菜单里选择‘复制’的话,这时内容才存放到剪切板里。
使用下面的命令查看剪切板的内容::
$ xclip -out -sel clipboard
而使用剪切板的内容,则是Ctrl+v。 但在有些状况下,好比gnome-terminal,不能直接使用Ctrl+c,Ctrl+v,这时就要用Shift+Ctrl+c,Shift+Ctrl+v代替。
好了,了解了选择缓冲区和剪切板,下面就是实现保留格式粘贴的完美解决方案:
这时,若是要复制的内容也是vim编辑器中的内容,那么如何复制才更方便呢?
vim有一个可视模式(Visual Mode),在此模式下能够选择区域。能够在普通模式下键入v进入可视模式,也能够个性化一点,键入V进入行可视模式,或者键入Ctrl+v进入列可视模式。这时移动光标就能够选择内容了。注意这时被选内容已经实时保存于选择缓冲区了,固然你也能够键入”+y将此内容也保存到剪切板里,或者”ay将内容保存到标签为a的寄存器中。但要知道,只有前两个中的内容能够在其余程序中使用,而a寄存器中的内容只能在该vim编辑器内使用。
也能够经过鼠标来复制。这里首先要打开鼠标模式。:
:set mouse=a
这样在普通模式下能够直接使用鼠标选择区域复制到选择缓冲区。但这种状况下不能复制到剪切板。
若要使用鼠标复制内容到剪切板,则须要作以下设置::
:set mouse=v
这种状况下,除了能够像上面同样直接使用鼠标选择区域复制到选择缓冲区之外,还能够在右键菜单中选择“复制”来保存到剪切板里。但新问题又出来了。若显示行号,也会将行号一并选择。你会想到,这好办呀,若是不须要行号的话,在复制前,先执行set nonu来取消行号显示呗。
其实不必这样,若是不须要复制行号的话,用在可视模式下用键盘来选择不就能够吗?
而且,从上面的讨论,咱们不可贵出,使用选择缓冲区比使用剪切板要方便的多,能够节省不少步骤。
因此,最终咱们获得了vim文件间复制粘贴的完美方案,文件传输的中转使用选择缓冲区。
在~/.vimrc中增长以下一行::
set mouse=v
复制内容到选择缓冲区。
将选择缓冲区中内容粘贴到vim文件:普通模式下按 “*p 。
设置vim中默认使用选择缓冲区寄存器 “*:
set clipboard = unnamed
则能够直接经过y,p和系统选择缓冲区进行数据交换。