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



假设我有如下输入:我要做的是直观地选择第2行到第4行(shift + v),然后删除单词dog。

我该怎么做呢?我知道我可以在我的选择中使用:s/dog//之类的东西,但我想知道是否有更直接的方法。

1 The quick brown dog
2 dog jumps
3 over the
4 lazy dog,
5 but it should be just a fox.

最终输出应该是(仅受第2行到第4行视觉选择的影响):

1 The quick brown dog
2  jumps
3 over the
4 lazy ,
5 but it should be just a fox.

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

  1. :变为:'<,'>,其中'<,'>为从可视选择的第一行开始到可视选择的最后一行结束的范围。
  2. 之后,您可以执行s/dog<CR>(不需要//),将第一个dog替换为每个选定行的空白。这相当于执行:2,4s/dog<CR>

从语义的角度来看,:s/dog<CR>是与内置功能最接近的"在当前的视觉选择中删除dog";因此,除非创建一个假设的自定义映射,它只会节省几个按键,否则您不太可能找到一个更"直接"的映射。方式。

那是不可能的。

为什么?


tl;博士

我想,你是在设想一个像视觉模式中的普通模式(这样你就可以像在Vim"中一样移动和删除)。当您处于可视模式时)。这样的事情是不存在的。


想想看:如果你在视觉上选择了一些行,那么这些行,而不是其他行,是你下一步操作的对象(dsc,或其他)。

但是您不想对这些视觉上选择的行执行操作,而是对其中的单词执行操作。但是如何告诉Vim对dog这个词采取行动,而不是对其他词呢?你可以通过移动来做到这一点,但只要你处于视觉模式,那是不可能的,因为任何移动都会改变视觉选择,而不允许你在其中移动。

这意味着您需要放弃视觉选择,以便您可以移动到这些单词,并将它们用作操作的文本对象。

如果你真的想从视觉选择开始,那么给出你想要对dog这个词采取行动的信息的唯一方法,就是在视觉模式下把它们打出来。而这正是:s方法所做的。

您可以利用标记'<'>:它们存储可视选择的开始/结束位置,并在退出可视模式后保持其值。

在命令行模式下,Ctrl-RCtrl-W将单词插入光标下。

通过组合这些,您可以创建如下的映射:
noremap <c-d> :'<,'>s/<c-r><c-w>//<cr>

然后使用:

  • 首先用V选择需要的区域;
  • Esc退出可视模式;
  • 将光标移动到要删除的单词下面;
  • 然后触发映射,在本例中是Ctrl-D

我认为没有办法用视觉选择来代替特定行中的特定单词。你也可以使用sed(看看#5)。

无论如何:下面是删除文件中dog这个词的4种方法,其中一种方法是使用sed:

1 (with visual mode):

  1. 输入v进入可视字符模式
  2. 高亮dog
  3. 按d删除

2(带替换和确认):

:%s/dog//gc

g代表全局

c代表确认

你会被要求每一个条目,做什么。

3(带替代):

:2,4s/dog//

4(带搜索模式):

/dog

Type:nfor next match

Type:d用于删除匹配

更多信息:搜索和替换

5 (withsed):

sed 2,4s/dog// filename

最新更新