Vim如何检查指定语法区域是否存在 清除时避免E28报错
问题背景
- 处理大文件*(1k+行)*时,Perl文件的语法高亮有时会极其卡顿。
- 可通过以下命令做语法性能分析:
:syntime on "*** 执行触发卡顿的操作 *** :syntime report
- 分析结果会列出性能表现差的语法区域,例如
perlStatementProc。 - 清除这类低性能语法区域可以大幅提升运行性能,执行命令示例:
:syntax clear perlStatementProc
- 将携带这类优化配置的vimrc部署到其他机器时,部分机器可能未定义对应的特定语法区域,打开Vim会触发如下错误:
E28: No such highlight group name: perlStatementProc
核心需求:检查perlStatementProc这类语法区域名称是否存在,避免执行清除命令时触发报错。
解决方案
方法1:判断高亮组存在后再执行清除
Vim内置hlexists()函数可以检测指定高亮/语法组是否存在,存在时返回1,不存在返回0,用条件判断包裹清除命令即可避免报错:
if hlexists('perlStatementProc') syntax clear perlStatementProc endif
如果需要批量清除多个低性能Perl语法组,可以用循环简化配置:
" 列表内填入所有需要清除的低性能语法组名 for slow_group in ['perlStatementProc', 'perlStatementInclude', 'perlHereDoc'] if hlexists(slow_group) execute 'syntax clear ' . slow_group endif endfor
注意这类语法优化配置需要在Perl语法文件加载完成后执行才会生效,推荐放到~/.vim/after/syntax/perl.vim路径下,或者通过FileType自动命令触发,避免配置被后续加载的默认语法规则覆盖:
augroup perl_syntax_opt autocmd! autocmd FileType perl call s:fix_perl_syntax() augroup END function! s:fix_perl_syntax() let slow_groups = ['perlStatementProc', 'perlStatementInclude'] for g in slow_groups if hlexists(g) execute 'syntax clear ' . g endif endfor endfunction
方法2:静默执行命令忽略报错
如果不需要保留命令的错误提示,可以直接在清除命令前加silent!,自动忽略执行过程中的所有报错,写法更简洁:
silent! syntax clear perlStatementProc
该写法会屏蔽命令的所有报错输出,如果需要排查其他配置问题,优先选择
hlexists()条件判断的方案。
内容的提问来源于stack exchange,提问作者Tim Potapov
相关产品推荐
相关产品推荐

