Intro

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:

Vim 8 or greater. Pathogen set up. Some plugins loaded and pushed to yadm repo as submodules.

Removing pathogen and modules

Remove lines referencing Pathogen from your .vimrc :

execute pathogen#infect() pathogen#helptags()

Remove the pathogen autoload folder:

rm -rf ~/.vim/autoload

Remove submodules from yadm

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 ...

Prepare directory structure

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

Add new submodules to yadm

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

Remote hosts

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

Automatic initialization of the submodules

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.