2

我想像使用*命令一样搜索我在可视模式下选择的模式。

我知道0默认情况下会填充寄存器的视觉模式拉动,以及仅搜索/然后Ctrl- R(检索)寄存器0Ctrl- R0)的内容以将模式粘贴为搜索的可能性。

问题是,我不想先 YANK,我已经有东西被拉了,我现在只想搜索在可视模式下选择的内容。

请问我该怎么做?我可以在不摆弄不同的“猛拉注册N”技巧的情况下做到这一点吗?

4

3 回答 3

1

如果您使用带有 X 支持的 gvim 或控制台 vim(检查是否'guioption'可用)并且a存在于您'guioptions'*. 否则,如果不编写 VimL 函数,恐怕没有简单的方法可以做到这一点,它将根据<>标记的值提取选择。然后可以CTRL-R =在搜索提示中使用该功能。

于 2012-07-22T14:18:12.183 回答
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
于 2012-07-22T14:45:49.490 回答
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

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

于 2012-07-22T19:56:10.670 回答