0

当我选择文本并按下时,我目前正在使用它来像 Geany(我的旧编辑器)中一样工作F3

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>

当然,这是*用于向前搜索选定文本和#向后搜索选定文本。

我无法弄清楚的是,一旦找到它,如何让这两个重新选择找到的单词(或任何选择的单词),这样我就可以继续按下*#继续搜索。因此,如果这不是我想要的并且想要继续搜索,我不必重新选择它找到的内容。

4

2 回答 2

2

您添加的解决方案v//e<CR>有效,但它具有使搜索结束的副作用,这会影响n/等其他命令N1v一个更好的选择是通过(或1vlwhen 'selection'is 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
于 2012-08-10T20:23:41.237 回答
0

知道了!!!在另一个与我的相关的 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>

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

于 2012-08-09T17:15:46.167 回答