初探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个粘贴搞定。不过异曲同工,目的达到了就行。