超级星号(*)键在Vim中将搜索光标下的单词并跳转到下一个匹配。用户可以使用n键跳转到下一个匹配项。如果启用了hlsearch
,它还会突出显示匹配项。
我希望能够按下*并获得突出显示的匹配项,并能使用n键浏览匹配项。但是,当按下*时,我不希望Vim跳转到下一个匹配项,而应该停留在当前单词上。有什么办法可以做到这一点吗?
nnoremap * *``
这段代码的作用和你所期望的一模一样,但会在跳转列表中增加一个跳转。要避免这个问题,你需要:
nnoremap * :keepjumps normal! mi*`i<CR>
normal!
。 normal
相当于nnoremap
,而normal!
相当于nmap
。 - Keith Smiley”未按预期工作,因此我不得不对此进行修改为:
nnoremap * :keepjumps normal! mi*`i<CR>`。请注意,修改后的代码与原始代码含义相同。 - Keith Smileynnoremap * *#
,避免闪烁。 - coderek”标记。我使用```nnoremap * m
:keepjumps normal! *``<cr>。稍微不同的方法是使用
nnoremap * m`:keepjumps normal! *<cr>```。 - doraemon我发现这很有效,没有闪烁,也不需要中间寄存器。
nnoremap <silent> * :let @/= '\<' . expand('<cword>') . '\>' <bar> set hls <cr>
或者如果你想要 g*
行为:
nnoremap <silent> g* :let @/=expand('<cword>') <bar> set hls <cr>
我还没有见过这个:
nmap <silent> * "syiw<Esc>: let @/ = @s<CR>
它非常简短,不涉及跳转,因此不会导致闪烁。
解释:复制光标下的单词到寄存器 s
,然后将搜索寄存器(/
)设置为寄存器 s
的内容。搜索寄存器不能直接写入,这就是为什么需要使用 let
以及 silent
以保持 Vim 命令行的干净。
最佳解决方案:
因此,请尝试使用插件:http://www.vim.org/scripts/script.php?script_id=4335
比以下方式好得多:
" a jump adds to the jump list
nnoremap * *``
" I got a dead loop on macvim
nnoremap * :keepjumps normal *``<cr>
" the behavior is changed
nnoremap <silent> <Leader>* :let @/='\<<C-R>=expand("<cword>")<CR>\>'<CR>:set hls<CR>
如果您想保留当前视图并将搜索添加到历史记录中,请尝试此[不太高效的]解决方案:
noremap * msHmt`s*`tzt`s
这里使用了标记 s
(保存)和 t
(置顶)。
我在我的 .vimrc 文件中加入了以下内容,我认为这比其他替代方案更好:
" Put word under cursor into search register and highlight
nnoremap <silent> <Leader>* :let @/='\<<C-R>=expand("<cword>")<CR>\>'<CR>:set hls<CR>
vnoremap <silent> <Leader>* :<C-U>
\let old_reg=getreg('"')<Bar>let old_regtype=getregtype('"')<CR>
\gvy:let @/=substitute(
\escape(@", '/\.*$^~['), '\_s\+', '\\_s\\+', 'g')<CR>
\gV:call setreg('"', old_reg, old_regtype)<CR>:set hls<CR>
map * *#
放入.vimrc
文件中(尽管会闪烁)。#
没有的好处吗? - khachik*#
和`*``都存在闪烁问题。 - Thomson*
命令,将其扩展到可视选择,并提供了可选的自动搜索光标下单词的功能。*
的行为,不跳到下一个匹配项,并包括来自下一个插件的可视搜索n/N
或*
,并可以避免跳转。z*
映射,也不跳跃,可视*
,更直观的智能大小写处理,并且可以在跳转时保持光标位置(例如,*
)function! StarPositionSave()
let g:star_position_cursor = getpos('.')
normal! H
let g:star_position_top = getpos('.')
call setpos('.', g:star_position_cursor)
endfunction
function! StarPositionRestore()
call setpos('.', g:star_position_top)
normal! zt
call setpos('.', g:star_position_cursor)
endfunction
nnoremap <silent> * :call StarPositionSave()<CR>*:call StarPositionRestore()<CR>
normal! *
直接放在函数中似乎不起作用,因为(至少在neovim中),它会抑制搜索高亮显示的触发(就像运行了:nohlsearch
一样)。noremap * :let @/ = "\\<<C-r><C-w>\\>"<cr>:set hlsearch<cr>
它只是将模式设置为光标下的整个单词,然后打开(或更新)搜索模式的高亮显示。
:sp
)窗口,然后在新窗口中执行超级启动(*
)搜索。这样可以有效地获得相同的“信息”,并保留原始光标位置。 - Kenny Evitt