4

I have Vim 7 installed from my distro's package manager, and I compiled Vim 8 from source. Vim 8 is all in /usr/local. Then I created a new directory in $HOME called ".vim8". I have all my Vim 7 stuff in $HOME/.vim/, and I want a clean directory for Vim 8 in $HOME/.vim8/.

For Vim 8, I'm calling it like this: /usr/local/bin/vim8 -u "${HOME}/.vim8/vimrc".

That sets the vimrc to the right file. But it still doesn't load other things in ${HOME}/.vim8/. For example, I have the NERDTree plugin installed in pack:

$ tree -L 5 $HOME/.vim8/
/home/todd/.vim8/
├── pack
│   └── vendor
│       └── start
│           └── nerdtree
│               ├── autoload
│               ├── CHANGELOG.md
│               ├── doc
│               ├── lib
│               ├── LICENCE
│               ├── nerdtree_plugin
│               ├── plugin
│               ├── README.markdown
│               ├── screenshot.png
│               └── syntax
└── vimrc

Yet the plugin doesn't load. When I open vim8 I can't use NERDTree. It says it's not an editor command. Thinking about why this would be happening, I came up with a possibility: maybe it's using $HOME/.vim8/vimrc as the rc file, but it's not using $HOME/.vim8 for everything else. So I did this:

$ vim8 -u "${HOME}/.vim8/vimrc" -T dumb -c ':scriptnames|:q'

  1: ~/.vim8/vimrc
  2: /usr/local/share/vim/vim82/syntax/syntax.vim
  3: /usr/local/share/vim/vim82/syntax/synload.vim
  4: /usr/local/share/vim/vim82/syntax/syncolor.vim
  5: ~/.vim/filetype.vim
  6: /usr/local/share/vim/vim82/filetype.vim
     [ ...and a bunch of other files from local... ]

Aha! It appears I'm right. Vim is still looking in the .vim/ directory. So then I try setting runtimepath:

$ vim8 -u "${HOME}/.vim8/vimrc" --cmd ':set runtimepath=~/.vim8/,$VIMRUNTIME' -T dumb -c ':scriptnames|:q'

  1: ~/.vim8/vimrc
  2: /usr/local/share/vim/vim82/syntax/syntax.vim
  3: /usr/local/share/vim/vim82/syntax/synload.vim
  4: /usr/local/share/vim/vim82/syntax/syncolor.vim
  5: /usr/local/share/vim/vim82/filetype.vim
     [ ...and a bunch of other files from local... ]

And now it's not loading anything from .vim/. That's good. But also still not loading anything from .vim8/. NERDTree is still not available.

How do I tell Vim to use an alternate user directory for runtime files? I want to keep the 7 and 8 configuration separate and side-by-side. Is there anything I can do make Vim 8 use $HOME/.vim8/?

4

The specific path you're using (pack/vendor/start/nerdtree) is using the "packages" feature, which is a new Vim 8 feature that automates manipulation of 'runtimepath' in a way similar to how plug-in managers have been implemented.

That's why your attempt setting 'runtimepath' from --cmd doesn't work, since packages actually use a separate 'packpath' setting.

The location of ~/.vim is only set in Vim as part of those two options: 'runtimepath' and 'packpath'.

So you can override that to ~/.vim8 by simply resetting these two options in the .vimrc you use with Vim 8:

set runtimepath=~/.vim8,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,~/.vim8/after
set packpath=~/.vim8,$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after,~/.vim8/after

This should be enough to have Vim read files from the separate directory.


If you're building Vim 8 from sources, you might also want to consider patching it so it defaults to looking at ~/.vim8 rather than ~/.vim.

You can change those default paths in src/os_unix.h.

While at it, you might want to consider changing the location of the vimrc file and also the second vimrc file which is typically under ~/.vim, so you might want to update that one.


Please note that some plug-ins (in particular, plug-in managers) might use ~/.vim as their default as well (or even hardcode that path), so you might need to deal with those separately.

For example, Vundle defaults to using ~/.vim/bundle, but you can easily override that in the vundle#begin() call by passing a directory as an argument. (vim-plug, a more modern plug-in manager and in a way successor to Vundle, doesn't have this problem and will use the first path in 'runtimepath' instead as its default.)


Also consider whether you really want and need to keep separate ~/.vim directories for Vim 7 and Vim 8. Vim has enough features that should make it possible/easy to keep a single config that works in multiple versions.

For example, with Vim 8 packages, you can use a check such as if has('packages') to check whether the feature is enabled or not. If support for packages is not available, you can use vim-pathogen to load the plug-ins from the package directories, so you can have selective backwards compatibility for those too.

| improve this answer | |
  • 1
    Indeed, sounds like OP was missing packpath – D. Ben Knoble Dec 28 '19 at 3:14
  • 1
    @D.BenKnoble Updated with more details, more background on packages and why the OP's attempt didn't work. – filbranden Dec 28 '19 at 22:24
  • This is a very complete answer -- especially for pointing out where in the source the vimrc default is set! -- and very well written. Thank you. I do want to keep separate .vim directories because I want to test out Vim 8 with a clean config. I really like @Matt 's suggestion (in another answer) of putting that switch in the main/usual vimrc. – Todd Walton Jan 2 at 18:02
2

Starting from Patch 7.4.1384 Vim has 'packpath' option for searching plugins. By default 'packpath' is equal to 'runtimepath' (until 'runtimepath' finally gets inflated by the plugins loaded), so you must keep them sync in your vimrc.

For Vim 8, I'm calling it like this: /usr/local/bin/vim8 -u "${HOME}/.vim8/vimrc".

You can add the following lines on top of your "main" vimrc instead:

" check if we have version-specific config
let s:dotvim = '~/.vim' . (v:version / 100)
if isdirectory(expand(s:dotvim))
    " setup runtimepath and packpath
    set runtimepath=$VIM/vimfiles,$VIMRUNTIME,$VIM/vimfiles/after
    execute 'set runtimepath^=' . s:dotvim
    execute 'set runtimepath+=' . s:dotvim . '/after'
    if exists('&packpath')
        let &packpath = &runtimepath
    endif
    " proceed with special config
    execute 'source' s:dotvim . '/vimrc'
    finish
endif
" default stuff (if any) follows...

Now an appropriate configuration will be chosen automatically.

| improve this answer | |
  • Oh this is awesome! Thank you! – Todd Walton Jan 2 at 18:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.