With version 8, our favourite editor Vim got support for native third-party package loading. For me this means I can ditch plugin helper Pathogen. The path we took was great but a bright future lies ahead with our seperate ways.
This little tutorial contains detailed steps to migrate your existing plugins from Pathogen to native package manager in Vim. On our way, we will adjust the settings of dot git repository, for which we use the magnificent yadm.
So we have:
Remove lines referencing Pathogen from your .vimrc
:
execute pathogen#infect()
pathogen#helptags()
Remove the pathogen autoload
folder:
rm -rf ~/.vim/autoload
Check which submodules you have installed:
cat ~/.gitmodules
[submodule ".vim/bundle/nerdtree"]
path = .vim/bundle/nerdtree
url = git@github.com:scrooloose/nerdtree.git
[submodule ".vim/bundle/vim-airline"]
path = .vim/bundle/vim-airline
url = git@github.com:vim-airline/vim-airline.git
[submodule ".vim/bundle/vim-airline-themes"]
path = .vim/bundle/vim-airline-themes
url = git@github.com:vim-airline/vim-airline-themes.git
[submodule ".vim/bundle/ultisnips"]
path = .vim/bundle/ultisnips
url = git@github.com:SirVer/ultisnips.git
[submodule ".vim/bundle/vim-commentary"]
path = .vim/bundle/vim-commentary
url = git@github.com:tpope/vim-commentary.git
[submodule ".vim/bundle/vim-snippets"]
path = .vim/bundle/vim-snippets
url = git@github.com:honza/vim-snippets.git
[submodule ".vim/bundle/vim-surround"]
path = .vim/bundle/vim-surround
url = git@github.com:tpope/vim-surround.git
[submodule ".vim/bundle/undotree"]
path = .vim/bundle/undotree
url = https://github.com/mbbill/undotree.git
[submodule ".vim/bundle/supertab"]
path = .vim/bundle/supertab
url = git@github.com:ervandew/supertab.git
[submodule ".vim/bundle/vim-fugitive"]
path = .vim/bundle/vim-fugitive
url = git@github.com:tpope/vim-fugitive.git
[submodule ".vim/bundle/vimtex"]
path = .vim/bundle/vimtex
url = git@github.com:lervag/vimtex.git
Remove each module:
yadm rm ~/.vim/bundle/nerdtree
...
Vim modules now live here:
mkdir ~/.vim/pack
Replace name of the subfolder (b4d
) with arbitrary name/nickname:
mkdir ~/.vim/pack/b4d
Create a start
folder, that will contain all of the plugins you want to autoload at start:
mkdir ~/.vim/pack/b4d/start
Create a opt
folder for packages that you can later on load with :packadd name-of-the-package
:
mkdir ~/.vim/pack/b4d/opt
In my case I want all of them to autoload at vim startup, so I will stick them to the start
subfolder:
yadm submodule add git@github.com:vim-airline/vim-airline.git .vim/pack/b4d/start/vim-airline
yadm submodule add git@github.com:vim-airline/vim-airline-themes.git .vim/pack/b4d/start/vim-airline-themes
yadm submodule add git@github.com:SirVer/ultisnips.git .vim/pack/b4d/start/ultisnips
yadm submodule add git@github.com:tpope/vim-commentary.git .vim/pack/b4d/start/vim-commentary
yadm submodule add git@github.com:honza/vim-snippets.git .vim/pack/b4d/start/vim-snippets
yadm submodule add git@github.com:tpope/vim-surround.git .vim/pack/b4d/start/vim-surround
yadm submodule add git@github.com:mbbill/undotree.git .vim/pack/b4d/start/undotree
yadm submodule add git@github.com:ervandew/supertab.git .vim/pack/b4d/start/supertab
yadm submodule add git@github.com:tpope/vim-fugitive.git .vim/pack/b4d/start/vim-fugitive
yadm submodule add git@github.com:lervag/vimtex.git .vim/pack/b4d/start/vimtex
yadm submodule add git@github.com:scrooloose/nerdtree.git .vim/pack/b4d/start/nerdtree
Commit your changes and push them to remote yadm repository.
yadm commit -m “Replacing vim pathogen with native vim packages.”
yadm push
Native plugin managment has one drawback, helptags are not automatically re-generated.
You can update them by using:
:helptags ALL
Also, safely ignore the error:
E152: Cannot open /opt/local/share/vim/vim81/doc/tags for writing
To update remote hosts that have yadm set up, we need to pull the changes and reinitialize the submodules.
yadm pull
yadm submodule update --init --recursive
In the future you can update all of the submodules by using:
yadm submodule update --recursive --remote
Create a bootstrap file, that will execute every time you clone the repository.
You can also run it by issuing yadm bootstrap
command by hand.
vim ~/.yadm/bootstrap
#!/bin/bash
# Because Git submodule commands cannot operate without a work tree, they must
# be run from within $HOME (assuming this is the root of your dotfiles)
cd "$HOME"
echo "Init submodules"
yadm submodule update --recursive --init
Make it executable:
chmod +x ~/.yadm/bootstrap
This tip is from Bootstrap - official yadm documentation.
vim ~/yadm/hooks/post_pull
#!/bin/bash
# Because Git submodule commands cannot operate without a work tree, they must
# be run from within $HOME (assuming this is the root of your dotfiles)
cd "$HOME"
echo "Update submodules"
yadm submodule update --recursive --remote
Make it executable:
chmod +x ~/yadm/hooks/post_pull
Idea for the last two tips comes from user TheLocehiliosan on Reddit.