Vim在冒号后使用Visual块选择删除/插入

时间:2013-09-10 18:05:08

标签: vim editor vi

我有这段代码:

fill_in "Name",with: "John"
fill_in "Email",with: "user@example.com"
fill_in "Password",with: "supersafe"

我想用:替换user.之后写的所有内容,因此我只需添加nameemail和{{1}即可完成代码},相应地在password

之后
user.

此外,一种方式(可能是一个vim插件?)从所选择的视觉块的一行导航到另一行当然是最佳的,虽然不是这里的要点。

更简单的选择是用fill_in "Name",with: user.name fill_in "Email",with: user.email fill_in "Password",with: user.password 替换它,而不是用user.替换它;然而选择问题仍然存在。

我使用正常的d$选项进行了尝试,但由于Ctrl-V字符位于每行的不同列中,因此我没有所需的行为。

感谢

3 个答案:

答案 0 :(得分:5)

或者,如果(像我一样)你更喜欢使用你手动编辑的命令,而不是输入疯狂的正则表达式:

  

:g/with:/norm yi"$"_ca"␣user. C-R " Esc v``.u`

  1. g:/with:/(适用于包含“with:”的所有行(如果缓冲区不包含其他行,这实际上是可选的)
  2. norm正常模式下的以下“键”:

    • yi" (抽出第一个引用的值)
    • $ (移至行尾...)
    • "_ca" (更改引用的文字) ␣user. (以user.开头) Cr " (以及最初被拽的文字) Esc (已完成)
    • v``.u` (小写粘贴位)
  3. 这可能是一个品味问题,但对我来说效果很好。

    复杂?这是一个技巧: 实际上 做了什么,是在一行上执行编辑(用录制宏) qq ... q ),然后

    :%norm @q
    

    将其应用于所有行

    演示:(注意它仍然使用gu``。instead of v \``.u

    enter image description here

答案 1 :(得分:3)

这样可以突出显示您希望它运行的行。

非魔法正则表达式

s/.\{-}"\(.\{-}\)".\{-}:\zs.*/ user.\L\1/g

非常神奇的正则表达式

s/\v.{-}"(.{-})".{-}:\zs.*/ user.\L\1/g

这会在引号中捕获该内容。由于这使用\zs冒号后的匹配开始。所以冒号之后的所有内容都被user.替换为引号中的小写版本。 \L将字符串转换为小写版本。

答案 2 :(得分:3)

只是为了好玩,另一个宏:

qq     start recording in register q
0      go to the first column
yi"    yank the content of the first pair of quotes
f";    jump to the next pair of quotes
"_c$   change until the end of line, sending the previous text to the black hole register
user.  insert user.
<C-r>" insert the content of the default register
<Esc>  exit insert mode
guiw   change the case of the word under the cursor
q      stop recording

我确信有很多方法可以获得相同的结果。