VSCode Ctrl+D 的最佳 Vim 替代品

joe*_*iga 5 vim

假设我们正在编辑这个完全组成的 JSON 文件:

\n
[{\n  "id_4f7xg4egb": "<some_random_guid",\n  // ... other fields\n}, {\n  "id_h34k3": "<another_id>",\n  // ... different fields than prev object potentially\n  "nested": {\n    "id_j3h": "<nested_obj_id>",\n    // ... nested obj fields\n  }\n},\n// ...\n]\n
Run Code Online (Sandbox Code Playgroud)\n

它包含 N 个对象(包括嵌套的对象),我们想要替换id附加到字段键本身的字符串替换该值。结果会是这样的:

\n
[{\n  "id": "4f7xg4egb",\n  // ... other fields\n}, {\n  "id": "h34k3",\n  // ... different fields than prev object potentially\n  "nested": {\n    "id": "j3h",\n    // ... nested obj fields\n  }\n},\n// ...\n]\n
Run Code Online (Sandbox Code Playgroud)\n

现在,我将在 VSCode 中使用多个游标执行以下操作:

\n

使用 VSCode Ctrl +d

\n
    \n
  • "id_使用Shift+选择第一个出现的位置\xe2\x86\x92 x4
  • \n
  • "id_使用Ctrl+选择(并在其上创建光标)剩余 N-1 的每个出现位置d x(N-1)
  • \n
  • 选择 id 字符串,后跟"id_, \xe2\x86\x92\xe2\x86\x90取消选择), Ctrl+Shift +\xe2\x86\x92
  • \n
  • Ctrl用+剪切它们x(是的,每个光标都有自己的“剪贴板”)
  • \n
  • 删除_Backspace
  • \n
  • 选择我们想要将 ( "<every_diff_id>") 替换为\xe2\x86\x92x4、Shift+ End\xe2\x86\x90 x2
  • \n
  • 将值替换为Ctrl+vEsc删除多余的光标
  • \n
\n

所以我们讨论的是 5+N+5+2+1+8+3= N+24=o(N)次击键(考虑到这样的事实,例如,该Ctrl键仅计算一次,然后按住其余的 N-1 Ctrl+d命令)。

\n

借助 Vim 的力量

\n

而且...我的问题是:如何使用 Vim 实现相同的结果(在 =< 操作数,ofc 中)?!我是一个菜鸟,只有一周大的 vimmer,到目前为止我很喜欢它!我一直在使用.基本宏来完成类似的任务,但我不确定解决这个问题的最有效方法是什么:(。我也更喜欢一种不使用插件或涉及添加一些复杂的解决方案映射/函数到我的 .vimrc。毕竟,VSCode 解决方案是普通的 VSCode ;)。

\n

谢谢!

\n

fil*_*den 4

通过录制宏并重放 N 次。

例如:

qa/"id_/e<CR>s": "<Esc>f:dt,q2@a
Run Code Online (Sandbox Code Playgroud)

总共 25 次击键。

分解一下:

  • qa:开始录制宏@a
  • /"id_/e:搜索花样id_并将光标置于花样末尾。执行<CR>搜索。
  • s:替换光标下的字符(_),启动插入模式。然后用作": "替换文本(产生"id": "...<Esc>叶子插入模式。
  • f:前进至:后场。dt,: 删除直到逗号(保留它。)
  • q:停止录制宏。
  • 2@a:执行宏@a两次。(如果有更多 id 需要替换,请执行更多次。用于999@a最多执行 999 次,或者直到出现错误,以先到者为准。)

我同意多个光标非常直观,可能更容易掌握...Vim 宏可能有些抽象,需要您考虑这些操作会对您应用宏的其他位置执行什么操作...

对于这种特殊情况,也许使用:s命令会更容易。但这是 Vim 的一件好事,解决一个问题通常有多种方法,你可以选择你喜欢的一种。