如何在mapped:normal命令中跳转到搜索?

时间:2014-01-03 21:46:13

标签: vim

您需要什么才能正确跳转到匹配的搜索结果?

要重现,请在运行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插件,但我已经把它缩小到这个。

一旦我将其映射到某个键,将其拉出的正确顺序是什么?

3 个答案:

答案 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>

奖金提示

  • You should use :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功能。