《Pro Vim》和《Vim使用技巧》中关于* 和 + 寄存器(register)都模糊其词,在Windows和Macos下两者效果一样(据说,没试过),在wayland下体验挺诡异的,在X11下有很明显的区别。
vim 寄存器
首先vim中寄存器的使用方法是这样的,在Visual模式下,选中文字,然后
“*y
就能把文字复制到* 寄存器中。黏贴时用
”*p
vim默认的寄存器是"(双引号)寄存器,yy和""yy 效果是一样的。vim中查看寄存器的命令是
:register
关于vim寄存器的详细内容,参见《Pro Vim》Register部分
X11
检查自己使用的是wayland还是X11,使用这个命令
echo $XDG_SESSION_TYPE
在X11中,有两种黏贴板:selections 和 cut-buffer。两者的机制是不同的
selection中的内容由提供的应用程序维护,从selection取数据的程序要向原引用程序索取数据。当原应用程序退出时,你也要不到这段数据了。selection其实由三部分构成:Primary,Secondary,Clipboard。其中Secondary表现ill-defined,我们不会再提到它。如果你想要黏贴Primary中的数据,按下鼠标的中键,如果你想黏贴Clipboard中的数据,鼠标右键,在弹出框中选择黏贴。
cut-buffer由cut-buffer0-7 , 8个buffer构成。cut-buffer 中的数据由X-server维护。如果你不知道什么是x-server,...。只有当x-server退出时(如log out),数据才会消失。也就是说cut-buffer中的数据较为持久,但cut-buffer是一种old and outdated的技术。
Xclip
我们需要工具来查看x11中黏贴板的变化(总不能一直使用鼠标吧)。我们可以用xclip来查看黏贴板,为方便起见我写了2个函数
# clear clipboard
function clclipboard(){
echo | xclip -selection clipboard
echo | xclip -selection primary
echo | xclip -selection cut-buffer
}
# show clipboard
function lsclipboard(){
printf "primary "; xclip -o -selection primary
echo
printf "clipboard "; xclip -o -selection clipboard
echo
printf "cut-buffer "; xclip -o -selection cut-buffer
}
测试
我们打开 vim --noplugin,输入 :h x11-selection,这也是我的主要参考资料,建议详细阅读。然后gg 到顶部,同时在下面开一个终端,clclipboard一下。
我们选中1开头的那一行,"*y,然后在下面运行lsClipboard
![f6c1034354c6c9d8c7529fd8a5fc0711.png](https://i-blog.csdnimg.cn/blog_migrate/469581bb5cc64be9da886bbe67721156.jpeg)
然后我们选中第二行,"+y ,同样运行lsclipboard
![42fe8be2d0a57f15d8ef33a7081938f6.png](https://i-blog.csdnimg.cn/blog_migrate/48adc072ad62a8ba7bb40110d534534a.jpeg)
我们在把第三行复制到* 寄存器
![750bf7dd2d402d16dc2ee397e998e386.png](https://i-blog.csdnimg.cn/blog_migrate/69d4f3e07ce4ad65ba0e7628aec0240e.jpeg)
这是我们打开gedit,先按下中键,黏贴的是 3. Shell ....
再Ctrl-v ,黏贴的是 2. GUI......
然后退出Vim,按中键和Ctrl-V ,这时的效果如何,大家可以试一下,应该中键的内容是没有的。
结论
使用* 寄存器,内容只会覆盖 Primary,而且vim一旦关闭,内容会消失
使用+ 寄存器,内容会覆盖 Primary,Clipboard,Cut-buffer0,内容保存的时间较为持久。
如果Ctrl-C的常规复制方式,内容会覆盖 Primary,Clipboard,Cut-buffer0