在计算机里面也有寄存器,计算机中的寄存器是看得见,摸得着的实体,寄存器中存储需要经常访问的一些数据。而vim中也有寄存器的概念,vim中的寄存器是一个虚拟的概念,更像是一块专门用来存储数据的内存缓冲区。在使用vim的过程中离不开寄存器,而且我们很早就用到了寄存器,只是没有发现罢了。这篇文章将深入介绍寄存器,这样我们对之前使用的命令将会有更深的认识。

几种寄存器类型

无名寄存器

在之前介绍过,可以使用d来删除一段内容,使用p来粘贴,使用y来复制, vim中其他的带有删除功能的operatorxcs 之类的,vim在删除之前会将被删除内容先放到无名寄存器中,然后执行删除操作。严格意义上来说,他们并不是删除而是剪切。后续可以通过p 命令来粘贴之前被删除的内容

例如

print("hello world")
print("")

改为

print("hello world")
print("")

就可以在第一行通过di",将被删除的内容存储到无名寄存器中,然后在第二行对应位置执行 p (或者P) 命令取出无名寄存器中的内容。



这里在使用h 移动光标之后,光标所在位置在后一个引号的位置,为了减少一次光标移动,我直接使用P 在光标所在位置之前进行粘贴操作。

这里插一个题外话,vim中的命令都是某些有意义的单词的首字母或者几个字母的缩写,像d代表delete、y代表yank,那么p又代表什么呢,粘贴的英文是paste,但是知道寄存器以及复制粘贴在vim的表现,我觉得应该是put,就是将寄存器中的内存拿出来。好在他们的首字母相同,不影响记忆。

有名寄存器

它是对应无名寄存器来说的,无名寄存器虽然说使用方便,但是有一个很大的问题,那就是如果我们连续两次执行了删除或者复制操作,那么前一次保存的内容将会被后一次的给覆盖掉。为了解决这个问题,一个思路就是使用有名寄存器。

vim中提供了由a到z的有名寄存器,可以在使用operator 的操作前面指定需要使用的寄存器,引用一个寄存器可以使用 " + 寄存器名的格式。这个时候我们之前的公式就又可以扩展了

" + regester + operator + motion

例如在执行删除的时候 "add 将一行删除的内容放到a寄存器中,再次执行"bdd将内容放到b寄存器中,执行粘贴的时候,可以使用"ap"bp来分别使用 a和b寄存器的内容。

无名寄存器有一个专用的符号,使用 "来表示。也就是说dd 命令其实等效为 ""dd。但是为了偷懒和方便,还是少输几个字符的好。

复制寄存器

前面说到使用 dd 之类的命令会将被删除的内容放到无名的寄存器中,它的行为有点像普通编辑器中的剪切,那它是不是剪切呢,那么多教程都把它叫做删除,是不是有问题呢。它确实是删除指定,教程说的也没错,vim中有专门存储复制内容的寄存器。普通的删除命令会把被删除的内容保存到无名寄存器中,但是这些内容不会被保存到复制寄存器中。复制寄存器使用 0来表示。即我们可以使用 "0p来将复制寄存器的内容取出。也可以通过命令 :reg 0来查看这个寄存器的内容。



在上述例子中,我们先在第一行执行 yy 操作进行复制,这个时候数据会被同时保存到无名寄存器和复制寄存器。然后在第二行执行 dd 删除,这个时候第二行的数据会被保存到无名寄存器,之前保存的第一行的数据就被删除了,但是不会被保存到复制寄存器,第一行的数据仍然存储在赋值寄存器。接着立即执行p 它会从无名寄存器中中取出我们之前删除的第二行的数据。接着再执行"0p 会从复制寄存器中取数据,这个时候取出的仍然是第一行的数据。

黑洞寄存器

前面说到 dd会将被删除内容放入到无名寄存器中,如果这段内容我确实不想要了,也不想它占用寄存器,有没有什么办法彻底删除呢,答案是使用黑洞寄存器,顾名思义,放入该寄存器中的内容都被吸走丢失了,无法使用了。黑洞寄存器使用 _作为标识符,执行删除指令的时候可以使用 "_dd这样就再也访问不到之前删除的内容了。



在上面的例子中,我们先执行普通的dd 命令,它会将删除内容放入到无名寄存器中,第二次执行的是 "_dd ,它会将内容放到黑洞寄存器中直接丢弃,后面执行p 的时候只会粘贴第一次删除的内容。有小伙伴可能会说,这个跟我使用其他有名寄存器效果是一样的。看不出什么区别,那么我们可以试试使用 :reg 命令来查看有名寄存器和黑洞寄存器的值,我们发现黑洞寄存器的值永远为空,而有名寄存器此时多了一条记录。

系统剪切板

之前我们在vim中复制粘贴的内容,只能在vim中使用。同样的系统中复制粘贴的内容只能在系统其它程序中使用,无法直接粘贴到vim中。我们可以在vim中使用系统剪切板。vim可以使用+来访问系统剪切板。例如使用 "+yy将内容复制到系统剪切板中,供其他程序使用。

但是在有好的shell工具的加持下,我更喜欢用<Ctrl+v>这样的方式直接粘贴一大段文字到vim中。或者配合vim的可视模式,直接使用shell中的快捷键从vim中粘贴选中的内容到系统剪切板

表达式寄存器

前面介绍的几种寄存器都是被动的存储静态的内容,只有存储功能。表达式寄存器则可以接受一段vim脚本并执行它并输出结果。表达式寄存器使用 =来表示。

例如在插入模式中可以使用 <Ctrl+r>=6*6 来进行数学计算并输出。



到此已经介绍完了vim中几种主要的寄存器,是不是觉得挺抽象的,而且用起来也不是那么方便。下面我们还是以例子来展示相关用法。

示例

示例1:复制粘贴的使用

假设我们要将如下代码

print("hello world")
print("hello vim")

修改为

print("hello world")
print("hello world")

可以在第一行使用 yi"来复制引号内的内容,但是如果在第二行先使用 ci"再使用 p进行粘贴的话会发现粘贴的仍然是hello vim这是因为后面使用c操作的时候,已经将原来的给覆盖掉了。现在我们来解决这个问题。

第一种解法:y指令可以额外产生一个动作,它会将内容放入到复制寄存器中,那么在执行了ci"之后使用 "0p来使用复制寄存器中的内容



第二种解法:可以手动指定ci"删除的内容放入到黑洞寄存器中,即执行"_ci"这样就不会产生覆盖问题。



前两种方法虽然解决问题了,但是都引入了新的寄存器,按键比较繁琐,如果不想引入新寄存器,就得使用接下来介绍的第三种方法了,它也是我最喜欢的方法了。

解法三:由于我们需要先删除之前的内容再复制,为了快速删除,所以会发生覆盖问题,我们只要不执行删除操作就不会覆盖了,为了一次性完成粘贴替换的操作,可以使用选择模式,之前介绍选择模式的时候说过,在选择模式下operator 会将选中部分作为操作区域。可以使用 vi" 来选中引号内容,然后直接使用 p 完成复制

示例2:插入模式中使用寄存器

之前已经在介绍表达式寄存器的时候已经介绍了如何在插入模式中使用寄存器,可以使用 <Ctrl + r> + register 例如上面的例子可以使用 <Ctrl + r>0来将复制寄存器中的内容写入到光标所在位置。



相比上面介绍的前两种解法,它省去了切换回普通模式的步骤,相对来说更高效一点。但是我觉得它还是比不上第三种解法。

示例三: 处理粘贴混乱的问题

有的时候在粘贴代码的时候发现代码的格式可能会乱,这个时候可以设置 :set paste选项,设置之后复制粘贴将不再出现这个问题,但是它会使我们在其他模式下设置的快捷键失效,在粘贴完了之后可以使用 :set nopaste取消该设置。由于我使用的neovim中没有发现这个问题,就不演示了,各位使用vim的小伙伴可以自行测试。

当然处理该问题的另一种方式是使用之前介绍的在vim中使用剪切板的方法,也就是使用 "+p这样的形式。

vim 从嫌弃到依赖(15)——寄存器的更多相关文章

  1. vim寄存器与复制粘贴的实现

    对于大多数在Ubuntu下使用vim作为常用编辑器的同学来讲,他们遇到的第一个比较大的麻烦来自于vim与外部应用的复制粘贴. 当然,愿意选择ubuntu以及vim的同学肯定是google好手.不幸的是 ...

  2. vim 计算器寄存器使用

    我们可能会在vim的使用中,碰到下面的情况 当我正在写一周预算的时候,我想计算下每天我买菜花2.7,每天买两顿,周死晚上出去吃,周六额外买1.5斤14.8一斤的猪肉... 这时候你打算怎么办呢,是不是 ...

  3. iconv内容,convmv文件名,unix2dos,dos2unix文件格式转换,od/cut/wc/dd/diff/uniq/nice/du等命令,linux文件名乱码,文件名,文件内容,vim编码设置

    1.enconv文件名编码转换,比如要将一个GBK编码的文件转换成UTF-8编码,操作如下 enconv -L zh_CN -x UTF-8 filename enconv -L GB2312 -x  ...

  4. Centos 7中 vim 中文乱码

    参考:http://www.myexception.cn/operating-system/1534005.html 一. sudo vim /etc/vimrc 在文件中加入如下几行:      s ...

  5. 【转】vim文件编码和乱码处理

    原文网址:http://edyfox.codecarver.org/html/vim_fileencodings_detection.html 在 Vim 中,有四个与编码有关的选项,它们是:file ...

  6. Vim 实用技术,第 1 部分: 实用技巧(转)

    原文链接:http://blog.jobbole.com/20604/ 0. Vim 简介 作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱 ...

  7. 转 :Vim文件编码识别与乱码处理

    Vim文件编码识别与乱码处理   在 Vim 中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding 和 termencoding.在实际使用中,任 ...

  8. VIM 文件编码识别与乱码处理(转载)

    在 Vim 中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding 和 termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱 ...

  9. VIM显示utf-8文档乱码解决方法

    1.相关基础知识介绍 在Vim中.有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding和termencoding. 在实际使用中.不论什么一个选项出现 ...

  10. VIM使用系列: 复制并移动文本

    1 5. 复制并移动文本 *copy-move* 2 3 *quote* 4 "{a-zA-Z0-9.%#:-"} 指定下次的删除.抽出和放置命令使用的寄存器 5 {a-zA-Z0 ...

随机推荐

  1. Solon Aop 特色开发(5)切面与环绕拦截

    Solon,更小.更快.更自由!本系列专门介绍Solon Aop方面的特色: <Solon Aop 特色开发(1)注入或手动获取配置> <Solon Aop 特色开发(2)注入或手动 ...

  2. 机器学习周刊第五期:一个离谱的数据可视化Python库、可交互式动画学概率统计、机器学习最全文档、快速部署机器学习应用的开源项目、Redis 之父的最新文章

    date: 2024/01/08 这个网站用可视化的方式讲解概率和统计基础知识,很多内容还是可交互的,非常生动形象. 大家好,欢迎收看第五期机器学习周刊 本期介绍7个内容,涉及Python.概率统计. ...

  3. 【奥运会】yahoo的这个骚操作令人费解。。。

    昨天在朋友圈发了一张截图,貌似很多朋友没有 get 到点,我也实在搞不懂 Yahoo 的这波操作. 默认排序是按照金牌总数,那必然是美国第一名了.不过习惯上不应该是按照金牌总数进行排名吗?毕竟金银铜牌 ...

  4. 详解 SSL(三):SSL 证书该如何选择?

    在上一篇< 详解 SSL(二):SSL 证书对网站的好处>中,我们知道了在网站部署 SSL 证书后,不管是对网站本身还是对网站的用户都能够带来许多好处.那么随着 HTTPS 的普及,市面上 ...

  5. 聊聊大语言模型(LLM)的 10 个实际应用

    近期,苹果公司正在悄悄研究可以挑战的 OpenAI.谷歌和其他公司的 AI 工具,建立了自己的框架来创建大语言模型,并创建了一个聊天机器人服务,一些工程师称之为"Apple GPT" ...

  6. AIO异步通信。BIO同步阻塞式IO, NIO同步非阻塞通信。

    IO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的.单独的程序一般是让系统为它们完 ...

  7. 通过部署流行 Web 框架掌握 Serverless 技术

    大家好,我是霍大侠,本篇我们通过学习部署流行 Web 框架,如 Spring Boot,Express,Web IDE,让你掌握 Serverless 函数计算架构和技术,领略弹性并发.高可用的好处. ...

  8. WebGPU光追引擎基础课:课程介绍

    大家好~我开设了"WebGPU光追引擎基础课"的线上课程,从0开始,在课上带领大家现场写代码,使用WebGPU开发基础的光线追踪引擎 课程重点在于基于GPU并行计算,实现BVH构建 ...

  9. Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

    如果需要处理大量的PPT转PDF的工作,一个个打开并另存为PDF是非常费时的做法.我们可以利用Python编程语言的强大的工具来自动化这个过程,使得批量转换变得简单而高效.本文将介绍如何使用Pytho ...

  10. Canvas实现画布的缩放

    主要介绍三种方式: 首先创建一个index.html文件 <!DOCTYPE html> <html lang="en"> <head> < ...