假设我有以下内容
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”三次,从而在随后的三行重复我们在第一行所做的一切。