如何在Vim中删除可视选择中的单词

igetnqfo  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(293)

假设我有如下的输入,我想做的是在视觉上选择第2行到第4行(shift + v),然后删除单词dog。
我知道我可以在我的选择中使用类似:s/dog//的东西,但是我想知道是否有更直接的方法。
最终输出应为(仅受第2行到第4行的可视选择影响):

j2cgzkjk

j2cgzkjk1#

这不可能啊
为什么?

tl;dr

我认为,你是在想象视觉模式中的一个普通模式(这样你就可以在视觉模式中“像在Vim中一样移动和删除”)。
想一想:如果你可视地选择了一些行,那么 * 这些行 *,而不是其他的,就是你下一步所做的任何动作的对象(d,s,c,等等)。
但是你想对那些视觉选择的行采取行动,而不是对它们里面的单词采取行动。但是你怎么能告诉Vim对单词 dog 而不是对其他单词采取行动呢?你可以通过移动来做到这一点,但是只要你处于视觉模式,这是不可能的,因为任何移动都会改变视觉选择,而不允许你以某种方式在其中移动。
这意味着您需要放弃可视选择,以便可以移动到这些单词并将它们用作操作的文本对象。
如果你真的想从视觉选择开始,那么唯一的方法就是在视觉模式下给予你想对单词 dog 采取行动的信息,而这正是:s方法所做的。

ct2axkht

ct2axkht2#

您可以利用标记'<'>:它们存储可视选择的开始/结束位置,并且在您退出可视模式后保持其值。
在命令行模式下,按Ctrl-RCtrl-W可在光标下插入单词。
通过组合这些内容,可以创建如下所示的Map:

noremap <c-d> :'<,'>s/<c-r><c-w>//<cr>

然后使用它:

  • 首先用V选择想要的区域;
  • 按Esc退出可视模式;
  • 将光标移到要删除的单词下;
  • 然后触发Map,在本例中为Ctrl-D。
uz75evzq

uz75evzq3#

我认为没有办法用视觉选择来替换特定行中的特定单词,你也可以用sed来实现(参见#5)。
无论如何:这里有4种方法来删除文件中的单词dog和一种方法来做它与sed
1(带可视模式):
1.键入v进入可视字符模式
1.突出显示dog
1.按d删除
2(有替代和确认):

:%s/dog//gc

g代表全局
c代表确认
你会问每一个条目,做什么用。
3(有替代品):

:2,4s/dog//

4(带搜索模式):

/dog

键入:n用于下一个匹配
键入:d以删除匹配项
如需更多信息:Search and Replace
5(带sed):

sed 2,4\s/dog// filename
slmsl1lt

slmsl1lt4#

当您处于可视模式时,按下:会自动在命令行中插入可视范围,这样您在此之后使用的任何Ex命令都将在可视选择的行上起作用:

  1. :变成:'<,'>,其中'<,'>是从可视选择的第一行开始到可视选择的最后一行结束的范围。
    1.然后,可以执行s/dog<CR>(不需要//),将每个选定行的第一个dog替换为空。这实际上等效于执行:2,4s/dog<CR>
    从语义的Angular 来看,:s/dog<CR>与内置的“删除当前可视选择中的dog”特性非常接近,因此,除非进行一个假设的自定义Map,这样只会保存几次击键,否则您不太可能找到一种更“直接”的方法。

相关问题