初探vim中的寄存器与宏
2024-4-18|2024-4-18
夜火/xloong
type
Post
status
Published
date
Apr 18, 2024
slug
exploring-registers-and-macros-in-vim
summary
最近需要对一个项目做i18n,需要对很多字符串进行替换,总是复制来复制去的,很繁琐。
win+v 一定程度上缓解了来回找内容复制的问题,但是仍然不够方便。
于是想到了使用vim的命名寄存器来粘贴固定内容,后来想起了vim可以录制宏,可以替我做更多的工作,于是恶补了下这部分的知识。
tags
开发
category
技术分享
icon
password
URL
Property
Apr 18, 2024 06:46 AM
最近需要对一个项目做i18n,需要对很多字符串进行替换,总是复制来复制去的,很繁琐。
win+v 一定程度上缓解了来回找内容复制的问题,但是仍然不够方便。
于是想到了使用vim的命名寄存器来粘贴固定内容,后来想起了vim可以录制宏,可以替我做更多的工作,于是恶补了下这部分的知识。
之前仅仅是知道寄存器的概念和宏录制这个东西,从来没用过,这次记录下,方便以后查。
前置知识
vim中的选择,复制,粘贴。
vim中的选择
选择到指定字符 vf vt
xxx,欢迎您!
想选择
欢迎您移动光标到
欢处normal模式下
依次输入
vf!h,命令解释:
1. v 选择模式
2. f! 查找指定的字符!,这里选择模式下就是选择到 ! 包含了 !
3. h 将光标移动到前一个字符,不要 !当然,对于这样简单的选择,也可以直接使用
vwh,vt!,和上面vf!h的选择效果是一样的。这里的
vt 不需要使用h,因为不包含最后的!。选择html标签内部的内容 vit
<p>你好,欢迎您!</p>
想选择
你好,欢迎您!,即为p标签中的内容。可以像上面说的,直接使用
vf! 或 vf<h 都可以也可以让光标移动到这一行中的任意一处,然后输入
vit,这是针对html标签的,直接选择html标签内部的内容。选择单引号中的内容 vi'
<p>你好,'某某用户',欢迎您!</p>
想选择
某某用户,移动光标到 某某用户,然后输入 vi',即可选择单引号中的内容,不包含单引号。想包含单引号,可以使用
va'对于双引号
vi",括号vi)等,操作都类似,不再赘述。vim中的复制
yy是复制整行y 是复制标记内容配合上面的选择,就可以复制指定内容了。
如最开始的例子,想复制
欢迎您,移动光标到 欢,然后依次输入 vf!hy,即可复制 欢迎您。这是选择期间可视化的,如果命令很熟,可以使用
yt!,用y复制代替v选择,直接就复制好了,简化操作。删除同理,
dt!vim中的粘贴
p是粘贴,P是粘贴到光标所在行的前面。需要注意的是:vim中的复制粘贴都是操作的寄存器,而不是系统的剪贴板。
寄存器
无名寄存器(默认寄存器),引用方式为
"",""p为粘贴无名寄存器的值,所有的复制和修改操作(x、s、d、c、y)都会将该数据复制到无名寄存器0 为复制专用寄存器,引用方式为
"0,"0p为粘贴寄存器0的值1-9 为逐级临时缓存寄存器,引用方式为
"1,"1p为粘贴寄存器1的值在新的数据加入时,逐级向后推移。1 的数据复制到 2,2 的复制到 3,最后的 9 寄存器内容将会被删除
a - z 或 A - Z 为字母寄存器,引用方式同上。选中内容后,
"ay 为将选中内容复制到 a 寄存器查看寄存器
:reg 查看所有寄存器:reg a 查看寄存器a的内容宏录制
qa 开始录制宏到寄存器aq结束录制宏@a执行宏a@@重复执行宏实际使用
假设我现在有一个处理i18n的函数
i18n(key)<?php echo i18n('key'); ?>
我先将这部分内容放入寄存器
a,选中后"ay假设我现有内容需要替换
<div>原文字内容</div>
最终想要的格式为
<div><?php echo i18n('原文字内容'); ?></div>
录制宏
我现在需要录制一个宏放入寄存器w,开启录制宏
qw光标移动到
原字上,在原字前,粘贴寄存器a的内容
"aP操作后如下
<div><?php echo i18n('key'); ?>原文字内容</div>
光标后移一位,将光标放到
原字上
l选择文字到字符
<vf<光标向前一位,不框选
<h删除
原文字内容(删除会自动将内容复制到无名寄存器)
x<div><?php echo i18n('key'); ?></div>
将光标移动到
'key'中任意位置,选中内容keyvi'粘贴
p<div><?php echo i18n('原文字内容'); ?></div>
完成宏录制
q使用宏
<div>这样格式的文字内容</div>
现在,碰到任何这样格式的内容,我只需要将光标移动到第一个文字上,执行寄存器w中的宏即可
@w<div><?php echo i18n('这样格式的文字内容'); ?></div>
之前需要不停来回复制粘贴复制粘贴的内容,一下变得操作起来轻松又愉快了。
优化
为了更好的说明,我上面的录制操作,步骤稍微多了点。
其实可以先
vit,选择标签中间的内容,x删除(复制),再粘贴代码进行替换,甚至使用命名寄存器将代码分成2部分存储,直接3个粘贴搞定。不过异曲同工,目的达到了就行。