【问题标题】:Vim Remove/Insert using Visual block select after a colonVim 在冒号后使用 Visual 块选择删除/插入
【发布时间】:2013-09-10 18:05:07
【问题描述】:

我有这段代码:

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

我想用user.替换:之后写的所有内容,所以我可以通过在user.之后添加nameemailpassword来完成代码。

fill_in "Name",with: user.name
fill_in "Email",with: user.email
fill_in "Password",with: user.password

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

更简单的选择是不用user. 替换它,而是用d$ 删除它;但是选择问题仍然存在。

我尝试了正常的Ctrl-V 选择,但由于: 字符被放置在每行的不同列中,我没有想要的行为。

谢谢

【问题讨论】:

    标签: vim editor vi


    【解决方案1】:

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

    :g/with:/norm yi"$"_ca"␣user.C-r"Escv``.u`

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

      • yi" (抽出第一个引用的值)
      • $ (移到行尾...)
      • "_ca" (更改引用的文字) ␣user. (以user.开头) C-r" (和最初被抽出的文本) Esc (完成)子>
      • v``.u` (小写粘贴的位)

    这可能是一个口味问题,但对我来说效果很好。

    复杂吗? 这里有个技巧:我实际上 所做的是在一行上执行编辑(使用 录制宏qq...q),然后

    :%norm @q
    

    将其应用于所有行

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

    【讨论】:

    • 出于某种原因,我几乎总是在宏之前想到正则表达式。
    • @FDinoff 因为你是程序员,可能吗? :/ 我也是,但我发现自己远离正则表达式,因为我学会了欣赏:g:v:%norm:t:m 和朋友的全部力量。我的意思是,:%>|%y +|undo 击败了 缩进、拉到 X 剪贴板并手动撤消整个缓冲区(猜猜我需要什么)
    • 我必须说我对'.的位置感到惊喜。由于使用了<c-r>,我没有意识到它的行为有所不同。我今天学了些新东西。谢谢你。一个可能的缺陷:gu`. 不会小写最后一个字符。使用guiw 之类的内容轻松修复。
    • @PeterRincker 很棒的地方。我修复了它(不是iw,因为它假设太多。相反,我现在使用v`.u
    • 很棒的回复!我将不得不了解宏和其他细节。我也会从这个中学到很多东西!
    【解决方案2】:

    这只会突出显示您希望它运行的行。

    非魔法正则表达式

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

    非常神奇的正则表达式

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

    这会在引号中捕获内容。因为这使用了\zs,所以匹配在冒号之后开始。所以冒号之后的所有内容都替换为user. 和引号中的任何内容的小写版本。 \L 将后面的字符串转换为小写形式。

    【讨论】:

    • 哇,这就像一个魅力。尽管我一直在寻找一种更简单的方法来实现这一目标。我相信一些像 TextMate 和 SublimeText 这样的编辑器可以在某个字符之后进行块选择。无论如何,谢谢你,我会从那个命令中学习!
    • 不错。它可以使用\m、\v` 或\V 来断言magic-ness。我提供了我自己的无正则表达式的答案(基于运动命令和重复命令)以进行良好的衡量:)
    【解决方案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
    

    我确信有几十种方法可以获得相同的结果。

    【讨论】:

    • guiw 假设里面的第一个 "" 是一个单词(用于小写)。只是说。
    • @sehe,你是对的。 guT. 足够通用吗?现在我想起来了,f"; 可以在给定的示例中替换为W
    • 我认为f"; 表达的意图更清晰,并且不那么脆弱。我刚刚修复了评论者在我的回答中使用v`.u 发现的问题:/
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多