【问题标题】:Why is Vim so slow?为什么 Vim 这么慢?
【发布时间】:2016-10-05 07:24:46
【问题描述】:

我是 vim 新手,有点迷茫。看起来 Vim 比 Geany 慢。这是一个非常明显的差异。当我在 Geany 中按住任何键时,它会毫无延迟地打印它(例如 llllllll)。在 Vim 中,它是缓慢而跳跃的。与 Geany 相比,vim 中的自动完成功能非常糟糕。我认为 Vim 和光一样快。看起来不是。有什么建议可以改变这一点,让 vim 更快吗?

这是我的 _vimrc 文件:

" This must be first, because it changes other options as side effect
set nocompatible

" Use pathogen to easily modify the runtime path to include all
" plugins under the ~/.vim/bundle directory
call pathogen#helptags()
call pathogen#infect()

" change the mapleader from \ to ,
let mapleader=","

" Quickly edit/reload the vimrc file
nmap <silent> <leader>ev :e $MYVIMRC<CR>
nmap <silent> <leader>sv :so $MYVIMRC<CR>

set hidden
set nowrap        " don't wrap lines
set tabstop=4     " a tab is four spaces
set backspace=indent,eol,start
                " allow backspacing over everything in insert mode
set autoindent    " always set autoindenting on
set copyindent    " copy the previous indentation on autoindenting
set number        " always show line numbers
set shiftwidth=4  " number of spaces to use for autoindenting
set shiftround    " use multiple of shiftwidth when indenting with '<' and '>'
set showmatch     " set show matching parenthesis
set ignorecase    " ignore case when searching
set smartcase     " ignore case if search pattern is all lowercase,
                "    case-sensitive otherwise
set smarttab      " insert tabs on the start of a line according to
                "    shiftwidth, not tabstop
set hlsearch      " highlight search terms
set incsearch     " show search matches as you type

set history=1000         " remember more commands and search history
set undolevels=1000      " use many muchos levels of undo
set wildignore=*.swp,*.bak,*.pyc,*.class
set title                " change the terminal's title
set visualbell           " don't beep
set noerrorbells         " don't beep

set nobackup
set noswapfile

filetype plugin indent on

autocmd filetype python set expandtab

if &t_Co >= 256 || has("gui_running")
    colorscheme badwolf
endif

if &t_Co > 2 || has("gui_running")
    " switch syntax highlighting on, when the terminal has colors
    syntax on
endif

" Vim can highlight whitespaces for you in a convenient way:
set list
set listchars=tab:>.,trail:.,extends:#,nbsp:.

set pastetoggle=<F2>

set mouse=a " Enable mouse

set encoding=utf-8
set langmenu=en_US
let $LANG = 'en_US'
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

set autochdir " working directory is always the same as the file you are       editing 
noremap <F5> :w !python %<CR>
inoremap <F5> <ESC>:w !python %<CR>

nmap <leader>t :NERDTree<CR>
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") &&     b:NERDTreeType == "primary") | q | endif

set guifont=Hack:h10:cDEFAULT
let g:Powerline_symbols = 'fancy'
set laststatus=2

python from powerline.vim import setup as powerline_setup
python powerline_setup()
python del powerline_setup

filetype plugin on
set omnifunc=syntaxcomplete#Complete
au CompleteDone * pclose
set completeopt=longest,menuone,preview

set guioptions-=T
set nofoldenable    " disable folding

nmap <silent> ,/ :nohlsearch<CR>

【问题讨论】:

  • 这确实是您的 vimrc 文件的问题。首先尝试在没有的情况下运行它,看看它是否有所作为:vim -u NONE
  • 是的,你错了。
  • 你没有错 - 关于自定义,我的意思是你的 vimrc 中有一些乱码,这会导致挂断。
  • 看看这个问题的答案:stackoverflow.com/questions/12213597/…。内置分析总是帮助我找到 vim 缓慢的根源。
  • 第一件事让我大吃一惊:为什么每次启动 Vim 时都运行 pathogen#helptags()?您只需在安装或升级插件后运行一次。至于还有什么让你的 Vim 变慢;你可能有无数个插件可以通过一千次削减来杀死它。按照上面的建议,禁用您实际上不使用的那些,然后运行分析。

标签: vim


【解决方案1】:

这可能是很多事情,不一定是 Vim 的错。其实这不太可能是vim的错。

  1. 首先,感受一下 Vim 的速度:使用 vim -u NONE 运行并注释掉 .vimrc 中的所有内容 - 然后做一件看起来很慢的事情。

  2. 在没有-u NONE 的情况下运行并进行比较。它应该一样快,或者某些插件被自动加载并导致问题。如果是这样,请尝试暂时将文件移出~/.vim/bundle 目录。

  3. 接下来,取消注释一半的 .vimrc 并检查它是否导致缓慢。继续评论/取消评论,直到找到确切的行。

  4. 用 Google 搜索导致运行缓慢的线路并找出是否有替代方案。

我猜你可能会在每次滚动时执行昂贵的操作,例如检查文件语法。

最好循序渐进地追捕慢。

另一个问题可能是缓慢的终端和/或驱动程序(所以比较 Vim 和 GVim)。如果你有一个慢速终端,它有精美的字体、透明度、小字体和大屏幕尺寸,那么终端可能会非常、非常、非常慢。

【讨论】:

  • 我正在尝试寻找“坏”插件,但我发现了一些奇怪的东西。当我在导入语句之后长时间按任意键(llllllllllllllll)时,vim 会毫无问题地打印它。当我在我的程序中间执行此操作时,vim 会减慢并开始“跳跃”。我找不到发生了什么。
  • 看起来像语法着色。试试“:syntax off”。你的源文件很大吗?什么操作系统?哪个版本的 Vim?你在使用 python.vim 吗?如果有,是哪个版本?内置?来自 GitHub?你用的是 Tmux 还是 screen?你有编译python支持吗?您正在使用哪些插件(如果可以,请列出 ~/.vim/bundle 中的文件/目录)?你能给出的答案越多,你就会越快得到好的建议。
  • 关闭语法并不能解决问题。我的测试文件很小——大约 350 行。我正在使用 Windows 10、VIM 7.4。我的 Vim\vim74\syntax、Vim\vim74\ftplugin 和 Vim\vim74\indent 目录中有 python.vim 文件。我没有使用 Tmux 或屏幕。我的 .vim/bundle 目录中有这些插件:command-t、indentpython.vim、vim-flake8。我删除了 powerline,因为我注意到它稍微减慢了我的 VIM。我安装了github.com/amix/vimrc 进行尝试,效果很好。我认为我的 vimrc 配置中的问题是自动完成功能(输入“点”时,我必须等待一两秒)。
  • @Luk 你提到它在import 语句之后很好(假设是Python),但随后开始变慢。那么最有可能的嫌疑人是您的 indentpython 脚本(可能正在尝试自动缩进)或 flake8(运行,IIRC,针对代码的三个语法检查器)。他们中的一个或两个都可能通过尝试实时做事来减慢速度。我建议禁用两者。如果事情再次变快,那么分别重新启用它们中的每一个,看看是否只有一个在减慢速度 - 然后你就抓住了罪魁祸首。
  • @Luk 并再次查看您的 vimrc,我还将查看底部附近的自动完成内容(omnifunccompleteopt...)。在这种情况下,自动完成将解析您的所有代码和导入的库以匹配类和符号名称,并且根据具体情况,这可能会很慢。
【解决方案2】:

如果你像我一样在终端中使用 vim(而不是 GVim),我刚刚发现,尝试一下,看起来还不错:

在你的 ~/.vimrc 中添加这个:

设置 timeoutlen=1000

设置 ttimeoutlen=0

这个(甚至更重要的)在你的 ~/.screenrc 中:

地图超时 0

自从我这样做了,一切都变得更好了。

【讨论】:

  • 你能提供更多关于这个配置做什么的信息吗?
  • 你在这里有一个很好的解释:vi.stackexchange.com/questions/10249/…。长话短说,如果您在键码序列中,这些超时是恒定的(以毫秒为单位)用于停止 vim 等待。技术上(这就是我所理解的)maptimeout 与直接在您的 GNU 屏幕上设置的完全相同。对我来说 0 毫秒是可以的,但我可以理解 10 应该更好,以便有时间继续一些序列。
  • 这应该是~/screenrc吗?您的文件名中有 3 个e,只是想确保这是一个错字:P
  • 谢谢!惊人的。现在消除 chrome 延迟的秘诀是什么... :-)
【解决方案3】:

在我将以下配置添加到我的 vimrc 后,我的 vim 开始运行,当您保持 vim 整天/一周运行并经常打开和关闭它们编辑许多不同的文件时,这非常有用。

function! CloseHiddenBuffers()
    " >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    " close any buffers hidden
    " <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    let open_buffers = []

    for i in range(tabpagenr('$'))
        call extend(open_buffers, tabpagebuflist(i + 1))
    endfor

    for num in range(1, bufnr("$") + 1)
        if buflisted(num) && index(open_buffers, num) == -1
            exec "bdelete ".num
        endif
    endfor
endfunction

au BufEnter * call CloseHiddenBuffers()

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,粘贴文本段落或以典型速度输入会导致 vim 挂起。

    您可以对.vimrc 进行故障排除,如果是,请查看this question 以了解哪些插件运行缓慢。也可以跳过排查,直接使用neovim,完全兼容vim和异步。

    一旦我开始使用它,我的输入延迟问题就消失了。它使用异步库libuv,即same library powering node。我使用与 vim 相同的 .vimrc(复制到 ~/.config/nvim/init.vim),所以这不是不同插件的问题。我还在 Ubuntu 20.04 和 Macos 10.14 上看到了这种响应能力的改进。

    我发布这个答案是因为我希望它在我上次阅读这个问题时已经存在。

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2016-09-28
      • 2020-02-08
      • 2012-07-17
      • 2011-11-07
      • 2015-08-24
      • 2013-08-06
      • 2014-07-16
      • 2011-01-02
      相关资源
      最近更新 更多