向后搜索视觉模式选择

Posted

技术标签:

【中文标题】向后搜索视觉模式选择【英文标题】:Searching backward for visual mode selection 【发布时间】:2020-07-22 13:25:53 【问题描述】:

我希望在 Vim 中以可视模式重新映射我的 #* 键,以便能够突出显示部分文本并分别向后和向前搜索。在a previous answer 的帮助下,我成功地进行了前向搜索。然而,我很难让向后搜索工作。以下是我的.vimrc 的相关部分。

function! GetVisualSelection() abort
  try
    let a_save = @a
    silent! normal! gv"ay
    return @a
  finally
    let @a = a_save
  endtry
endfunction

" Map # and * to search for the highlighted text in visual mode
vnoremap <silent> * <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>n
vnoremap <silent> # <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>N

最初的高亮和向后搜索效果很好,但是一旦我按n 向后搜索下一个匹配项,Vim 就会继续向前搜索。我怀疑这是因为向后搜索使用? 运算符而不是/,这意味着我必须按N 而不是n。然而这与# 的正常模式操作有悖常理,因此我尝试将选择分配给? 寄存器,结果发现没有名为? 的寄存器。我将如何解决这个问题?理想情况下,我宁愿在不安装插件的情况下执行此操作。

【问题讨论】:

【参考方案1】:

不幸的是,没有选项可以打开或关闭来定义搜索是向前还是向后。所以最简单的方法是使用/? 进行实际搜索。

在你的情况下:

vnoremap <silent> * <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>/<CR>
vnoremap <silent> # <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>?<CR>

不带参数的搜索只会重复最后一个模式(请参阅:help ?&lt;CR&gt;


虽然我觉得为此目的定义一个函数有点矫枉过正,但这是我在 vimrc 中的内容:

vnoremap * y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>/<CR>
vnoremap # y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>?<CR>

在这里我复制选择,将@/ 寄存器设置为复制的文本,并以与上面显示的相同方式进行搜索。 &lt;C-r&gt; 允许过去寄存器的内容(参见:help &lt;C-r&gt;

【讨论】:

我忘了我可以通过将.vimrc 也包含在/? 中来使用它们的重复功能。谢谢!

以上是关于向后搜索视觉模式选择的主要内容,如果未能解决你的问题,请参考以下文章

PrimeReact DataTable:如何(视觉)取消选择行

Vim何时使用Visual模式?

如何选择机器视觉软件

机器视觉 ifelse算子(已废弃)

Vim:如何将视觉块移动到寄存器?

搜索模式并从文本中选择特定模式