您需要什么才能正确跳转到匹配的搜索结果?
要重现,请在运行vim -u NONE
后在其中创建一个宏,以确保没有vimrc干扰。您需要创建一个至少包含2行的文件,并将光标放在没有文本TEST_TEXT
的行上。
map x :norm gg/TEST_TEXT^MIthis
我的意图是,当我按x
时,它会转到文件的顶部,查找TEST_TEXT,然后将this
放在与搜索匹配的行的开头。 ^M
是一个文字换行符,使用CtrlQ + Enter按键实现。发生的事情是要么没有发生任何事情,要么将文本输入到与调用宏时相同的行上。
如果我只运行:norm gg/TEST_TEXT^MIthis
命令而不将其映射到密钥,则命令会成功执行。
我有一个最初更长的命令涉及一个单独的文件和tcomment插件,但我已经把它缩小到这个。
一旦我将其映射到某个键,将其拉出的正确顺序是什么?
答案 0 :(得分:2)
问题是^M
结束:normal
Ex命令,因此您的搜索命令将被中止而不是执行。然后Ithis
在:normal
之外执行。
事实上,你根本不需要:normal
。并且,使用带映射的特殊键表示法更容易,更易读:
:map x gg/TEST_TEXT<CR>Ithis
如果您真的想使用:normal
,则必须将其包含在:execute
中,如下所示:
:map x :exe "norm gg/TEST_TEXT\<lt>CR>Ithis"<CR>
:noremap
;它使映射不受重映射和递归的影响。:nnoremap
search()
等较低级别的功能。答案 1 :(得分:2)
有很多方法可以做到这一点,但这是我首选的方法:
nnoremap x :0/TEST_TEXT/norm! Itest<esc>
说明:
:{range}norm! {cmd}
- 在一系列行{cmd}
上执行常规命令{range}
。!
:normal
表示命令不会重新映射。0/TEST_TEXT
在第一行之前开始,然后找到第一个匹配的行。我目前的映射存在一些问题:
noremap
。您通常希望使用noremap
nnoremap
<cr>
表示法:normal
命令功能时,您正在使用ex
,例如范围。如需更多帮助,请参阅:
:h :map
:h :norm
:h range
答案 2 :(得分:1)
尝试这种映射:
nnoremap x gg/TEST_TEXT<cr>Ithis<esc>
请注意,如果您在此操作上映射x
,则会丢失原始的x
功能。