vim - VSCode Ctrl+D 的最佳 Vim 替代品

标签 vim

假设我们正在编辑这个完全由 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+vEsc 以去除多余的光标

所以我们谈论的是 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/

相关文章:

haskell - 如何为有文化的 Haskell 编程设置 vim 缩进?

vim - 在 .vimrc 中,当光标在括号/大括号之间并按下回车键时起作用

vim - 在 vim 中查找并替换一个单词的实例

vim - 如何在 gVim 中进行拼写检查?

vim - 追加单词时将分隔的文本追加到Vim寄存器

vim 中的数学符号

bash - 如何让 Vim 从 shebang 行检测文件类型?

javascript - 如何跳转到vim中的Javascript函数定义?

windows - 在 Windows 上运行控制台应用程序时抑制命令窗口

vim - vim 中是否有任何 Ctrl - R 类型的命令搜索?