Vim - 猛进搜索注册

时间:2010-02-22 17:44:11

标签: vim editor vi

有没有简单/快捷的方法可以“猛烈”进入vim的“最后搜索”注册表(“/)?

从vim文档中可以看出答案是否定的,但可以通过“let”命令进行分配:

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

理想情况下,我想做的是:

"/5yw

这将会拉动光标下的下5个单词&把它们放在最后一个搜索缓冲区

或者,如果有办法搜索命名寄存器的内容,那也可以。换句话说,如果我能做到:

"A5yw

然后搜索寄存器A中的内容,这也可以。

我最接近的是抓到一个命名寄存器&然后将该寄存器复制到最后一个搜索寄存器中,例如

"A5yw
:let @/=@A

冒着长问题的风险,我想说的是,我并不总是5个字,我想“抽搐和搜索” - 有时它是17个字符,有时它是在行的末尾,等...所以一个硬编码的宏不能给我我想要的灵活性。

5 个答案:

答案 0 :(得分:97)

/输入搜索字符串后,您可以使用Ctrl-R然后键入代表您要使用的寄存器的字母。

例如。

  • 首先,"Ayw将一个单词划入注册A
  • 然后,/ ^R A将寄存器A的内容放入搜索字符串。

答案 1 :(得分:30)

如果您没有使用任何寄存器来存储被拽的文本,则vim使用0注册。您可以在Ctrl-R 0之后键入/来搜索该内容。

一个更复杂的例子。假设您要在另一个缓冲区中搜索当前位于光标下的引号内的文本:

  • 您可以使用yi"(yank inner quote)
  • 执行此操作
  • 转到要搜索的缓冲区
  • 输入/Ctrl-R 0

答案 2 :(得分:9)

我正在使用以下代码:

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction

答案 3 :(得分:5)

所以基本上是#和*命令的扩展版本,对吗?听起来你想要定义一个自定义操作符(一个需要运动的命令)。我从来没有真正做到这一点,但我找到了plugin,看起来它可能会更容易这样做。提供了一些例子。

答案 4 :(得分:4)

搜索选择:

如果你想首先抽出一行的一部分,那么使用&#34; v&#34;然后用光标移动,直到你标记了你想要的东西,然后按y选择yank,现在选择位于寄存器0

然后,您可以输入/Ctrl-R 0