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

Why is ENTER needed when executing reverse search from Vim command line?

我正在尝试 运行 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

有没有办法做到这一点并立即找到正确的文本?


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

经过进一步调查,问题中的脚注(a)似乎是关键。这些 确实是 ex 风格的命令,这就是为什么它们会转到行首的原因。 $ 转到最后一行 而不是 G.

这一事实证明了这一点

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

vim myfile.py -c $ -c /print

才是真正的解决方案。如果最后一行不是包含您要查找的字符串的那一行,使用 $ 转到最后一行,然后使用 ?print 向后搜索将使您位于该字符串的最后一行,无需按 ENTER.

"search hit TOP, continuing at BOTTOM" 将在您的搜索环绕文档时显示,除非您的 shortmess (:help 'shortmess') 中有 s。如果您从第一行向后搜索,这将始终发生,但如果您向前搜索,则不会发生。

可能还有一些其他消息;检查 :messages 以查看弹出的所有内容。 "Press ENTER or type command to continue" (:help hit-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 的每个命令都必须完成,否则将被取消,因此我们还需要包括最后的回车键:

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

其中 ^MCtrl-VEnter (我也使用 + 作为-c 命令行选项的较短等效项::help +cmd。)如果你必须编写脚本,因此插入文字 ^M 不是很好,你也可以使用这个 (:help :execute) 才能使用 Vim 的键名 (:help key-notation):

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

连同上一期关于回车的问题,可以用下面的组合命令搜索最后一个print,直接登陆,不用回车。它有点像怪物,所以你可能想要制作一个 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'