为什么Vim这么慢?

时间:2016-06-05 17:18:32

标签: vim

我是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>

4 个答案:

答案 0 :(得分:8)

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

  1. 首先,了解Vim的速度有多快:使用vim -u NONE运行并注释掉.vimrc中的所有内容 - 然后做一件似乎很慢的事情。

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

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

  4. 谷歌引起这种缓慢的路线并找出是否有替代方案。

  5. 我猜你可能会对每个滚动进行一次昂贵的操作,例如检查文件语法。

    最好一步一步地追捕缓慢。

    另一个问题可能是终端和/或驱动程序较慢(因此将Vim与GVim进行比较)。如果您的终端具有花哨的字体,透明度,小字体和大屏幕尺寸,终端可能非常非常非常慢。

答案 1 :(得分:3)

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

在〜/ .vimrc中添加:

  

设置timeoutlen = 1000

     

设置ttimeoutlen = 0

你的〜/ .screeenrc中的

和这个(甚至更重要):

  

maptimeout 0

自从我这样做以来,一切都更好。

答案 2 :(得分:0)

在我的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()

答案 3 :(得分:0)

我有一个类似的问题,即粘贴文本段落或仅以典型速度打字会导致vim停止运行。

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

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

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