搜索:普通 vim 命令行为不当

问题描述 投票:0回答:2

这是在为 vim 编写脚本时弹出的。

使用有据可查的“:normal”命令:

:normal /abc  

不搜索字符串 abc。相反,之前的搜索字符串仍然处于活动状态(即突出显示、使用 n 跳转到等)。
更奇怪的是:abc 显示为 / 历史中的最新模式(即点击 /,然后点击向上箭头)。

为什么 abc 没有成为真正的搜索模式?

search vim
2个回答
6
投票

确实有详细记录的

:normal
命令的帮助文件说明如下:

如果

{commands}
未完成命令,则执行最后一个命令 将被中止,就像键入
<Esc>
<C-C>
一样。

当你写:,

:normal /abc

您尝试执行未完成的命令。事实上,在插入模式下输入“

/abc
”后,您还应该按“Enter”(即
<CR>
)。这种情况不会发生,但是根据手册,按下了
<Esc>

要通过命令搜索,您应该使用:.

:exec "/abc"

0
投票

完成命令

P Shved 是正确的,如果命令未完成,它将被中止。但你可以完成命令。您需要提供 Enter 键击,就像手动执行搜索一样。但是,仅按

Enter
键是行不通的,因为它将执行普通命令,而不是将其添加到您正在执行的命令中 with 正常。

使用

Ctrl-V Enter
将文字 Enter 添加到命令中(显示为
^M
。请参阅
:h i_CTRL-V
)。您不能像使用映射一样使用
<Enter>
<CR>

:normal /abc^M

这将执行搜索,如果您在搜索后向正常命令添加更多内容,则从搜索匹配处开始执行命令的其余部分。

意想不到的结果

这样做可能无法获得所需的结果,因为搜索会找到当前行之外的示例。例如,假设您在视觉模式下选择了下面文本的前 3 行。

example text  " <--- Visual Selection
sample text   " <---
more words    " <---
text test

执行以下命令将删除第 1、2 和 4 行上的单词

text
,即使在可视模式下未选择 4。

:'<,'>norm /text^Mdw

要仅影响范围内的行,您需要将搜索限制为当前行,请使用以下命令(请参阅

:h \%l
):

:'<,'>norm /\%.ltext^Mdw

这会限制搜索光标所在行,并且只会删除上例中前两行的

text

© www.soinside.com 2019 - 2024. All rights reserved.