VIM搜索前后重新选择搜索文本

时间:2012-08-09 15:30:24

标签: search vim select mapping find

当我选择文字并按F3时,我目前正在使用此功能,就像在Geany(我的旧编辑器)中一样:

vnoremap <silent> * :<C-U>
  \let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
  \gvy/<C-R><C-R>=substitute(
  \escape(@", '/\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR><CR>
  \gV:call setreg('"', old_reg, old_regtype)<CR>
vnoremap <silent> # :<C-U>
  \let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
  \gvy?<C-R><C-R>=substitute(
  \escape(@", '?\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR><CR>
  \gV:call setreg('"', old_reg, old_regtype)<CR>

当然,*用于搜索所选文本,#用于向后搜索所选文字。

我无法弄清楚的是如何在找到它们时重新选择找到的单词(或任何被选中的单词),这样我就可以继续按下*或{{1}继续搜索。因此,如果那不是我想要的并且想继续搜索,我不必重新选择它所发现的内容。

2 个答案:

答案 0 :(得分:2)

您添加v//e<CR>的解决方案有效,但它有将搜索结束到最后的副作用,这会影响其他命令,例如n / N。更好的选择是通过1v(或1vl 'selection'exclusive)重新建立当前位置的先前选择。

vnoremap <silent> * :<C-U>
\let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
\gvy/<C-R><C-R>=substitute(
\escape(@", '/\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR><CR>
\gV:call setreg('"', old_reg, old_regtype)<CR>1v
vnoremap <silent> / :<C-U>
\let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
\gvy?<C-R><C-R>=substitute(
\escape(@", '?\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR><CR>
\gV:call setreg('"', old_reg, old_regtype)<CR>1v

答案 1 :(得分:0)

GOT IT !!!在另一个与我相关的Stackoverflow问题上找到它,但很难找到。正确的用法是将其添加到每个查询的末尾:

<Esc>v//e<CR>

这将我带回正常模式,然后是视觉模式,然后重复上次搜索,然后选择结束。所以最终的代码是:

vnoremap <silent> * :<C-U>
  \let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
  \gvy/<C-R><C-R>=substitute(
  \escape(@", '/\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR><CR>
  \gV:call setreg('"', old_reg, old_regtype)<CR><Esc>v//e<CR>
vnoremap <silent> / :<C-U>
  \let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
  \gvy?<C-R><C-R>=substitute(
  \escape(@", '?\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR><CR>
  \gV:call setreg('"', old_reg, old_regtype)<CR><Esc>v//e<CR>

这为快速搜索选定区域提供了快速简便的方法!