不同于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代替。


原格式粘贴

好了,了解了选择缓冲区和剪切板,下面就是实现保留格式粘贴的完美解决方案:

  • 方案一:
  1. 选择文本内容
  2. vim普通模式下按 “*p 将选择缓冲区中内容粘贴进来
  • 方案二:
  1. 复制文件内容
  2. vim普通模式下按 “+ p 将剪切板内容粘贴进来

这时,如果要复制的内容也是vim编辑器中的内容,那么如何复制才更方便呢?

vim中的复制

vim有一个可视模式(Visual Mode),在此模式下可以选择区域。可以在普通模式下键入v进入可视模式,也可以个性化一点,键入V进入行可视模式,或者键入Ctrl+v进入列可视模 式。这时移动光标就可以选择内容了。注意这时被选内容已经实时保存于选择缓冲区了,当然你也可以键入”+y将此内容也保存到剪切板里,或者”ay将内容保 存到标签为a的寄存器中。但要知道,只有前两个中的内容可以在其他程序中使用,而a寄存器中的内容只能在该vim编辑器内使用。

也可以通过鼠标来复制。这里首先要打开鼠标模式。:

:set mouse=a

这样在普通模式下可以直接使用鼠标选择区域复制到选择缓冲区。但这种情况下不能复制到剪切板。

若要使用鼠标复制内容到剪切板,则需要做如下设置::

:set mouse=v

这种情况下,除了可以像上面一样直接使用鼠标选择区域复制到选择缓冲区以外,还可以在右键菜单中选择“复制”来保存到剪切板里。但新问题又出来了。 若显示行号,也会将行号一并选择。你会想到,这好办呀,如果不需要行号的话,在复制前,先执行set nonu来取消行号显示呗。

其实没必要这样,如果不需要复制行号的话,用在可视模式下用键盘来选择不就可以吗?

并且,从上面的讨论,我们不难得出,使用选择缓冲区比使用剪切板要方便的多,可以节省很多步骤。

所以,最终我们得到了vim文件间复制粘贴的完美方案,文件传输的中转使用选择缓冲区。

vim文件间复制粘贴完美方案

  1. 在~/.vimrc中增加如下一行::

    set mouse=v
  2. 复制内容到选择缓冲区。

    • 带行号时,使用鼠标选择内容区域。
    • 不要行号,使用 “*yny 复制n行或可视模式下选择。
  3. 将选择缓冲区中内容粘贴到vim文件:普通模式下按 “*p 。


补充:

设置vim中默认使用选择缓冲区寄存器 “*:

set clipboard = unnamed

则可以直接通过y,p和系统选择缓冲区进行数据交换。

Logo

更多推荐