向前搜索在可视模式中选择的文本的[count]次出现

时间:2012-07-22 13:50:20

标签: vim

我想像在*命令一样搜索我在视觉模式中选择的模式。

我知道视觉模式yanking,它默认填充寄存器0,并且可以通过/然后 Ctrl - R搜索(检索)寄存器0的内容( Ctrl - R 0 )将模式粘贴为搜索范围。

事情是,我不想先YANK,我已经有一些东西被猛拉了,我只是想现在搜索在视觉模式中选择的内容。

我该怎么办呢?如果不摆弄不同的“猛烈注册N”技巧,我能做到吗?

3 个答案:

答案 0 :(得分:1)

如果您使用通过X支持构建的gvim或console vim(检查'guioption'是否可用)并且a中存在'guioptions',那么您可以从{{获得当前选择1}}注册。否则,我担心没有编写VimL函数就没有简单的方法可以做到这一点,VimL函数将根据*<标记的值提取选择。然后,该功能可以在搜索提示中与>一起使用。

答案 1 :(得分:1)

为什么不将您列出的所有步骤合并到映射中?唯一缺少的是保存和恢复未命名的寄存器,以及一点点转义。

" Atom \V sets following pattern to "very nomagic", i.e. only the backslash has special meaning.
" As a search pattern we insert an expression (= register) that
" calls the 'escape()' function on the unnamed register content '@@',
" and escapes the backslash and the character that still has a special
" meaning in the search command (/|?, respectively).
" This works well even with <Tab> (no need to change ^I into \t),
" but not with a linebreak, which must be changed from ^M to \n.
" This is done with the substitute() function.
" gV avoids automatic reselection of the Visual area in select mode.

vnoremap <silent> * :<C-U>let save_unnamedregister=@@<CR>gvy/\V<C-R><C-R>=substitute(escape(@@,'/\'),"\n",'\\n','ge')<CR><CR>:let @@=save_unnamedregister<Bar>unlet save_unnamedregister<CR>gV

答案 2 :(得分:0)

以下解决方案可让我*在视觉模式下使用[count]

vnoremap * :call <SID>VisualSearch()<cr>:set hls<cr>
fun! s:VisualSearch() range
   let unnamed = @"
   let repeat = v:count
   exe 'norm gv"zy' | let @/ = @z
   for x in range(repeat)
      call search(@/, 'ws')
   endfor
   let @" = unnamed
endfun

您将第5行的“z”更改为您从未使用的任何寄存器。