packaddでプラグインを読み込んだ時に、プラグインに含まれるftplugin/以下のスクリプトが最後まで実行されなかったので試行錯誤して調べてみました。
環境
Vim 7.4.1868
Linux
~/dotfiles/.vimを~/.vimにシンボリックリンクを貼っています。
サンプルで利用するプラグイン
https://github.com/davidhalter/jedi-vim
https://github.com/fatih/vim-go
プラグインのパスをruntimepathの後方に追加していくパターン
packadd! vim-go
packadd! jedi-vim
~/.vim
/usr/local/share/vim/vimfiles
/usr/local/share/vim/vim74
/usr/local/share/vim/vimfiles/after
~/.vim/after
~/dotfiles/.vim/pack/dist/opt/vim-go
~/dotfiles/.vim/pack/dist/opt/jedi-vim
~/dotfiles/.vim/pack/dist/opt/jedi-vim/after
packaddを書いた順番通りにvim-goとjedi-vimのパスがruntimepathの後方に追加されました。
このパターンだと/usr/local/share/vim/vim74/ftplugin/以下のスクリプトがプラグインに含まれるftplugin/よりも先に検索されてしまうので、プラグイン側のftplugin/以下のスクリプトを実行する前に変数b:did_ftpluginが定義済みになり、プラグイン側のftplugin/以下のスクリプトが最後まで実行されませんでした。
プラグインのパスをruntimepathの前方に追加するパターン
~/.vimがシンボリックリンクなので、runtimepathから~/.vimを削除し、シンボリックリンクの参照先である~/dotfiles/.vimをruntimepathの先頭に追加します。
set rtp-=~/.vim
set rtp^=~/dotfiles/.vim
packadd! vim-go
packadd! jedi-vim
または
let s:vimhome = split(&rtp, ',')[0]
execute 'set rtp-=' . s:vimhome
execute 'set rtp^=' . resolve(expand(s:vimhome))
packadd! vim-go
packadd! jedi-vim
unlet s:vimhome
~/dotfiles/.vim
~/dotfiles/.vim/pack/dist/opt/jedi-vim
~/dotfiles/.vim/pack/dist/opt/vim-go
/opt/vim74/share/vim/vimfiles
/opt/vim74/share/vim/vim74
/opt/vim74/share/vim/vimfiles/after
~ /.vim/after
~/dotfiles/.vim/pack/dist/opt/jedi-vim/after
jedi-vimとvim-goのパスが~/dotfiles/.vimの直後に追加されています。
jedi-vimがvim-goよりも前方に追加されています。
jedi-vimのafterディレクトリのパスが後ろに追加されています。
最初に挙げたパターンと違ってプラグイン側のftplugin/を先に検索できるようになったのでプラグイン側のftplugin/以下のスクリプトが最後まで実行できるようになりました。
2017/02/06 追記
~/.vimがシンボリックリンクではない場合は今回の問題は発生しません。
Vim 8.0.308でこの不具合が修正されました。
vim-jpで報告したらh-eastさんが直してくださいました。
ありがとうございます。