假设我有如下的输入,我想做的是在视觉上选择第2行到第4行(shift + v),然后删除单词dog。我知道我可以在我的选择中使用类似:s/dog//的东西,但是我想知道是否有更直接的方法。最终输出应为(仅受第2行到第4行的可视选择影响):
:s/dog//
j2cgzkjk1#
这不可能啊为什么?
tl;dr
我认为,你是在想象视觉模式中的一个普通模式(这样你就可以在视觉模式中“像在Vim中一样移动和删除”)。想一想:如果你可视地选择了一些行,那么 * 这些行 *,而不是其他的,就是你下一步所做的任何动作的对象(d,s,c,等等)。但是你想对那些视觉选择的行采取行动,而不是对它们里面的单词采取行动。但是你怎么能告诉Vim对单词 dog 而不是对其他单词采取行动呢?你可以通过移动来做到这一点,但是只要你处于视觉模式,这是不可能的,因为任何移动都会改变视觉选择,而不允许你以某种方式在其中移动。这意味着您需要放弃可视选择,以便可以移动到这些单词并将它们用作操作的文本对象。如果你真的想从视觉选择开始,那么唯一的方法就是在视觉模式下给予你想对单词 dog 采取行动的信息,而这正是:s方法所做的。
:s
ct2axkht2#
您可以利用标记'<和'>:它们存储可视选择的开始/结束位置,并且在您退出可视模式后保持其值。在命令行模式下,按Ctrl-RCtrl-W可在光标下插入单词。通过组合这些内容,可以创建如下所示的Map:
'<
'>
noremap <c-d> :'<,'>s/<c-r><c-w>//<cr>
然后使用它:
V
uz75evzq3#
我认为没有办法用视觉选择来替换特定行中的特定单词,你也可以用sed来实现(参见#5)。无论如何:这里有4种方法来删除文件中的单词dog和一种方法来做它与sed:1(带可视模式):1.键入v进入可视字符模式1.突出显示dog1.按d删除2(有替代和确认):
sed
v
dog
:%s/dog//gc
g代表全局c代表确认你会问每一个条目,做什么用。3(有替代品):
g
c
:2,4s/dog//
4(带搜索模式):
/dog
键入:n用于下一个匹配键入:d以删除匹配项如需更多信息:Search and Replace5(带sed):
n
d
sed 2,4\s/dog// filename
slmsl1lt4#
当您处于可视模式时,按下:会自动在命令行中插入可视范围,这样您在此之后使用的任何Ex命令都将在可视选择的行上起作用:
:
:'<,'>
'<,'>
s/dog<CR>
//
:2,4s/dog<CR>
:s/dog<CR>
4条答案
按热度按时间j2cgzkjk1#
这不可能啊
为什么?
tl;dr
我认为,你是在想象视觉模式中的一个普通模式(这样你就可以在视觉模式中“像在Vim中一样移动和删除”)。
想一想:如果你可视地选择了一些行,那么 * 这些行 *,而不是其他的,就是你下一步所做的任何动作的对象(d,s,c,等等)。
但是你想对那些视觉选择的行采取行动,而不是对它们里面的单词采取行动。但是你怎么能告诉Vim对单词 dog 而不是对其他单词采取行动呢?你可以通过移动来做到这一点,但是只要你处于视觉模式,这是不可能的,因为任何移动都会改变视觉选择,而不允许你以某种方式在其中移动。
这意味着您需要放弃可视选择,以便可以移动到这些单词并将它们用作操作的文本对象。
如果你真的想从视觉选择开始,那么唯一的方法就是在视觉模式下给予你想对单词 dog 采取行动的信息,而这正是
:s
方法所做的。ct2axkht2#
您可以利用标记
'<
和'>
:它们存储可视选择的开始/结束位置,并且在您退出可视模式后保持其值。在命令行模式下,按Ctrl-RCtrl-W可在光标下插入单词。
通过组合这些内容,可以创建如下所示的Map:
然后使用它:
V
选择想要的区域;uz75evzq3#
我认为没有办法用视觉选择来替换特定行中的特定单词,你也可以用
sed
来实现(参见#5)。无论如何:这里有4种方法来删除文件中的单词dog和一种方法来做它与
sed
:1(带可视模式):
1.键入
v
进入可视字符模式1.突出显示
dog
1.按d删除
2(有替代和确认):
g
代表全局c
代表确认你会问每一个条目,做什么用。
3(有替代品):
4(带搜索模式):
键入:
n
用于下一个匹配键入:
d
以删除匹配项如需更多信息:Search and Replace
5(带
sed
):slmsl1lt4#
当您处于可视模式时,按下
:
会自动在命令行中插入可视范围,这样您在此之后使用的任何Ex命令都将在可视选择的行上起作用::
变成:'<,'>
,其中'<,'>
是从可视选择的第一行开始到可视选择的最后一行结束的范围。1.然后,可以执行
s/dog<CR>
(不需要//
),将每个选定行的第一个dog
替换为空。这实际上等效于执行:2,4s/dog<CR>
。从语义的Angular 来看,
:s/dog<CR>
与内置的“删除当前可视选择中的dog
”特性非常接近,因此,除非进行一个假设的自定义Map,这样只会保存几次击键,否则您不太可能找到一种更“直接”的方法。