Check If Vim Syntax Region Exists and Remove It

Viewed 43

Background:

  • Syntax highlighting for perl files is extremely slow at times for large files (1k+ lines).

  • I profiled using:

:syntime on
"*** Do some slow actions ***
:syntime report
  • There were many slowly performaning regions, like: perlStatementProc

  • I significantly improved performance by removing some of the slowly performing syntax regions (there are more):

:syntax clear perlStatementProc
  • Now I want to use this vimrc with these improvements on a different machine which may not have a specific region defined.

I am seeing this ERROR when opening Vim:

E28: No such highlight group name: perlStatementProc

How can I check if the syntax region name perlStatementProc exists?

1 Answers

I found out about hlexists and implemented this solution in my vimrc:

" Remove some syntax highlighting from large perl files.
function! RemovePerlSyntax()
    if line('$') > 1000
        let perl_syntaxes = [
             \ "perlStatementProc",
             \ "perlMatch",
             \ "perlStatementPword",
             \ "perlQR",
             \ "perlQW",
             \ "perlQQ",
             \ "perlQ",
             \ "perlStatementIndirObjWrap",
             \ "perlVarPlain",
             \ "perlVarPlain",
             \ "perlOperator",
             \ "perlStatementFiledesc",
             \ "perlStatementScalar",
             \ "perlStatementInclude",
             \ "perlStatementNumeric",
             \ "perlStatementSocket",
             \ "perlFloat",
             \ "perlFormat",
             \ "perlStatementMisc",
             \ "perlStatementFiles",
             \ "perlStatementList",
             \ "perlStatementIPC",
             \ "perlStatementNetwork",
             \ "perlStatementTime",
             \ "perlStatementIOfunc",
             \ "perlStatementFlow",
             \ "perlStatementControl",
             \ "perlHereDoc",
             \ "perlHereDocStart",
             \ "perlVarPlain2",
             \ "perlVarBlock",
             \ "perlVarBlock2",
             \ "perlDATA",
             \ "perlControl",
             \ "perlStatementHash",
             \ "perlStatementVector",
             \ "perlIndentedHereDoc",
             \ "perlLabel",
             \ "perlConditional",
             \ "perlRepeat",
             \ "perlNumber",
             \ "perlStatementRegexp",
        \ ]

        for perl_syntax in perl_syntaxes
            " NEW - Was missing this check before.
            if hlexists( perl_syntax )
                exec "syntax clear " . perl_syntax
            endif
        endfor

        let b:remove_perl_syntax = 1
    else
        let b:remove_perl_syntax = 0
    endif
endfunction
augroup remove_perl_syntax
   autocmd!
   autocmd BufNewFile,BufRead,BufReadPost,FileType perl call RemovePerlSyntax()
augroup END
Related