【问题标题】:Modular highlighting-by-filetype causes major slowdown. Please advise模块化按文件类型突出显示会导致严重减速。请指教
【发布时间】:2021-11-13 06:20:40
【问题描述】:

如果我能在我的 vimrc 中调整一些模块化 vim 文件类型的代码,我将不胜感激。提前谢谢您。

我的 vim --version 是 8.1。

我提取了以下模块化代码的最小示例。这是我写它时的想法:

  1. 我有一个函数,LoadAllKeywords(),其中定义了 N 个关键字列表(通过 syn 关键字)。
  2. 对于 M 种不同的文件类型(*.py、*.c、...)中的每一种,我都有 1 个函数。这些 M 文件类型特定函数中的每一个都将通过调用 LoadAllKeywords() 加载所有关键字列表,然后选择这些列表的子集来执行突出显示。这使我可以将所有关键字存储在代码中的一个位置,同时让突出显示规则因英尺而异。
  3. 模块化是以瞬时加载为代价的。加载时间似乎随着事件的数量呈指数增长。事件包括加载缓冲区(即 BufEnter)和通过常规旧缓冲区切换 (c-w c-h) 访问缓冲区。

代码如下,以及我通过 this SO post发现的函数分析器输出(:profile {})的摘录。

设置N个关键字列表的函数定义

fun! LoadAllKeywords()
    syn keyword msgsHL containedin=.*Comment     msgs flash tick

    syn keyword mvpHL containedin=.*Comment      works_ dbugd_ depr_ collab_ delta_ aka_ restrict_ cisc_
    syn keyword pipeHL containedin=.*Comment     step_ 
    syn keyword warnHL containedin=.*Comment     warning_ gotcha_ sidefx_ improvement_ rbugd_ rename_ seq_

    syn keyword RecipeHL containedin=.*Comment      TITLE STEP
    syn keyword ToyHL containedin=.*Comment      src_ play_ risc_ overview_ idea_ mathidea_ csidea_ syntax_ question_

    syn keyword ContentHL IMAGE BLOOM PIPE ALGO GRID RE IXO SIMPLE DELTA 
    syn keyword StructureHL MVFR MVTO TOC RISC CISC TODO BKMK GOTO
endfu

用于特定文件类型突出显示的 M 函数子集。

...
fun! PythonHighlights()
    call LoadAllKeywords() "load keywords to pick and choose from

    hi msgsHL ctermfg=Blue ctermbg=None cterm=None
    hi mvpHL ctermfg=DarkGreen ctermbg=None cterm=None
    hi pipeHL ctermfg=Grey ctermbg=None cterm=bold
    hi warnHL ctermfg=Yellow ctermbg=None cterm=None
endfu

fun! NotesHighlights()
    call LoadAllKeywords() "load keywords to pick and choose from
    hi ContentHL ctermfg=LightGrey ctermbg=None cterm=bold
    hi StructureHL ctermfg=Blue ctermbg=None cterm=None
endfu
...

函数从 .vim/ftplugin/* 中的相应文件类型调用。

augroup python_autogroup "in ftplugin/python.vim
    au!
    autocmd BufEnter *.py call PythonHighlights() "moving this to _python.vim, where it will be called.If the function isn't defined, move _aesthetics to run before _python, _notes, and other filetypes.
augroup END

call NotesHighlights() "in ftplugin/notes.vim

autocmd BufEnter *.c call CLikeHighlights()
autocmd BufEnter *.h call CLikeHighlights()

这是分析器,只分析 1 个 .c 文件的打开。在打开大约 8-10 个文件后开始进行分析,以显着降低速度。您可以在这里找到排在前 3 位的可疑函数。

FUNCTIONS SORTED ON TOTAL TIME
count  total (s)   self (s)  function
    1   1.599449   0.000926  <SNR>62_NetrwBrowseChgDir()
   98   1.130717   0.001972  CLikeHighlights()
   98   1.128745             LoadAllKeywords()
  102   0.200728   0.041670  <SNR>4_SynSet()
  102   0.105099   0.076247  <SNR>22_LoadFTPlugin()
    1   0.045744   0.001851  netrw#Explore()
    2   0.043202   0.000217  netrw#LocalBrowseCheck()
    1   0.042797   0.001287  <SNR>62_NetrwBrowse()
    1   0.035903   0.000969  <SNR>62_PerformListing()
  102   0.019905   0.017667  <SNR>23_LoadIndent()
    2   0.017507   0.001461  <SNR>62_NetrwSafeOptions()
    4   0.010980   0.001338  fugitive#detect()
    1   0.009971   0.000029  <SNR>28_record()
    1   0.009942   0.000298  <SNR>28_addtomrufs()
    1   0.009226   0.000012  <SNR>28_savetofile()
    1   0.009214   0.009204  ctrlp#utils#writecache()
    1   0.008837   0.008824  <SNR>29_persist()
    1   0.008067   0.004857  <SNR>62_LocalListing()
   17   0.005025             <SNR>38_Highlight_Matching_Pair()
    1   0.004706   0.000034  dist#ft#FTheader()

FUNCTIONS SORTED ON SELF TIME
count  total (s)   self (s)  function
   98              1.128745  LoadAllKeywords()
  102   0.105099   0.076247  <SNR>22_LoadFTPlugin()
  102   0.200728   0.041670  <SNR>4_SynSet()
  102   0.019905   0.017667  <SNR>23_LoadIndent()
    1   0.009214   0.009204  ctrlp#utils#writecache()
    1   0.008837   0.008824  <SNR>29_persist()
   17              0.005025  <SNR>38_Highlight_Matching_Pair()
    1   0.008067   0.004857  <SNR>62_LocalListing()
    1   0.002979   0.002905  <SNR>62_NetrwMaps()
    4              0.002700  <SNR>30_define_commands()
    1              0.002611  <SNR>62_NetrwSetSort()
   34              0.002496  <SNR>62_NetrwFile()
   98   1.130717   0.001972  CLikeHighlights()
    1   0.045744   0.001851  netrw#Explore()
    8              0.001737  <SNR>30_map()
    2   0.017507   0.001461  <SNR>62_NetrwSafeOptions()
    3              0.001410  <SNR>31_setup_vinegar()
    4   0.010980   0.001338  fugitive#detect()
    2              0.001306  <SNR>62_NetrwOptionSave()
    1   0.042797   0.001287  <SNR>62_NetrwBrowse()

【问题讨论】:

    标签: vim netrw


    【解决方案1】:

    :syn

    :syn 命令不能在语法脚本之外调用。如果您想为给定文件类型添加关键字到现有名册,请使用“后”机制:

    " in after/syntax/<filetype>.vim
    syn keyword msgsHL containedin=.*Comment msgs flash tick
    [...]
    

    如果您想将一堆关键字定义存储在一个中心位置,那么将它们放在一个函数中是不必要的。相反,将它们放在全局语法脚本中:

    " in syntax/mykeywords.vim
    syn keyword msgsHL containedin=.*Comment msgs flash tick
    
    syn keyword mvpHL containedin=.*Comment works_ dbugd_ depr_ collab_ delta_ aka_ restrict_ cisc_
    syn keyword pipeHL containedin=.*Comment step_ 
    syn keyword warnHL containedin=.*Comment warning_ gotcha_ sidefx_ improvement_ rbugd_ rename_ seq_
    
    syn keyword RecipeHL containedin=.*Comment TITLE STEP
    syn keyword ToyHL containedin=.*Comment src_ play_ risc_ overview_ idea_ mathidea_ csidea_ syntax_ question_
    
    syn keyword ContentHL IMAGE BLOOM PIPE ALGO GRID RE IXO SIMPLE DELTA 
    syn keyword StructureHL MVFR MVTO TOC RISC CISC TODO BKMK GOTO
    

    您可以在各种本地语法脚本中获取源代码:

    " in after/ftplugin/<filetype>.vim
    runtime syntax/mykeywords.vim
    

    :hi

    同样,:hi 命令通常不会在颜色方案之外调用任何业务。

    如果由于某种原因您无法将它们添加到正确的颜色方案中,那么the next best thing to do 将执行这些命令一次,ColorScheme事件:

    " in your vimrc
    function! MyHighlights() abort
        hi msgsHL ctermfg=Blue ctermbg=None cterm=None
        hi mvpHL ctermfg=DarkGreen ctermbg=None cterm=None
        hi pipeHL ctermfg=Grey ctermbg=None cterm=bold
        hi warnHL ctermfg=Yellow ctermbg=None cterm=None
        hi ContentHL ctermfg=LightGrey ctermbg=None cterm=bold
        hi StructureHL ctermfg=Blue ctermbg=None cterm=None
    endfunction
    
    augroup MyColors
        autocmd!
        autocmd ColorScheme * call MyHighlights()
    augroup END
    
    " the blocks above must appear before ANY :colorscheme command
    colorscheme foobar
    

    结论

    Vim 的运行时已经足够模块化,如果理解/使用正确,它不会成倍地减慢速度。我知道在一个人的旅程中的某个时刻,对任意行“模块化”配置的冲动可能会很强烈,但它很少带来太多好处。如果有的话。

    例子:

    • 已经有一种非常有效的机制来定义特定于文件类型的高亮组,因此没有必要再设计自己的。
    • 已经可以从任何语法脚本中获取另一个语法脚本,因此没有必要将自定义函数复杂化。
    • 高亮组的外观可以而且应该通过适当的配色方案进行全局设置。在 ftplugin 级别或 BufEnter 上执行此操作完全没有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-30
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多