向后搜索视觉模式选择
Searching backward for visual mode selection
我希望在 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
。然而,这与 #
的正常模式操作有悖常理,因此我尝试将选择分配给 ?
寄存器,却发现没有名为 ?
的寄存器。我将如何解决这个问题?理想情况下,我更愿意在不安装插件的情况下执行此操作。
遗憾的是,没有您可以打开或关闭的选项来定义搜索应该向前还是向后。所以最简单的方法是实际搜索 /
或 ?
.
你的情况:
vnoremap <silent> * <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>/<CR>
vnoremap <silent> # <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>?<CR>
不带参数的搜索只会重复最后一个模式(参见 :help ?<CR>
)
虽然我觉得为此目的定义一个函数有点矫枉过正,但这是我的 vimrc 中的内容:
vnoremap * y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>/<CR>
vnoremap # y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>?<CR>
这里我复制选择,将@/
寄存器设置为复制的文本,然后按照我上面显示的相同方式进行搜索。 <C-r>
允许传递寄存器的内容(参见 :help <C-r>
)
我希望在 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
。然而,这与 #
的正常模式操作有悖常理,因此我尝试将选择分配给 ?
寄存器,却发现没有名为 ?
的寄存器。我将如何解决这个问题?理想情况下,我更愿意在不安装插件的情况下执行此操作。
遗憾的是,没有您可以打开或关闭的选项来定义搜索应该向前还是向后。所以最简单的方法是实际搜索 /
或 ?
.
你的情况:
vnoremap <silent> * <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>/<CR>
vnoremap <silent> # <c-\><c-n>:let @/ = escape(GetVisualSelection(), '/\^$*.[~')<CR>?<CR>
不带参数的搜索只会重复最后一个模式(参见 :help ?<CR>
)
虽然我觉得为此目的定义一个函数有点矫枉过正,但这是我的 vimrc 中的内容:
vnoremap * y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>/<CR>
vnoremap # y:let @/ = escape("<C-r>0", "/\^$*.[~")<CR>?<CR>
这里我复制选择,将@/
寄存器设置为复制的文本,然后按照我上面显示的相同方式进行搜索。 <C-r>
允许传递寄存器的内容(参见 :help <C-r>
)