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


0

说我有以下内容

DRAFT,
SAVED,
ARCHIVED,
DELETED;

我想要以下内容:

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

我怎么能用vim做到这一点?我猜我可以使用视觉模式?

我意识到我可以用sed很容易地做到这一点,但我对任何可以做到这一点的方式感兴趣而不用离开vim。


好吧,sedVim使用非常相似的正则表达式,所以...你会做sed什么?
罗曼

Answers:


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

似乎做你要求的。

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

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

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


这似乎不起作用。它似乎无法匹配单词。可能是因为他们从空白开始。我应该提到这一点。相反,命令前置(“”)到每行的开头,并没有删除实际的单词。
实际上是在

如果我稍微修改它以添加空格字符,它会更接近但不完全。:16,20s / \ s * [AZ] * /&(“\ L&”)/我如何修改它,以便在我们在括号内插入单词时忽略空格?
实际上是在

在我原来的命令
parkydr 2013年

s/ *\([A-Z]*\)/\1("\L\1")/而是使用忽略前导空格。或领导任何事情。在这种情况下,\( \)创建一个编号的捕获组\1
jpaugh 2013年

试试我的最新回答
parkyd

0

对于喜欢红宝石的人:

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

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

$ _ [ - 1] - >“,”或“;”


0

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

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

用这种方式打字要少得多,并且不需要你记住vim的正则表达式语法。通常,使用宏进行这种文本转换比使用替换命令要快得多。

打破我的解决方案:

  • qa 开始将宏记录到寄存器'a'中。
  • ye 从光标的当前位置到字的末尾,将它存入“0和0”寄存器。(我只能通过0寄存器访问它,但它实际上存储在两者中)
  • e 将光标移动到单词的末尾
  • a 在光标之后进入插入模式(所以在单词和逗号之间)
  • 接下来我输入一些标准文本。有趣的是<C-R>0。在插入模式中,<C-R>n表示“插入寄存器n中的文本”。如果我正常地执行此任务(而不是以文本形式向其他人解释),我实际上<C-R>"在这里使用,但是0更容易在视觉上区别于文字“围绕它的人物。
  • <ESC>将我们恢复到正常模式。光标现在在结束时),这是我们在插入模式下输入的最后一个字符。
  • v 进入视觉模式。
  • %将光标跳回到与我们当前所在的近括号匹配的左括号,因此我们的视觉选择现在涵盖了字符串("DRAFT")
  • gu将视觉选择的字符串转换为小写。这对视觉选择中的括号或引号没有影响。
  • + 将光标前进到下一行的开头,准备再次运行同一组命令。
  • q 完成录制宏。
  • 3@a 运行我们的宏'a'三次,从而重复我们在后续三行的第一行上所做的一切。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.