You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vim 8.1按文件类型模块化高亮引发严重性能下降,求优化建议

优化你的模块化Vim高亮配置,解决卡顿问题

看起来你的核心问题是重复调用关键词定义和高亮设置导致的性能开销——LoadAllKeywords()和文件类型高亮函数被触发了98次,每次都在重复定义语法规则和设置高亮,这肯定会拖慢Vim的响应速度。下面是针对性的优化方案,直接上手就能用:

1. 让关键词只加载一次

每次调用LoadAllKeywords()都会重新定义所有syn keyword,这是最大的性能杀手。我们给它加个全局标志,确保只执行一次:

fun! LoadAllKeywords()
  " 检查是否已经加载过关键词,避免重复定义
  if exists('g:loaded_all_keywords') && g:loaded_all_keywords
    return
  endif

  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

  let g:loaded_all_keywords = 1
endfu

2. 减少高亮函数的重复执行

每个文件类型的高亮设置也不需要每次切换缓冲区都执行,给每个缓冲区加个局部标志,确保只设置一次:

fun! PythonHighlights()
  call LoadAllKeywords() " 现在只会在第一次调用时加载关键词
  " 检查当前缓冲区是否已经设置过高亮
  if exists('b:python_highlights_set') && b:python_highlights_set
    return
  endif

  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

  let b:python_highlights_set = 1
endfu

fun! NotesHighlights()
  call LoadAllKeywords()
  if exists('b:notes_highlights_set') && b:notes_highlights_set
    return
  endif

  hi ContentHL ctermfg=LightGrey ctermbg=None cterm=bold
  hi StructureHL ctermfg=Blue ctermbg=None cterm=None

  let b:notes_highlights_set = 1
endfu

3. 去掉多余的BufEnter自动命令

你现在用BufEnter触发高亮函数,但这个事件会在每次切换缓冲区、打开新窗口时都触发,完全没必要。ftplugin本身就是针对对应文件类型加载的,直接在ftplugin文件里调用函数即可:

  • ftplugin/python.vim里直接写:
    call PythonHighlights()
    
  • ftplugin/notes.vim里直接写:
    call NotesHighlights()
    
  • ftplugin/c.vim里直接写:
    call CLikeHighlights()
    

这样Vim只会在第一次检测到文件类型时执行一次高亮设置,后续切换缓冲区不会重复触发。

额外优化:提前加载关键词

如果你想彻底避免第一次打开文件时的加载延迟,可以把LoadAllKeywords()直接放到你的vimrc里,启动Vim时就加载好所有关键词:

call LoadAllKeywords()

这样所有ftplugin调用高亮函数时,关键词已经准备就绪,连第一次的加载开销都省了。

优化效果验证

做完这些修改后,再用:profile检查,你会发现LoadAllKeywords()和各类高亮函数的调用次数会从98次降到1次(或每个缓冲区1次),总耗时会大幅下降,卡顿问题应该就能解决了。

内容的提问来源于stack exchange,提问作者wip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:33:12