我想像使用*
命令一样搜索我在可视模式下选择的模式。
我知道0
默认情况下会填充寄存器的视觉模式拉动,以及仅搜索/
然后Ctrl- R(检索)寄存器0
(Ctrl- R,0)的内容以将模式粘贴为搜索的可能性。
问题是,我不想先 YANK,我已经有东西被拉了,我现在只想搜索在可视模式下选择的内容。
请问我该怎么做?我可以在不摆弄不同的“猛拉注册N”技巧的情况下做到这一点吗?
我想像使用*
命令一样搜索我在可视模式下选择的模式。
我知道0
默认情况下会填充寄存器的视觉模式拉动,以及仅搜索/
然后Ctrl- R(检索)寄存器0
(Ctrl- R,0)的内容以将模式粘贴为搜索的可能性。
问题是,我不想先 YANK,我已经有东西被拉了,我现在只想搜索在可视模式下选择的内容。
请问我该怎么做?我可以在不摆弄不同的“猛拉注册N”技巧的情况下做到这一点吗?
如果您使用带有 X 支持的 gvim 或控制台 vim(检查是否'guioption'
可用)并且a
存在于您'guioptions'
的*
. 否则,如果不编写 VimL 函数,恐怕没有简单的方法可以做到这一点,它将根据<
和>
标记的值提取选择。然后可以CTRL-R =
在搜索提示中使用该功能。
为什么不将您列出的所有步骤组合成一个映射?唯一缺少的是保存和恢复未命名的寄存器,以及一些转义。
" 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
这是适用于我在可视模式下*
使用的解决方案:[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”更改为您从不使用的任何寄存器。