Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >无名寄存器

无名寄存器

作者头像
Masimaro
发布于 2022-06-05 02:38:29
发布于 2022-06-05 02:38:29
90700
代码可运行
举报
运行总次数:0
代码可运行

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

几种寄存器类型

无名寄存器

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("hello world")
print("")

改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("hello world")
print("")

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

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

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

有名寄存器

它是对应无名寄存器来说的,无名寄存器虽然说使用方便,但是有一个很大的问题,那就是如果我们连续两次执行了删除或者复制操作,那么前一次保存的内容将会被后一次的给覆盖掉。为了解决这个问题,一个思路就是使用有名寄存器。 vim中提供了由a到z的有名寄存器,可以在使用operator 的操作前面指定需要使用的寄存器,引用一个寄存器可以使用 " + 寄存器名的格式。这个时候我们之前的公式就又可以扩展了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
" + 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:复制粘贴的使用

假设我们要将如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("hello world")
print("hello vim")

修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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这样的形式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[oeasy]python024_vim读取文件_从头复制到尾_撤销_重做_reg_寄存器
oeasy
2024/07/08
1290
[oeasy]python024_vim读取文件_从头复制到尾_撤销_重做_reg_寄存器
Linux D02 VI编辑器_终端编辑器(重点重点重点)
在没有图形界面的环境下, 要编辑文件, vi是最佳选择 每一个使用linux的程序员,都应该或多或少的学习一些vi的常用命令
用户4870038
2021/02/05
1.2K0
Linux D02 VI编辑器_终端编辑器(重点重点重点)
[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位
oeasy
2024/05/04
1430
[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位
vim的介绍以及使用
vim: vim介绍 一般模式 在一般模式中,用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反(大多数编辑器默认模式为编辑模式)。
叶瑾
2018/06/14
4590
IDEA + Vim,竟可以这么牛逼!!
本教程并不是单纯的vim操作介绍,更多的是与Intellj Idea进行配合。需要同时具备Intellj Idea和vim使用基础的同学学习。
终码一生
2022/04/15
3.1K0
IDEA +  Vim,竟可以这么牛逼!!
vim常用复制粘贴命令
vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只是方向不同,比如:
用户1685462
2021/09/04
6.4K1
linux文本编辑器-VIM基本使用方法
+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首 vim + file 直接打开file,光标在最后一行
yuezhimi
2020/09/30
1K0
Vim常见命令(简洁精炼,干货)
基本步骤:1. vim hello.c 2. 键入i 3. 编辑 4. 键入[ESC] 5. 键入:wq保存退出
glm233
2020/09/28
9170
Vim常见命令(简洁精炼,干货)
深入了解Linux —— 学会使用vim编辑器
​ 首先,在Linux下安装软件,是在软件包服务器上查找对应软件,下载请求进行安装。
星辰与你
2024/12/29
3500
深入了解Linux —— 学会使用vim编辑器
vim实用笔记
安装插件管理器 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 到github仓库地址 查看使用方式 vim操作技巧 . 重复命令 . 命令重复上次的修改 什么是修改:除了普通模式中执行的修改命令之外,每次进入插入模式时,也会形成一次修改。从进入插入模式的那一刻起,直到返回普通模式为止,为一次修改。 将以下内容进行缩放 Line one Line two Line three Line fo
章鱼喵
2018/06/27
1.2K0
vim 快捷键技巧总结
vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim。
阳光岛主
2019/02/19
1.2K0
玩转vim(vi)编辑器
vi编辑器是Linux下的标准编辑器,vi编辑器并非只是用来写程序,还可以用来对一些配置文件进行编辑。vim是vi的加强版,我们一般使用vim对文件进行编辑。本文介绍了vim编辑器的三大模式,以及相应的命令,最后介绍了如何通过vim编辑器的配置文件.vimrc根据自己的需求对vim进行配置。
mindtechnist
2024/08/08
9350
玩转vim(vi)编辑器
vim 编辑器
VIM和vi的区别 vim是vi的加强版,支持多级撤销和语法高亮和自动补全。 Command Mode命令模式 vim的默认模式,编辑器等待输入命令 命令 作用 n 显示搜索命令定位到的下一个字符串 N 显示搜索命令定位到的上一个字符串 o 在光标所在的行下方插入一行并切换到输入模式 gg 将光标移动到文档开头 G 将光标移动到文档末尾 ZZ 文件将保存并退出vim 逐字符移动 h:光标向左移动 l:光标先右移动 j:光标向下移动 k:关闭向上移动 复制yank yy:复制光标所在整行 5yy: 复
羊羽shine
2019/05/29
9350
Vim 文本编辑工具详解
作为一名测试工程师,掌握高效的文本编辑工具是必不可少的。Vim 作为一个强大的文本编辑器,因其快捷键操作和强大的功能深受开发者的喜爱。本文将详细介绍 Vim 的基本使用方法和一些高级技巧。
霍格沃兹测试开发Muller老师
2024/07/22
1830
Vim 文本编辑工具详解
说实话,Intellij IDEA 自带的 Vim 插件真心不错。。。
在 IDEA Intellij小技巧和插件 一文中简单介绍了一下IdeaVim插件。在这里详细总结一下这个插件在日常编程中的一些常用小技巧。
芋道源码
2020/06/17
13.9K0
Linux 系统 vim 编辑器使用简明教程
vi(vim)是上Linux非常常用的代码编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim。
Debian中国
2018/12/20
1.7K0
vim复制粘贴_vim的复制粘贴
要完成vim中的内容复制到系统剪切板,需要vim支持 +clipboard,检查的方法(ubuntu16.04为例):
全栈程序员站长
2022/11/08
4.3K0
vim复制粘贴_vim的复制粘贴
Linux笔记:使用Vim编辑器
目录[-] Vi编辑器是Unix系统上早先的编辑器,在GNU项目将Vi编辑器移植到开源世界时,他们决定对其作一些改进。 于它不再是以前Unix中的那个原始的Vi编辑器了,开发人员也就将它重命名为Vi improved,或Vim。 为了方便使用,几乎所有Linux发行版都创建了一个名为vi的别名,指向vim程序。 Vim基础 Vim编辑器在内存缓冲区处理数据。只要键入vim命令和你要编辑的文件的名字,即可启动Vim编辑器。 如在启动Vim时未指定文件名,或者这个文件不存在,Vim会新开一段
jhao104
2018/03/20
1.6K0
从零开始匹配vim(2)——快捷键绑定
如果说 vim有什么最吸引人,我想vim允许你自由的定义各种快捷键算是一个原因吧。你可以通过绑定各种快捷键来使经常使用的功能更加便利。通俗的讲,快捷键映射就是我按下某个键,我想让vim将它当成另一个键,例如我按下 k,我想让vim把它当做 c 来使用(当然这么映射会把人逼疯)
Masimaro
2022/08/04
9000
从零开始匹配vim(2)——快捷键绑定
一篇就学会vim
学会一个软技能,总结一篇文章就够了。 剩下要做的就是不停的练习,不停的尝试,本文是在学习这个仓库之后的极简总结中。 主要作为一个备忘录使用。
六个周
2022/10/28
3.4K0
一篇就学会vim
相关推荐
[oeasy]python024_vim读取文件_从头复制到尾_撤销_重做_reg_寄存器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验