转载自本人独立博客https://liushiming.cn/2020/01/18/copy-and-paste-in-vim/

概述

复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻烦的,有一点学习成本。本文总结了使用vim复制粘贴的典型场景和使用方法,希望对读者有帮助。

vim内部复制、粘贴、剪切

选择文本

  • v+光标移动 (按字符选择)高亮选中所要的文本,然后进行各种操作(比如,d表示删除)。
  • V (按行选择)
  • v+选中的内容+c 更改选中的文字

复制:y(ank)

  • y 用v命令选中文本后,用y进行复制
  • yy 复制当前行,然后用p进行粘贴
  • 5yy 复制从当前行开始的5行
  • y_ 等同于yy
  • Y 等同于yy
  • yw 复制当前单词
  • y$ 从当前位置复制到行尾
  • y0 从当前位置复制到行首
  • y^ 从当前位置复制到第一个非空白字符
  • yG 从当前行复制到文件结束
  • y20G 从当前行复制到第20行
  • y?bar 复制至上一个出现bar的位置

粘贴:p(aste)

  • p(小写) 在光标位置之后粘贴
  • P(大写) 在光标位置之前粘贴

剪切

  • v + 方向键(hjkl)选中内容 + d 剪切 + p粘贴

剪贴板

默认剪贴板

vim提供12个剪贴板,它们的名字分别为vim有11个粘贴板,分别是012...9a。如果开启了系统剪贴板,则会另外多出两个:+*。使用:reg命令,可以查看各个粘贴板里的内容。

:reg

在vim中简单用y只是复制到(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容。

复制和粘贴到指定剪贴板

要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny完成复制,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了。

要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号。比如,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p将系统全局粘贴板里的内容粘贴进来。

系统剪贴板

Vim支持系统剪贴板,需要打开clipboard功能。使用下面的命令,检查当前版本的Vim,是否支持clipboard。

$ vim --version | grep "clipboard"
-clipboard +insert_expand +path_extra +user_commands
+emacs_tags -mouseshape +startuptime -xterm_clipboard
root@sz ➜ ~ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 07 2019 15:35:43)

-clipboard代表不支持+clipboard代表支持。

如果不支持的话,需要安装gvim或者在编译的时候开启系统剪贴板选项。

vim复制到系统剪贴板

  • "*y
  • "+y
  • "+2yy – 复制两行
  • {Visual}"+y - copy the selected text into the system clipboard
  • "+y{motion} - copy the text specified by {motion} into the system clipboard
  • :[range]yank + - copy the text specified by [range] into the system clipboard

vim剪切到系统剪贴板

  • "+dd – 剪切一行

从系统剪贴板粘贴到vim

  • "*p
  • "+p
  • Shift+Insert
  • :put + - Ex command puts contents of system clipboard on a new line
  • <C-r>+ - From insert mode (or commandline mode)

"+p比 Ctrl-v 命令更好,它可以更快更可靠地处理大块文本的粘贴,也能够避免粘贴大量文本时,发生每行行首的自动缩进累积,因为Ctrl-v是通过系统缓存的stream处理,一行一行地处理粘贴的文本。

设置vim默认使用系统剪贴板

确定vim支持+clipboard后,如果想y/p直接和系统剪贴板打通,可以在~/.vimrc中加上以下配置):

set clipboard^=unnamed,unnamedplus

其中unnamed代表*寄存器,unnamedplus代表+寄存器。在mac系统中,两者都一样;一般在linux系统中+*是不同的,+对应ctrl + c,ctrl + v的桌面系统剪贴板,*对应x桌面系统的剪贴板(用鼠标选择复制,用鼠标中键粘贴)。

服务器vim复制到本地剪贴板

通过ssh连接到linux服务器时,vim是跑在远程服务器的,不能使用y复制到本地的剪贴板。这时有几个方法:

cmd + c

用鼠标选中文字cmd + c复制(windows下ctrl + c复制),cmd + v粘贴到本地。这个方法是最自然的,但是想要用这个方法有几个前提:

  • vim配置中开启鼠标支持,.vimrc文件中加上
set mouse=a
  • terminal客户端关闭mouse reporting选项,否则鼠标点击vim界面会进入visual模式。参见我这篇文章解决iterm2中vim选中文字不能复制的问题
  • 如果使用tmux,tmux需要配置支持鼠标滚轮,否则最多只能复制当前页面的内容

本地vim通过scp编辑远程文件

使用本地vim通过scp直接编辑远程文件。这样就可以使用本地寄存器"+y"复制了。这种方法对远程vim配置没有要求。

vim scp://remoteuser@server.com//absolute/path/to/file

注意com和absolute间是两个反斜杠//并不是敲错了。

参考链接

概述

复制粘贴是文本编辑最常用的功能,但是在vim中复制粘贴还是有点麻烦的,有一点学习成本。本文总结了使用vim复制粘贴的典型场景和使用方法,希望对读者有帮助。

vim内部复制、粘贴、剪切

选择文本

  • v+光标移动 (按字符选择)高亮选中所要的文本,然后进行各种操作(比如,d表示删除)。
  • V (按行选择)
  • v+选中的内容+c 更改选中的文字

复制:y(ank)

  • y 用v命令选中文本后,用y进行复制
  • yy 复制当前行,然后用p进行粘贴
  • 5yy 复制从当前行开始的5行
  • y_ 等同于yy
  • Y 等同于yy
  • yw 复制当前单词
  • y$ 从当前位置复制到行尾
  • y0 从当前位置复制到行首
  • y^ 从当前位置复制到第一个非空白字符
  • yG 从当前行复制到文件结束
  • y20G 从当前行复制到第20行
  • y?bar 复制至上一个出现bar的位置

粘贴:p(aste)

  • p(小写) 在光标位置之后粘贴
  • P(大写) 在光标位置之前粘贴

剪切

  • v + 方向键(hjkl)选中内容 + d 剪切 + p粘贴

剪贴板

默认剪贴板

vim提供12个剪贴板,它们的名字分别为vim有11个粘贴板,分别是012...9a。如果开启了系统剪贴板,则会另外多出两个:+*。使用:reg命令,可以查看各个粘贴板里的内容。

:reg

在vim中简单用y只是复制到(双引号)粘贴板里,同样用p粘贴的也是这个粘贴板里的内容。

复制和粘贴到指定剪贴板

要将vim的内容复制到某个粘贴板,需要退出编辑模式,进入正常模式后,选择要复制的内容,然后按"Ny完成复制,其中N为粘贴板号(注意是按一下双引号然后按粘贴板号最后按y),例如要把内容复制到粘贴板a,选中内容后按"ay就可以了。

要将vim某个粘贴板里的内容粘贴进来,需要退出编辑模式,在正常模式按"Np,其中N为粘贴板号。比如,可以按"5p将5号粘贴板里的内容粘贴进来,也可以按"+p将系统全局粘贴板里的内容粘贴进来。

系统剪贴板

Vim支持系统剪贴板,需要打开clipboard功能。使用下面的命令,检查当前版本的Vim,是否支持clipboard。

$ vim --version | grep "clipboard"
-clipboard +insert_expand +path_extra +user_commands
+emacs_tags -mouseshape +startuptime -xterm_clipboard
root@sz ➜ ~ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Jun 07 2019 15:35:43)

-clipboard代表不支持+clipboard代表支持。

如果不支持的话,需要安装gvim或者在编译的时候开启系统剪贴板选项。

vim复制到系统剪贴板

  • "*y
  • "+y
  • "+2yy – 复制两行
  • {Visual}"+y - copy the selected text into the system clipboard
  • "+y{motion} - copy the text specified by {motion} into the system clipboard
  • :[range]yank + - copy the text specified by [range] into the system clipboard

vim剪切到系统剪贴板

  • "+dd – 剪切一行

从系统剪贴板粘贴到vim

  • "*p
  • "+p
  • Shift+Insert
  • :put + - Ex command puts contents of system clipboard on a new line
  • <C-r>+ - From insert mode (or commandline mode)

"+p比 Ctrl-v 命令更好,它可以更快更可靠地处理大块文本的粘贴,也能够避免粘贴大量文本时,发生每行行首的自动缩进累积,因为Ctrl-v是通过系统缓存的stream处理,一行一行地处理粘贴的文本。

设置vim默认使用系统剪贴板

确定vim支持+clipboard后,如果想y/p直接和系统剪贴板打通,可以在~/.vimrc中加上以下配置):

set clipboard^=unnamed,unnamedplus

其中unnamed代表*寄存器,unnamedplus代表+寄存器。在mac系统中,两者都一样;一般在linux系统中+*是不同的,+对应ctrl + c,ctrl + v的桌面系统剪贴板,*对应x桌面系统的剪贴板(用鼠标选择复制,用鼠标中键粘贴)。

服务器vim复制到本地剪贴板

通过ssh连接到linux服务器时,vim是跑在远程服务器的,不能使用y复制到本地的剪贴板。这时有几个方法:

cmd + c

用鼠标选中文字cmd + c复制(windows下ctrl + c复制),cmd + v粘贴到本地。这个方法是最自然的,但是想要用这个方法有几个前提:

  • vim配置中开启鼠标支持,.vimrc文件中加上
set mouse=a
  • terminal客户端关闭mouse reporting选项,否则鼠标点击vim界面会进入visual模式。参见我这篇文章解决iterm2中vim选中文字不能复制的问题
  • 如果使用tmux,tmux需要配置支持鼠标滚轮,否则最多只能复制当前页面的内容

本地vim通过scp编辑远程文件

使用本地vim通过scp直接编辑远程文件。这样就可以使用本地寄存器"+y"复制了。这种方法对远程vim配置没有要求。

vim scp://remoteuser@server.com//absolute/path/to/file

注意com和absolute间是两个反斜杠//并不是敲错了。

参考链接

一文搞懂vim复制粘贴的更多相关文章

  1. VIM复制粘贴大全!

    原文地址:http://lsong17.spaces.live.com/blog/cns!556C21919D77FB59!603.entry 内容: 用vim这么久 了,始终也不知道怎么在vim中使 ...

  2. VIM复制粘贴大全[转]

    用vim这么久 了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不 爽:上次论坛上有人问到了怎么在vim中使 ...

  3. 三文搞懂学会Docker容器技术(下)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...

  4. 一文搞懂所有Java集合面试题

    Java集合 刚刚经历过秋招,看了大量的面经,顺便将常见的Java集合常考知识点总结了一下,并根据被问到的频率大致做了一个标注.一颗星表示知识点需要了解,被问到的频率不高,面试时起码能说个差不多.两颗 ...

  5. 一文搞懂RAM、ROM、SDRAM、DRAM、DDR、flash等存储介质

    一文搞懂RAM.ROM.SDRAM.DRAM.DDR.flash等存储介质 存储介质基本分类:ROM和RAM RAM:随机访问存储器(Random Access Memory),易失性.是与CPU直接 ...

  6. 基础篇|一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  7. 一文搞懂 Prometheus 的直方图

    原文链接:一文搞懂 Prometheus 的直方图 Prometheus 中提供了四种指标类型(参考:Prometheus 的指标类型),其中直方图(Histogram)和摘要(Summary)是最复 ...

  8. Web端即时通讯基础知识补课:一文搞懂跨域的所有问题!

    本文原作者: Wizey,作者博客:http://wenshixin.gitee.io,即时通讯网收录时有改动,感谢原作者的无私分享. 1.引言 典型的Web端即时通讯技术应用场景,主要有以下两种形式 ...

  9. 三文搞懂学会Docker容器技术(中)

    接着上面一篇:三文搞懂学会Docker容器技术(上) 6,Docker容器 6.1 创建并启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] --na ...

随机推荐

  1. ANDROID开发之问题积累及解决方案(三)

    1.dexDebug ExecException finished with non-zero exit value 2需要在gradle中配置下面的代码,原因是引用了多个libraries文件 de ...

  2. Linux下Libevent安装和简单实用

    前言 Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相 ...

  3. 数据从mmsql导入mysql

    SQL SERVER数据导入MYSQL 工具: navicat for mysql 百度搜一个安装就可以,前提是你已经安装了mysql 1,创建目标数据库 点击创建好的目标数据库website点的表一 ...

  4. DataPipeline王睿:业务异常实时自动化检测 — 基于人工智能的系统实战

    大家好,先自我介绍一下,我是王睿.之前在Facebook/Instagram担任AI技术负责人,现在DataPipeline任Head of AI,负责研发企业级业务异常检测产品,旨在帮助企业一站式解 ...

  5. HDU-1719 Friend

    刚开始想打个表... 结果我发现我理解错了题目意思,以为a,b必须是两个不同的数字,然后完全无法理解样例的3为什么是friend number...很尴尬就只能去网上找题解,才发现a,b可以相等(太菜 ...

  6. 使用Python发送、订阅消息

    使用Python发送.订阅消息 使用插件 paho-mqtt 官方文档:http://shaocheng.li/post/blog/2017-05-23 Paho 是一个开源的 MQTT 客户端项目, ...

  7. ORA-04089: cannot create triggers on objects owned by SYS

    04089 问题原因 因为你在以sys用户创建触发器,但oracle却不建议在sys用户下创建触发器.

  8. 【NOI2002】银河英雄传说

    [NOI2002]银河英雄传说 这道题暴力模拟会TLE,因为它是并查集的一个应用…… #include<bits/stdc++.h> using namespace std; ],q[], ...

  9. HTTP状态码的浪漫故事

    小明是一个程序员,经常加班,在一个和尚部门,一个妹子都没有,所以一直单身. 404(Not Found):服务器无法根据客户端的请求找到资源(网页) 过年回家,老爸老妈给门开一条缝,先看看小明身后-- ...

  10. web项目中设置首页

    1.在web.xml中设置以下代码: <welcome-file-list> <welcome-file>login.jsp</welcome-file> < ...