语法高亮在Vim中造成可怕的滞后
我爱Vim。 但是,现在给我的困难时期。
我使用了很多插件,在过去的6个月里,我发现了很多很棒的插件。 但是我的Vim也真的很慢。 我一直在进行清理工作,但没有什么帮助。
我正处在Vim完全无法使用的地步。 它感觉像是以每秒2-5帧的速度渲染,切换标签页/缓冲区大约需要一秒钟,使用hjkl
滚动非常糟糕,延迟非常糟糕,甚至在插入模式下input一个句子也是令人困惑的(由于延迟)。
编辑:其实,当我打开Vim的新鲜实例,但在15分钟内,它变得无法使用。
我刚刚花了4个小时试图找出哪个插件或configuration造成的痛苦。 我没有成功。
不过,我确实发现,删除这个设置会导致所有的延迟消失: syntax on
这三条语法与语法结合使得一切变得更糟。
set t_Co=256 set background=dark colorscheme candyman
有趣。 那么,语法突出就是将Vim从超级活泼转变为难以置信的低迷?
我试过在“干净”模式下启用语法: vim -u NONE
而这不是一个问题。
所以似乎是什么问题是语法高亮结合一个或多个我的插件。 我试图禁用一堆,没有运气。
有没有办法做分析? 我从手动testing中相当疲惫。
有没有人有类似的经验? 也许可以快速浏览一下.vimrc
,看看有没有什么东西响起来。 https://bitbucket.org/furion/dotfiles
解决scheme:造成混乱的插件是:
Bundle "gorodinskiy/vim-coloresque.git"
我build议阅读答案,很好的见解。
编辑(1个月后): coloresque插件已经看到了一些改进。
你有autocmd
垃圾邮件。 在重新添加autocmds之前,您应该将所有autocmd语句包装在清除组的组中。 它看起来像你的.vimrc
有大多数autocmds注释掉,所以也许有一个插件是造成这个问题。 检查这个命令的输出:
:au CursorMoved
如果有一堆重复的处理程序,那就是你的问题。
下面是我的.vimrc中autocmd纪律的一个例子:
augroup vimrc_autocmd autocmd! "toggle quickfix window autocmd BufReadPost quickfix map <buffer> <leader>qq :cclose<cr>|map <buffer> <cp> <up>|map <buffer> <cn> <down> autocmd FileType unite call s:unite_settings() " obliterate unite buffers (marks especially). autocmd BufLeave \[unite\]* if "nofile" ==# &buftype | setlocal bufhidden=wipe | endif " Jump to the last position when reopening a file autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif " ...etc... augroup END
autocmd!
在重新添加vimrc_autocmd
, augroup
块的开始清除当前组(在本例中为vimrc_autocmd
)。
:syntime on
在你的ruby文件中移动然后
:syntime report
它报告了我以下最慢的匹配,你可以看到,甚至没有一场比赛。
我在ruby.vim文件中禁用rubyPredefinedConstant并解决了问题。 Vim的正则expression式引擎不喜欢ruby语法突出显示正则expression式。 你将不得不find足够的语法highligting和良好的性能之间的平衡。
希望有所帮助,这里是前3个最慢的语法高亮正则expression式在我的Mac OS 10.8.5,自制Vim 7.4(控制台VIM)
TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN 3.498505 12494 0 0.008359 0.000280 rubyPredefinedConstant \%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\|TRUE\)\>\%(\s*(\)\@! 2.948513 12494 0 0.006798 0.000236 rubyPredefinedConstant \%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(MatchingData\|ARGF\|ARGV\|ENV\)\>\%(\s*(\)\@! 2.438253 12494 0 0.005346 0.000195 rubyPredefinedConstant \%(\%(\.\@<!\.\)\@<!\|::\)\_s*\zs\%(DATA\|FALSE\|NIL\)\>\%(\s*(\)\@!
或者您可以尝试Dojosto指出的vim-ruby
从另一个堆栈溢出的问题 ,我通过在.vimrc文件中添加以下行来快速获得vim:
set re=1
这将迫使vim使用旧版本的正则expression式引擎,实际上对于ruby来说更快。
我想感谢大家帮助我解决这个问题。 好消息是,我的Vim又快又好玩了。
我已经开始用新鲜的Vim重新安装。 我不是通过插件添加插件,直到我find了所有邪恶的根源。
Bundle "gorodinskiy/vim-coloresque.git"
它是一个让我感到痛苦的插件。 既然我有一段时间了,这不是一个嫌疑犯,那为什么我发现这么晚了。 这个插件的作用是每当它find一个颜色(例如红色,绿色)或hex值(例如#FFFFFF)的单词时,它就会设置文本的背景色以匹配其描述的颜色。 很好的想法,但似乎执行不力。
删除这个插件删除了滞后。
但是我并没有停留在这里。 我也做了一个重大清理我的.vimrc。 删除了一些我没用过的插件。 分组我的autocmd
和删除不必要的。
我的Vim现在非常活泼。 我很高兴。
我发现“set foldmethod = syntax”使得7.4对于js&ruby文件(ubuntu 13.10)几乎不可用,而“set foldmethod = indent”可以正常工作。
我注意到,如果你使用dynamic改变背景颜色的东西,vim可以放慢速度。 尝试closures:set cursorline
或:set cursorcolumn
(如果你有他们设置)。
我很确定
set t_Co=256 set background=dark colorscheme candyman
与这种滞后无关。 两个第一行是无用的(可用的颜色数量是根据您的$TERM
定义的,而您的颜色set background=dark
已经set background=dark
),但并不是真的有害。
常见的“Vim正在慢慢爬行”原因包括写得不好的autocmd
,太多的autocmd
,重新加载~/.vimrc
太频繁,写得不好的插件…
请发布您的设置,以便我们可以帮助您找出为什么你遇到这种滞后。
语法突出显示可能很慢,但应该限制在一些(有点病态的)文件和特定的语法(es)。 最新的Vim 7.4有一个新的命令:syntime
来排除缓慢的语法错误。
除此之外,通常情况下,一个二进制search ,你禁用一半的插件,那么只有一半(问题仍然存在),或另一半(问题消失),让你快速到达有问题的脚本。
我有这个问题很长一段时间,这让我疯狂。 我尝试安装vim-ruby 。 不知道是否有帮助,但至less现在我有最新版本的ruby语法突出显示(从Vim的最后一个版本发布以来的任何性能改进)。
但后来我进一步查看,发现vim-ruby有一种跳过所有昂贵高亮的模式。 尝试添加这一行到你的vimrc,看看是否有帮助(它为我做了,终于!):
let ruby_no_expensive=1