我正在尝试在文件上运行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
)。
答案 0 :(得分:1)
只要您的搜索环绕文档,就会显示“搜索结果从上至下”,除非您的s
(shortmess
中有: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 。