为什么从 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"
其中 ^M
是 Ctrl-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'
我正在尝试 运行 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"
其中 ^M
是 Ctrl-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'