Vim 在多行的逗号前插入字符

Vim 在多行的逗号前插入字符

假设我有以下内容

DRAFT,
SAVED,
ARCHIVED,
DELETED;

我想要的是以下内容:

DRAFT("draft"),
SAVED("saved"),
ARCHIVED("archived"),
DELETED("deleted");

我该如何使用 vim 来实现这一点?我猜我可以使用可视块模式?

我意识到我可以轻松地用 sed 做到这一点,但我对不离开 vim 即可做到这一点的任何方法都很感兴趣。

答案1

:%s/\v(\w*)([,;])/\1("\L\1")\2

似乎按照你的要求去做。

  • \v减少反斜杠的数量
  • (\w*)第一组,任意数量的“单词”字符
  • ([,;])第二组,,;
  • \1重复使用第一组
  • ("\L\1")引号和括号之间的第一组小写
  • \2第二组

答案2

:1,$s/\<\(\w*\)\>/\1("\L\1")/

这会找到一个单词\<(w*\)\>,然后将其按原样\1小写\L\1

答案3

对于喜欢 ruby​​ 的人来说:

:rubydo x = $_[0..-2] ; $_ = "#{x}(\"#{x.downcase}\")#{$_[-1]}"

x = $_[0..-2] -> 不保存最后一个字符 (, 或 ;)

$_[-1] -> "," 或 ";"

答案4

我自己会用宏来做这件事。假设光标在第一行的开头:

qqyeea("<C-R>0")<ESC>v%gu+q3@a

这样输入的字数就少多了,而且不需要记住 vim 的正则表达式语法。通常,使用宏进行这种文本转换比使用替换命令要快得多。

分解我的解决方案:

  • qa开始将宏录制到寄存器“a”中。
  • ye从光标当前位置提取到单词末尾,并将其存储到 " 和 0 寄存器中。(我只通过 0 寄存器访问它,但实际上它会存储在这两个寄存器中)
  • e将光标移动到单词末尾
  • a在光标后进入插入模式(即在单词和逗号之间)
  • 接下来我输入一些标准文本。有趣的是<C-R>0。在插入模式下,<C-R>n表示“插入寄存器 n 中的文本”。如果我正常执行此任务(而不是以文本形式向其他人解释),我实际上会<C-R>"在这里使用,但从0视觉上更容易将其与周围的文字“字符区分开来。
  • <ESC>返回正常模式。光标现在位于结束的 ) 上,这是我们在插入模式下输入的最后一个字符。
  • v进入视觉模式。
  • %将光标跳回到与我们当前所在的右括号匹配的左括号,因此我们的视觉选择现在覆盖了字符串("DRAFT")
  • gu将视觉选定的字符串转换为小写。这对视觉选定内的括号或引号没有影响。
  • +将光标前进到下一行的开头,准备再次运行同一组命令。
  • q完成宏的录制。
  • 3@a运行我们的宏“a”三次,从而在随后的三行重复我们在第一行所做的一切。

相关内容