我想像在*
命令一样搜索我在视觉模式中选择的模式。
我知道视觉模式yanking,它默认填充寄存器0
,并且可以通过/
然后 Ctrl - R搜索(检索)寄存器0
的内容( Ctrl - R , 0 )将模式粘贴为搜索范围。
事情是,我不想先YANK,我已经有一些东西被猛拉了,我只是想现在搜索在视觉模式中选择的内容。
我该怎么办呢?如果不摆弄不同的“猛烈注册N”技巧,我能做到吗?
答案 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”更改为您从未使用的任何寄存器。