假设我有如下输入:我要做的是直观地选择第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命令都将在可视选择的行上工作:
:
变为:'<,'>
,其中'<,'>
为从可视选择的第一行开始到可视选择的最后一行结束的范围。- 之后,您可以执行
s/dog<CR>
(不需要//
),将第一个dog
替换为每个选定行的空白。这相当于执行:2,4s/dog<CR>
。
从语义的角度来看,:s/dog<CR>
是与内置功能最接近的"在当前的视觉选择中删除dog
";因此,除非创建一个假设的自定义映射,它只会节省几个按键,否则您不太可能找到一个更"直接"的映射。方式。
那是不可能的。
为什么?
tl;博士
我想,你是在设想一个像视觉模式中的普通模式(这样你就可以像在Vim"中一样移动和删除)。当您处于可视模式时)。这样的事情是不存在的。
想想看:如果你在视觉上选择了一些行,那么这些行,而不是其他行,是你下一步操作的对象(d,s,c,或其他)。
但是您不想对这些视觉上选择的行执行操作,而是对其中的单词执行操作。但是如何告诉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):
- 输入
v
进入可视字符模式 - 高亮
dog
- 按d删除
2(带替换和确认):
:%s/dog//gc
g
代表全局
c
代表确认
你会被要求每一个条目,做什么。
3(带替代):
:2,4s/dog//
4(带搜索模式):
/dog
Type:n
for next match
Type:d
用于删除匹配
更多信息:搜索和替换
5 (with
sed
):
sed 2,4s/dog// filename