Vim中如何一键高亮当前行,直至行不可见或再次按键取消?
哈哈,这个需求我之前也折腾过!给你两种纯Vim原生的实现方案,不用装任何插件,按需选:
方法一:快速临时高亮(无切换)
如果你只需要快速高亮当前行,不需要切换开关,直接在~/.vimrc(Neovim用户是~/.config/nvim/init.vim)里加一行映射就行,比如用<F5>当触发键(换成你顺手的键都可以,比如<Leader>h):
nnoremap <F5> :call matchadd('Search', '\%' . line('.') . 'l', 10)<CR>
简单解释:
matchadd('Search', pattern, priority):调用Vim的内置高亮匹配功能,用Search组(就是你平时搜索时的高亮样式)来标记目标行\%line('.')l:这是Vim正则的行匹配语法,line('.')会获取当前光标所在的行号,组合起来就是精准匹配当前行- 优先级设为10是为了避免被其他低优先级的高亮覆盖
⚠️ 小提醒:这个方法每次按都会叠加一个高亮,如果多次按同一行,高亮会重复,适合临时快速用。
方法二:带开关+自动取消的智能高亮
如果想要按一次高亮、再按一次取消,还能在行滚出屏幕/切换窗口时自动取消高亮,就用这个带自定义函数的方案:
- 先在配置文件里定义全局变量和函数:
" 存储当前高亮的ID,初始为0(0表示无高亮) let g:current_line_highlight_id = 0 function! ToggleCurrentLineHighlight() " 如果已有高亮,先取消它 if g:current_line_highlight_id != 0 call matchdelete(g:current_line_highlight_id) let g:current_line_highlight_id = 0 else " 给当前行添加高亮,用Search组,优先级10 let g:current_line_highlight_id = matchadd('Search', '\%' . line('.') . 'l', 10) " 设置自动取消的规则:离开缓冲区/窗口时取消 autocmd BufLeave,BufWinLeave,WinLeave * call matchdelete(g:current_line_highlight_id) | let g:current_line_highlight_id = 0 " 光标移到其他行时,自动取消原行的高亮 autocmd CursorMoved * if line('.') != matchstr(getmatchpos(g:current_line_highlight_id)[1], '\d\+') | call matchdelete(g:current_line_highlight_id) | let g:current_line_highlight_id = 0 | endif endif endfunction
- 再添加触发映射:
nnoremap <F5> :call ToggleCurrentLineHighlight()<CR>
逻辑说明:
- 用全局变量
g:current_line_highlight_id追踪当前高亮的唯一ID,方便后续精准删除 - 第一次按
<F5>:给当前行加上高亮,同时绑定自动命令,确保你切换窗口、离开文件或者光标移走时,高亮自动消失 - 第二次按
<F5>:如果当前有高亮,就立刻删除它,重置状态
可选:自定义高亮样式
要是默认的Search高亮不符合你的审美,可以自己定义一个高亮组:
" 终端和GUI模式分别设置背景色,按需调整 hi MyCurrentLine ctermbg=darkblue guibg=#335577
然后把函数里的'Search'替换成'MyCurrentLine'就行,高亮样式就变成你自定义的啦!
内容的提问来源于stack exchange,提问作者bndfcom
相关产品推荐
相关产品推荐

