假设我们正在编辑这个完全由 JSON 组成的文件:
[{
"id_4f7xg4egb": "<some_random_guid",
// ... other fields
}, {
"id_h34k3": "<another_id>",
// ... different fields than prev object potentially
"nested": {
"id_j3h": "<nested_obj_id>",
// ... nested obj fields
}
},
// ...
]
它包含 N 个对象(包括嵌套对象),我们想替换 id
带有附加到字段键本身的字符串的值。结果将类似于:
[{
"id": "4f7xg4egb",
// ... other fields
}, {
"id": "h34k3",
// ... different fields than prev object potentially
"nested": {
"id": "j3h",
// ... nested obj fields
}
},
// ...
]
现在,这是我在 VSCode 中使用多个游标所做的事情:
使用 VSCode Ctrl+d
- 选择第一次出现的
"id_
使用 Shift+→x4 - 选择(并在其上创建光标)剩余 N-1
"id_
的每一次出现使用 Ctrl+dx(N-1) - 选择
"id_
之后的 ID 字符串使用 →、←(取消选择)、Ctrl+Shift+→ - 用 Ctrl+x 剪切它们(是的,每个光标都有自己的“剪贴板”)
- 删除
_
使用退格键 - 用→x4,Shift+End,←选择我们要替换的部分(
"<every_diff_id>"
) kbd>x2 - 将值替换为 Ctrl+v 和 Esc 以去除多余的光标
所以我们谈论的是 5+N+5+2+1+8+3=N+24=o(N) 击键(考虑到这样一个事实,例如, Ctrl 键只计算一次,然后在其余 N-1 个 Ctrl+d 命令中按住。
借助 Vim 的力量
而且...我的问题是:如何使用 Vim 完成相同的结果(在 =< # of operations, ofc)?! 我是一个菜鸟,一个星期大的 vimmer,并且到目前为止我很喜欢它!我一直在使用 .
和用于类似任务的基本宏,但我不确定解决这个问题的最有效方法是什么 :(。我也更喜欢不使用插件或不涉及向我的 .vimrc 添加一些复杂的映射/函数的解决方案。毕竟,VSCode 解决方案是普通的 VSCode ;)。
谢谢!
最佳答案
我会通过两次直观的传递来完成,而不用担心计算击键次数或敲打挂钟。
第一关:
:g/id/norm f_s": "
- 使用
:global
在匹配模式的每一行上执行命令。 - 模式是
id
。 - 命令是
:normal
后跟一个普通模式宏。 - 宏观…
- 将光标移动到
f_
所在行的第一个_
, - 并将其替换为
": "
。
- 将光标移动到
请参阅 :help :global
、:help :normal
、:help f
和 :help s
.
第二遍:
:g//norm f:;C,
- 使用
:global
在匹配模式的每一行上执行命令。 - 模式相同,可以省略。
- 命令是
:normal
后跟一个普通模式宏。 - 宏观…
- 将光标移动到
:
所在行的第一个:
, - 然后重复移动到第二个
:
with;
, - 用
,
替换该行的其余部分。
- 将光标移动到
参见 :help ;
和 :help C
。
关于vim - VSCode Ctrl+D 的最佳 Vim 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65433837/