zoukankan      html  css  js  c++  java
  • vim复制到剪切板

    作者:whinc
    链接:https://www.zhihu.com/question/19863631/answer/89354508
    来源:知乎
    转载文章

    Vim 中的复制、删除的内容都会被存放到默认(未命名)寄存器中,之后可以通过粘贴操作读取默认寄存器中的内容。寄存器是完成这一过程的中转站,Vim 支持的寄存器非常多,其中常用的有 a-zA-Z0-9+“。其中:

    • 0-9:表示数字寄存器,是 Vim 用来保存最近复制、删除等操作的内容,其中 0 号寄存器保存的是最近一次的操作内容。
    • a-zA-Z:表示用户寄存器,Vim 不会读写这部分寄存器
    • "(单个双引号):未命名的寄存器,是 Vim 的默认寄存器,例如删除、复制等操作的内容都会被保存到这里。
    • +:剪切板寄存器,关联系统剪切板,保存在这个寄存器中的内容可以被系统其他程序访问,也可以通过这个寄存器访问其他程序保存到剪切板中的内容。

    如果想了解更多寄存器内容,可参


    通过下面命令可以查看所有寄存器中的内容,也可以只查看指定寄存器的内容(将寄存器名称作为参数)

    :reg [register_name] 

    有了上面的基础知识后,要实现题主"将 Vim 剪贴板里面的东西粘贴到 Vim 之外的地方?"就很明了,只需要将内容复制到剪切板寄存器(+)中即可,其他程序便可以访问到了。


    "+yy  // 复制当前行到剪切板
    "+p   // 将剪切板内容粘贴到光标后面
    "ayy  // 复制当前行到寄存器 a
    "ap   // 将寄存器 a 中的内容粘贴到光标后面

    Vim 有12个粘贴板依次编号为:0、1、2、...、9、a、"、+,其中 + 号为系统粘贴板,” 为临时粘贴板。系统剪切板中的内容可在其他程序中使用。上面的复制指令都可以配合剪切板进行操作。

    "nyw 复制当前单词到 n 号剪切板(双引号开始)
    "np 粘贴 n 号剪切板内容到当前位置后
    "+Y 复制当前行到系统剪切板
    "+nY 复制当前行往下 n 行到系统剪切板
    "+p 粘贴系统剪切板内容到当前位置后

     
     

    根据平台不同,要分两种情况。先用下面命令确定你属于哪一种,

    vim --version | grep clipboard

     

    情况一,

    如果结果里你找到加号开头的+clipboard, 恭喜你,你的vim没问题,是你姿势问题。

    • "+y 代替y将选中的内容复制到系统剪贴板,效果和ctrl-c一致。
    • "+p代替p将剪贴板内容复制到指定位置,也可以用ctrl-v

    dxcs也一样,用之前前面加"+

    如果想偷懒用y直接把内容复制到系统剪贴板,需要到vim配置文件.vimrc里加一行属性。用下面命令开始配置,

    vim ~/.vimrc

    然后,加入下面这行,

    set clipboard=unnamed

    现在你的ydxp已经能和 ctrl-cctrl-v 一个效果,并且能互相混用。

     

    情况二,

    如果找到的是负号开头的-clipboard说明你的vim不支持系统剪切板,我的MacOS系统自带vim就不支持,所以跑来了。需要先重新安装vim,

    Linux系统,

    sudo apt install vim-gtk

    MacOS,

    brew install vim

    安装好之后,重复情况一的操作即可。

     

     

    问题解决了,有几个细节再解释一下,满足一下好奇心。

    首先,vim里ydxc复制,剪切下来的内容临时存放在一个叫vim寄存器(Register)的地方。而且寄存器有好几个。下面vim命令可以看到寄存器列表,

    :reg

    最常用的默认寄存器""未命名寄存器(unnamed register)。最近一次删除,修改,复制内容统统暂存这里(会覆盖,只保留最近一次任意操作)。感兴趣的同学可以看下表,其他寄存器都是干什么的。

    ""      // 默认unnamed寄存器,最近一次"d","c","s","x","y"复制,删除,修改内容
    
    "0      // 最近一次"y"复制内容
    
    "1      // 最近一次"d","c","s","x"删除,修改内容
    "2     //  上一次"d","c","s","x"删除,修改内容
    "3     // 上上次"d","c","s","x"删除,修改内容
    ...     
    "9      // [1-9]数字以此类推
    
    
    "a     // 字母寄存器,供用户指定使用,比如"ay就是复制到"a寄存器
    "b
    ...
    "z
    
    
    "-      // 少于一行的"d","c","x"删除内容
    
    ".      // 只读寄存器
    ":      // 只读寄存器
    "%     // 只读寄存器
    "#     // 只读寄存器
    
    "+      // 映射系统剪贴板 (有的默认设置不支持)
    "*      // 映射系统剪贴板 (有的默认设置不支持)

     

    ctrl-c以及ctrl-v用到的是系统剪贴板(system clipboard)vim寄存器和系统剪贴板不是一个东西。顾名思义,vim寄存器的数据作用域仅限于vim本地,甚至如果开多个vim窗口,每个窗口都有一套自己完整的寄存器,互相不影响。而系统剪贴板作为系统级别的全局变量,两边当然不能混用。

    所以vim专门提供了"+寄存器作为对系统剪贴板的映射。可以理解成自动把"+寄存器的内容再复制一份到系统剪贴板,前提是你得把clipboard属性设置成打开。有些版本(比如MacOS自带的vim)就不支持这个映射。重装vim就是为了打开这个开关。(如果有简便的直接改设置方法,请纠正我)。打开以后用"+y命令把内容复制到和系统剪贴板关联的寄存器"+上。而y只是复制到默认无名寄存器""上。

    最后set clipboard=unnamed就是把默认无名寄存器"" 和系统剪贴板也关联上。 就是用y也可以备份到系统剪贴板。缺点是破坏了默认寄存器""的本地性。因为p操作也会被等同于"+p处理,粘贴的是"+寄存器的内容, 粘贴的时候""默认寄存器内容就会被覆盖。 表现出来的就是复制一次,到任意vim窗口都可以粘贴。但这个特性恰恰是很多人想要的。

    还有个细节,大部分系统上"+"*是等价的。但在有的系统上不等价,比如Linux,

    • "+:对应ctrl-cctrl-v用到的系统剪贴板:desktop clipboard (XA_SECONDARY)
    • "*:对应图形界面中鼠标框选的内容(可以用鼠标中键黏贴):X11 primary selection (XA_PRIMARY)

    所以看到"*也不要慌,试试看用"*y"*p能不能复制粘贴。可以的话就说明是混用的,不行就老老实实用"+

     

    以上。遇到此坑的同学了解一下。

     

    参考文献:

     
  • 相关阅读:
    [BZOJ3884] 上帝与集合的正确用法
    [BZOJ3518] 点组计数
    [BZOJ3601] 一个人的数论
    [BZOJ3529] [Sdoi2014]数表
    原生js实现无缝滚动轮播图-点击页码即刻显示该页码的内容
    原生js实现无缝滚动轮播图
    vue封装tinymce富文本组件,图片上传回调方法
    vue-cli项目结合Element-ui基于cropper.js封装vue图片裁剪组件
    js实现多文件上传(二)-- 拖拽上传
    js实现多文件上传(一)-- 图片转base64回显
  • 原文地址:https://www.cnblogs.com/callmelord/p/11579646.html
Copyright © 2011-2022 走看看