I’ve been using neovim for the last couple of years, and so far LOVE it. I did, however, initially, have an issue
when opening ruby files. Opening ruby files would quite literally take neovim
a few seconds to start up.
nvim --startuptime neobaseline.log somefile.rb
1426.382 1296.813 1296.813: sourcing /../ftplugin/ruby.vim
5149.924 000.013: --- NVIM STARTED ---
I did some additional profiling with vim
and was getting similar results(albeit vim
was a bit faster at loading ruby files). Seeing slowness with
vim confirmed that it wasn’t just an issue specifically with neovim
. After doing some additional profiling and researching online, I was able to get
both neovim
and vim
to load significantly faster!
049.027 000.004: --- NVIM STARTED ---
037.137 000.002: --- VIM STARTED ---
Before I get too far, let’s go over my neovim
setup(if you don’t care, skip to the solution section!).
Neovim/Vim setup
I hate having a massive .vimrc
file, so I split out the configuration into multiple files. The config I use works with both neovim
, and vim
.
""""""""""Load Vim Config""""""""""""""
source ~/.vim/config/config.vim
""""""""""Load Custom Mappings"""""""""
source ~/.vim/config/mappings.vim
""""""""""Load Custom Scripts""""""""""
source ~/.vim/config/scripts.vim
""""""""""Plugin install"""""""""""""""
source ~/.vim/config/plugins.vim
""""""""""Plugin install"""""""""""""""
source ~/.vim/config/plugin-config.vim
The plugin manager I use is vim-plug.
I won’t post my whole plugins.vim
file due to the size.
" Neovim and vim8 support
if has('nvim')
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
Plug 'Shougo/deoplete.nvim'
Plug 'roxma/nvim-yarp'
Plug 'roxma/vim-hug-neovim-rpc'
endif
" Multiple syntax files
" Takes care of most things like vim-ruby, vim-javascript, vim-typescript etc
Plug 'sheerun/vim-polyglot', { 'for': ['ansible', 'cmake', 'crystal', 'clojure', 'dart', 'dockerfile', 'groovy', 'haproxy', 'javascript', 'jenkins' , 'jinja', 'json', 'llvm', 'lua', 'nginx', 'nim', 'pgsql', 'protobuf', 'ruby', 'eruby', 'haml', 'rust', 'swift', 'systemd', 'terraform', 'tomdoc', 'toml', 'typescript', 'yard', 'yaml', 'tmux', 'reason'] }
" Linting
Plug 'w0rp/ale'
Solution
After a bit of research and some trial and error, I found that using rbenv
was a significant part of the problem. A ton of time was being spent by neovim
and vim
searching for the ruby binary and gems.
Additionally, the provider/clipboard.vim
was taking a long time to load for neovim
.(This seemed only to be an issue for neovim
).
- Adding
Plug 'tpope/vim-rbenv'
to the top of my.vimrc
, before most things were loaded, cut the startup time forvim
by about half (interestingly enough, it didn’t do a whole lot forneovim
)" Install plug manager early call plug#begin('~/.local/share/nvim/plugged') " Load rbenv plugin early on to speed up scripts that " look for ruby paths/gems etc Plug 'tpope/vim-rbenv'
- Updating my
plugins.vim
to use more “On-demand loading”, helped a bitPlug 'tpope/vim-fireplace', { 'for': 'clojure' }
- Specifying the ruby host prog in my
config.vim
(specifically forneovim
)if has('nvim') " Tell neovim which ruby to use(ends up being rbenv) " The below should be handled by the tpope/vim-rbenv " " let g:ruby_path = system('echo $HOME/.rbenv/shims') let g:ruby_host_prog = '~/.rbenv/shims/neovim-ruby-host' let ruby_spellcheck_strings = 1 endif
- Specifying the clipboard settings
if has('macunix') let g:clipboard = {'copy': {'+': 'pbcopy', '*': 'pbcopy'}, 'paste': {'+': 'pbpaste', '*': 'pbpaste'}, 'name': 'pbcopy', 'cache_enabled': 1} set clipboard+=unnamedplus endif
After making the config updates, both vim
and neovim
start almost instantaneously!
049.027 000.004: --- NVIM STARTED ---
037.137 000.002: --- VIM STARTED ---