从Vim命令行执行反向搜索时,为什么需要ENTER键?

时间:2019-06-14 06:26:58

标签: vim command-line-arguments

我正在尝试在文件上运行vim并执行搜索命令以将我带到正确的位置。

当我使用时:

vi myfile.py -c /print

它正确地将光标移到第一次出现的行(a)

但是,当我使用向后搜索选项时:

vi myfile.py -c ?print

似乎需要我先按 ENTER 才能继续:

"myfile.py" 470L, 19634C
Press ENTER or type command to continue

ENTER 后,它位于包含预期文本的最后一行,我不确定为什么我必须按 ENTER < / kbd>。

有没有办法做到这一点并立即显示正确的文字?


(a)这是另一个的谜。如果我在Vim中搜索,光标将位于该行的正确位置,而不是第一个非空白字符。我认为是因为它们被视为ex命令而不是vi命令(所以:/print而不是/print)。

2 个答案:

答案 0 :(得分:1)

只要您的搜索环绕文档,就会显示“搜索结果从上至下”,除非您的sshortmess中有:help 'shortmess'。如果您从第一行向后搜索,这种情况总是会发生,但是如果您向前搜索,则不会发生。

可能还会有其他消息;检查:messages以查看弹出的所有内容。当您无法在命令行高度(:help hit-enter)上容纳所有消息时,将显示“按Enter或键入命令以继续”(:help 'cmdheight'),并且Vim担心您会错过某些内容。

我相信当您向后搜索时,Vim会显示您的文件名,然后显示搜索环绕提示;并且您的cmdheight设置为1

您可以通过在Vimrc中使用set cmdheight=2(为两条消息腾出空间)或通过set shortmess+=s(不显示搜索环绕消息)来避免这种情况。第三种方法是在这种情况下显式地防止搜索环绕消息,而不是设置全局选项(:help :silent):vim myfile.py -c "silent ?print"


您正确的-c正在执行一个ex命令; -c /print实际上是在做:/print,而不是/print:help :/),这就是为什么您排在行首而不是比赛。

您可以通过显式使用常规模式搜索(help :normal)解决此问题。请注意,传递给:normal的每个命令都必须完整,否则将被取消,因此我们还需要包括最后一个Enter键:

vim myfile.py +"norm /print^M"

其中^M Ctrl-V Enter (我还将+用作-c命令的缩写行选项::help +cmd。)如果必须编写脚本,因此插入文字^M并不是很好,则也可以使用此(:help :execute)来使用Vim的键名(:help key-notation):

vim myfile.py +'exe "norm /print\<cr>"'

连同先前关于Enter的问题,您可以使用以下组合命令搜索最后一个print,直接登陆其上,而不必按Enter。这有点像怪物,所以如果您想经常使用它,您可能要制作一个bash函数,甚至是一个Vim函数:

vim myfile.py +'exe "sil norm ?print\<cr>"'

这里是Vim功能,您可以将其放入Vimrc:

function! g:norm_silently(what)
  exe "sil norm " . a:what . "\<cr>"
endfunction
command! -nargs=1 F call g:norm_silently(<q-args>)

您可以将其用作:

vim myfile.py +'F ?print'

答案 1 :(得分:0)

经过更多调查,问题中的脚注(a)似乎很关键。这些 确实是ex样式的命令,这就是为什么它们进入行首的原因。 $到最后一行,不是 G

此外,看起来实际上必须包装的任何命令都会导致需要 ENTER 键的行为。这包括(与问题相同)从第一行向后搜索或(在进一步测试中)从最后一行向后搜索:

vim myfile.py -c \$ -c /print

是实际的解决方案。如果最后一行不是保存您要查找的字符串的那一行,请使用$转到最后一行,然后使用?print向后搜索,将使您进入包含该字符串的最后一行,无需按 ENTER