如何在Vim脚本中判断光标是否处于DiffAdd代码块?
在Vim脚本中判断光标是否位于新增代码块的方法
当然可以实现,别用背景色判断——这种方式受终端配色、主题影响极大,可靠性极低。下面是几种更靠谱的实现思路:
1. 基于语法高亮组判断(通用场景)
如果你的"新增代码块"有对应的自定义高亮组(比如你自己定义的NewCode组),可以直接获取光标位置的顶层语法高亮组名称来判断:
function! IsInNewCodeBlock() " 获取光标所在位置的顶层语法ID(第三个参数1表示取顶层组) let l:syn_id = synID(line('.'), col('.'), 1) " 转换为高亮组名称 let l:syn_name = synIDattr(l:syn_id, 'name') " 替换成你实际的新增代码块高亮组名称 return l:syn_name ==# 'NewCode' endfunction
你之前匹配高亮组失败,大概率是没正确使用synID()的第三个参数——如果传0会拿到底层嵌套的语法组,而新增代码块的高亮通常是顶层组,所以必须传1。
2. 针对Diff/版本控制的新增代码
如果是Git等版本控制中未提交的新增代码,或者diff模式下的新增行,可以直接检查对应高亮组:
function! IsInDiffAddBlock() let l:syn_id = synID(line('.'), col('.'), 1) let l:syn_name = synIDattr(l:syn_id, 'name') " DiffAdd是Vim默认的新增行高亮组 return l:syn_name ==# 'DiffAdd' endfunction
如果用了gitgutter这类插件,还可以通过行标记判断:
function! IsInGitGutterAddBlock() let l:signs = sign_getplaced(bufname('%'), {'lnum': line('.')}) for s in l:signs[0]['signs'] if s['name'] ==# 'gitgutter_add' return 1 endif endfor return 0 endfunction
为什么背景色匹配不可靠?
背景色是高亮组渲染后的最终显示结果,不同终端、主题会修改实际颜色值,而且Vim脚本中获取的synIDattr(syn_id, 'bg')是颜色代码(比如#ffffff),很容易和你预期的颜色不一致,完全不适合用来做判断依据。
内容的提问来源于stack exchange,提问作者Steven Thiel
相关产品推荐
相关产品推荐

