vim复制到剪切板
链接:https://www.zhihu.com/question/19863631/answer/89354508
来源:知乎
Vim 中的复制、删除的内容都会被存放到默认(未命名)寄存器中,之后可以通过粘贴操作读取默认寄存器中的内容。寄存器是完成这一过程的中转站,Vim 支持的寄存器非常多,其中常用的有 a-zA-Z0-9+“。其中:
- 0-9:表示数字寄存器,是 Vim 用来保存最近复制、删除等操作的内容,其中 0 号寄存器保存的是最近一次的操作内容。
- a-zA-Z:表示用户寄存器,Vim 不会读写这部分寄存器
- "(单个双引号):未命名的寄存器,是 Vim 的默认寄存器,例如删除、复制等操作的内容都会被保存到这里。
- +:剪切板寄存器,关联系统剪切板,保存在这个寄存器中的内容可以被系统其他程序访问,也可以通过这个寄存器访问其他程序保存到剪切板中的内容。
如果想了解更多寄存器内容,可参http://vimdoc.sourceforge.net/htmldoc/change.html#registers
通过下面命令可以查看所有寄存器中的内容,也可以只查看指定寄存器的内容(将寄存器名称作为参数)
: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。
d,x,c,s也一样,用之前前面加"+。
如果想偷懒用y直接把内容复制到系统剪贴板,需要到vim配置文件.vimrc里加一行属性。用下面命令开始配置,
vim ~/.vimrc然后,加入下面这行,
set clipboard=unnamed现在你的y,d,x,p已经能和 ctrl-c和ctrl-v 一个效果,并且能互相混用。
情况二,
如果找到的是负号开头的-clipboard,说明你的vim不支持系统剪切板,我的MacOS系统自带vim就不支持,所以跑来了。需要先重新安装vim,
Linux系统,
sudo apt install vim-gtkMacOS,
brew install vim安装好之后,重复情况一的操作即可。
问题解决了,有几个细节再解释一下,满足一下好奇心。
首先,vim里y,d,x,c复制,剪切下来的内容临时存放在一个叫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-c和- ctrl-v用到的系统剪贴板:desktop clipboard (- XA_SECONDARY)
- "*:对应图形界面中鼠标框选的内容(可以用鼠标中键黏贴):X11 primary selection (- XA_PRIMARY)
所以看到"*也不要慌,试试看用"*y和"*p能不能复制粘贴。可以的话就说明是混用的,不行就老老实实用"+。
以上。遇到此坑的同学了解一下。
参考文献:
vim复制到剪切板的更多相关文章
- vim与系统剪切板之间的复制粘贴
		背景 vim各种快捷建溜得飞起,然而与系统剪切板之间的复制粘贴一直都是我的痛. 每次需要从vim中拷贝些文字去浏览器搜索,都需要用鼠标选中vim的文字后,Ctrl+c.Ctrl+v,硬生生掐断了纯键盘 ... 
- js-将文本复制到剪切板
		// 将文本复制到剪切板 var clipboard2 = new ClipboardJS('.add_wx_guide_float', { text: function(trigger) { ret ... 
- Flash10下复制到剪切板的一种新方法
		web开发中常常要实现“复制到剪切板”功能.这个功能很实用,但是由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限了.Firefox默认下不能直接通过Javascript操作剪切板,必须开启相 ... 
- jquery实现点击复制到剪切板
		1.必须有先引入 jquery库 <script type="text/javascript" src="js/jquery.js"></sc ... 
- 原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板
		原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板 一.主要实现以下功能:1.用鼠标选择单元格(可谓连续单元格,也可为不连续的)后,按照要求格式“证件号码:+选定内容+“,”+”选定内 ... 
- ZeroClipboard插件——复制到剪切板
		ZeroClipboard是一个轻量级的jQuery“复制到剪贴板”插件采用了时下流行的零剪贴板库.官网:http://www.steamdev.com/zclip 参数及默认值path(必选) Z ... 
- zclip复制到剪切板插件有个bug
		今天发现zclip复制到剪切板插件有个bug,就是在遨游和360浏览器的兼容模式下,点击复制没响应,后来我看了页面代码,发现在这两个浏览器的兼容模式下,生成的是<object>,其他浏览器 ... 
- ZeroClipboard插件,复制到剪切板
		发现一个复制到剪切板的插件:ZeroClipboard插件.挺好用,用法如下: 头部引用: <script type="text/javascript" src=" ... 
- 复制到剪切板js代码(转)
		<script type="text/javascript" language="javascript"> //复制到剪切板js代码 functio ... 
随机推荐
- C# AES的128位、192位、256位加密
			C# AES的128位.192位.256位加密 AES加密原理,这里就不解释了,自行百度.这里主要细说AES的CBC加密模式下的128位.192位.256位加密区别,参考 对称加密和分组加密中的四 ... 
- Linux Swap的那些事
			swap是干嘛的? 在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”.当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况. SWAP意思 ... 
- MNFTL: An Efficient Flash Translation Layer for MLC
			1. we propose two approaches, namely, concentrated mapping and postponed reclamation, to effective r ... 
- 数据结构之单链表(golang版)
			线性表之单链表 package main //线性表中的链式存储结构 //第一个节点为头节点,并不真实保存数据,头节点基本代表了整个链表 import ( "fmt" ) type ... 
- windows登录密码忘记了怎么办?
			利用PE工具进行进行修改密码或者重置系统密码,正对于服务器也同样试用 目前U启动制作效果还不错,黑鲨一键装机,以及老毛桃我觉得还是算了,U深度也不错 经过这么久,小编也把该测试的测试了,,小编比较懒, ... 
- 小记--------spark资源调度机制源码分析-----Schedule
			Master类位置所在:spark-core_2.11-2.1.0.jar的org.apache.spark.deploy.master下的Master类 /** * driver调度机制原理代码分析 ... 
- Jenkins+SVN持续环境搭建
			需要三台不同环境的服务器,SVN.Jenkins.Tomcat 1.SVN搭建 1.Subversion服务器(SVN服务器) 2.项目对应的版本库 3.版本库中钩子程序(用于触发构建命令) 在我以前 ... 
- Netty源码之解码中两种数据积累器(Cumulator)的区别
			上一篇随笔中已经介绍了解码核心工作流程,里面有个数据积累器的存在(Cumulator),其实解码中有两种Cumulator,那他们的区别是什么呢? 还是先打开ByteToMessageDecoder的 ... 
- tensorflow零起点快速入门(5) --强化学习摘录截图
			tf.random_normal_initializer tf的GraphKeys用法 tf.reduce_mean tf.squared_difference 非tf中的zip,python的zip ... 
- JS 正则验证字符串中是否含有数字
			var test_text="abc123";//2. if (new RegExp("[0-9]").test(test_text)) { return fa ... 
