初探vim中的寄存器与宏

2024-4-18|2024-4-18
夜火/xloong
夜火/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 将光标移动到前一个字符,不要
当然,对于这样简单的选择,也可以直接使用 vwhvt!,和上面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 开始录制宏到寄存器a
q结束录制宏
@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个粘贴搞定。不过异曲同工,目的达到了就行。
快速完成、粗糙或敷衍的代码是什么样的Next.js 初体验