ViM:搜索并突出显示但不要跳转

时间:2010-11-23 13:56:21

标签: search vim

ViM中的super star (*)键将搜索光标下的单词并跳转到下一个匹配项。用户可以使用n键跳转到下一个匹配项。如果启用hlsearch,则还会突出显示匹配项。

我希望能够按*并获得突出显示的匹配,并能够使用n键导航比赛。但是,我按希望ViM在按下*时跳转到下一个匹配,它应该保留在当前单词上。有没有办法做到这一点?

12 个答案:

答案 0 :(得分:25)

我想映射:

nnoremap * *``

完全按照您的意愿工作,除了它在跳转列表中添加跳转。为了防止你需要:

nnoremap * :keepjumps normal *``<cr>

答案 1 :(得分:6)

最佳解决方案:

  1. 不要在跳转列表中添加跳转
  2. 星形键的行为不会改变
  3. 所以,试试插件: 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)

这里的许多答案都概述了相当简单的映射,这些映射在常见情况下效果很好,但是可能会产生副作用(例如来回跳动而闪烁)或缺乏鲁棒性(如果将某些正则表达式字符定义为关键字字符,则可能会损坏)。

如果您正在寻找可靠的实施方案,又不介意安装插件,则可以从多种选择中进行选择,其中许多还提供与搜索相关的其他改进:

  • 我的SearchHighlighting plugin更改了*命令,将其扩展到视觉选择,并提供了可选的自动搜索光标下方单词的功能。
  • star search*的行为更改为不跳转到下一个匹配项,并包括从下一个插件进行可视搜索
  • vim-visual-star-search提供了视觉选择的搜索
  • visualstar.vim提供了视觉选择的搜索
  • select & search可以在视觉选择中使用n/N*,并且可以避免跳跃。
  • vim-asterisk提供了一个z*映射,该映射也不会跳转,可视化*,更直观的智能案例处理,并且可以在跳转时保持光标位置(例如,*
  • searchant.vim钩入内置搜索命令,并为上次跳转到的比赛提供单独的突出显示。

答案 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>'

优点:

  • 没有闪烁。
  • 跳转列表保持不变。
  • 如果指定了count,则其作用类似于原始的*
  • 它不使用标记或寄存器。
  • 使用实际的*,其行为与*几乎相同(除了跳跃)。
  • 不需要插件安装。

答案 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>