ViM中的super star (*)键将搜索光标下的单词并跳转到下一个匹配项。用户可以使用n
键跳转到下一个匹配项。如果启用hlsearch
,则还会突出显示匹配项。
我希望能够按*并获得突出显示的匹配,并能够使用n键导航比赛。但是,我按不希望ViM在按下*时跳转到下一个匹配,它应该保留在当前单词上。有没有办法做到这一点?
答案 0 :(得分:25)
我想映射:
nnoremap * *``
完全按照您的意愿工作,除了它在跳转列表中添加跳转。为了防止你需要:
nnoremap * :keepjumps normal *``<cr>
答案 1 :(得分:6)
最佳解决方案:
所以,试试插件: 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>
答案 2 :(得分:5)
我的.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>
答案 3 :(得分:4)
如果您想保留当前视图并将搜索添加到历史记录中,请尝试使用[效率不高]解决方案:
noremap * msHmt`s*`tzt`s
使用标记s
(保存)和t
(顶部)。
答案 4 :(得分:3)
我想到了一个简单的解决方案:将map * *#
放在.vimrc
文件中(它会闪烁)。
答案 5 :(得分:3)
我还没见过这个:
nmap <silent> * "syiw<Esc>: let @/ = @s<CR>
它非常短,不涉及跳跃,这会导致眨眼。
说明:将光标下的字复制到s
寄存器,然后将搜索寄存器(/
)设置为s
寄存器的内容。搜索寄存器不能直接写入,这就是为什么let是必要的,因此silent
保持vim的命令行清洁。
答案 6 :(得分:1)
我发现这很好用,没有眨眼,也不需要中间寄存器。
nnoremap <silent> * :let @/= '\<' . expand('<cword>') . '\>' <bar> set hls <cr>
或者如果您想要g*
行为:
nnoremap <silent> g* :let @/=expand('<cword>') <bar> set hls <cr>
答案 7 :(得分:0)
这里的其他答案很好,特别是@rodrigo的答案,但是我想写一个保留滚动位置并且不影响任何标记的解决方案。
这对我有用:
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
一样)。
答案 8 :(得分:0)
这里的许多答案都概述了相当简单的映射,这些映射在常见情况下效果很好,但是可能会产生副作用(例如来回跳动而闪烁)或缺乏鲁棒性(如果将某些正则表达式字符定义为关键字字符,则可能会损坏)。
如果您正在寻找可靠的实施方案,又不介意安装插件,则可以从多种选择中进行选择,其中许多还提供与搜索相关的其他改进:
*
命令,将其扩展到视觉选择,并提供了可选的自动搜索光标下方单词的功能。*
的行为更改为不跳转到下一个匹配项,并包括从下一个插件进行可视搜索n/N
或*
,并且可以避免跳跃。z*
映射,该映射也不会跳转,可视化*
,更直观的智能案例处理,并且可以在跳转时保持光标位置(例如,*
)答案 9 :(得分:0)
我的解决方案:
nnoremap <silent><expr> * v:count ? '*'
\ : ':execute "keepjumps normal! *" <Bar> call winrestview(' . string(winsaveview()) . ')<CR>'
nnoremap <silent><expr> g* v:count ? 'g*'
\ : ':execute "keepjumps normal! g*" <Bar> call winrestview(' . string(winsaveview()) . ')<CR>'
优点:
*
。*
,其行为与*
几乎相同(除了跳跃)。答案 10 :(得分:0)
类似于*
,我们拥有
[I ..................... it shows where the word under the cursor appears
我在vimrc上也有一些有用的行,可以帮助您
" When double click a word vim will hightlight all other ocurences
" see CountWordFunction()
" [I shows lines with word under the cursor
nnoremap <silent> <2-LeftMouse> :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
nnoremap <Leader>* :let @/='\V\<'.escape(expand('<cword>'), '\').'\>'<cr>:set hls<cr>:CountWord<cr>
if !exists('*CountWordFunction')
fun! CountWordFunction()
try
let l:win_view = winsaveview()
exec "%s/" . expand("<cword>") . "//gn"
finally
call winrestview(l:win_view)
endtry
endfun
endif
command! -nargs=0 CountWord :call CountWordFunction()
cnoreabbrev cw CountWord
nnoremap <F3> :CountWord<CR>
答案 11 :(得分:-1)
:map cc :let @/ = '\<'.expand('<cword>').'\>'\|set hlsearch<C-M>