.vimrcをgithubで管理する時って、プラグイン管理をNeoBundle使う場合はどうすんのよ！？

# この記事のサマリ
githubでdotfilesを管理していて、VimのNeoBundleのように外部ツールを利用している場合、git submoduleを使うと、NeoBundleのインストールも含めて、ポータブルにできるのでオススメですよというお話。
新しい環境にdotfilesを持ってくるときは、`git clone --recursive https://github.com/yukimura1227/dotfiles.git`のようにオプションをつけて実行しましょう。

# 対象読者
.vimrcをgithubでdotfilesで管理している方やしたいなぁと思っている方で、git submoduleという便利な機能を知らない方向け。

# 動作確認バージョン
vim：7.4.648
git：2.5.4 (Apple Git-61)

# 経緯
今まで素のvimを利用していたのですが、自分が最近転職した結果、素のvimだと機能てきに不足していることも多くなってきたので、vimのプラグインマネージャーとしてNeoBundleを利用することに決ました。その結果、dotfilesの管理はどうすればいいんだろう？と思って調べたので。(検索した感じだと、皆当たり前のようにgit submoduleを利用していたのですが、自分は知らなくてたどり着くまでに時間がかかったので、ピンポイントでたどり着けるタイトルでまとめておくことにしました。)

# 必要となる前提知識
そもそもドットファイルって何？とか、ドットファイルが、.vimrcや.bash_profileなどの設定ファイルだというのはわかっているとして、それを何故githubで管理するんじゃ？といったのが想像できない方は、まずはその辺を知りましょう。
環境をポータブルにして、新しい環境になってもさくっと同様な開発環境を手に入れることができますし、昔の開発環境を構築することも比較的カンタンにできるようになります。個人的には、dotfileの管理はとてもオススメです。

参考：
[dotfilesをgithubで管理](http://qiita.com/okamos/items/7f5461814e8ed8916870)


# さぁ具体的な、話をしませう

## 前段
皆さん、開発環境ってどういう風に管理していますか？私は、JavaがMainだったので、eclipseのバージョンとeclipseで利用しているpluginや、pluginの導入方法をメモしておいて、地道に入れてみたり、利用しているeclipse自体をzipなどに固めて、それを新しい環境に移った場合は、コピーして利用したりしていました。
最近は、別の言語をゴニョゴニョしたり、Vagrantで戯れたりする機会が増えてきていたので、環境をなるべくポータブルにしておきたいなぁと思っていました。
そこで、vagrant用にセットアップスクリプトをソフトウェア毎に作成したり(chefとかpuppetで作るのもいいかなぁとは思っていたのですが、shellで組んでいるので、お恥ずかしいですが。。。)、設定ファイル系はdotfilesをgithubに登録して簡単に再現できるようにしました。
自分は、統合開発環境を利用する場合以外は、主にvimを使っているのですが、SIer時代はJavaがメインだったので、素のVimでそこまで困ることはありませんでした。
ただ、Web系の自社サービスを開発しているところに移った結果、あれこれとvimのpluginが欲しいなぁと思うようになり、情報量も豊富なNeoBundleというvim向けのプラグインマネージャを利用することにしました。

## NeoBundleって何者？
NeoBundleというのは、vim向けのプラグインを管理するツールです。NeoBundle自体のインストールは、

```
cd ${HOME}
mkdir .vim
mkdir .vim/bundle
git clone https://github.com/Shougo/neobundle.vim .vim\bundle\neobundle.vim
```
のように、vimの設定ファイルを保存する.vimというフォルダの中に、インストールするイメージになります。


詳細は、以下のページがとても参考になります。
[vim専用プラグイン管理ツールNeoBundleであなたのvimをもっと便利に！](https://blog.codecamp.jp/vim_neobundle)

## dotfileをgithubで管理する上で、neobundle.vimをどう管理するか？
先ほどインストール方法で紹介したから分るように、neobundle本体はgithubにあり、それを$`{HOME}/.vim/bundle`にcloneしてインストールしています。
そうすると、このフォルダ毎githubにpushしちゃえばいいのかな？って気もしますが、人様のプログラムを自分のgithubにpushするのも変ですし、neobundleに更新が入った場合に追随する場合どうするの？って問題が発生します。

neobundleに限らず、自分が管理しているプログラムや設定ファイルで、他の人が作成したプログラムを利用したいような場合に、gitでは、submoduleを管理する機能が提供されています。
参考：[7.11 Git のさまざまなツール - サブモジュール](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)

neobundleを例に取ると、以下のようにsubmoduleとしてneobundleを追加します。
(補足：${HOME}の.vimフォルダがdotfilesとしてgitで管理されている前提)

```
cd ${HOME}
git submodule add https://github.com/Shougo/neobundle.vim.git .vim/bundle/neobundle.vim
```

そうすると、`.gitmodules`というファイルが生成され、中身を以下の様になっていると思います。

```
[submodule ".vim/bundle/neobundle.vim"]
	path = .vim/bundle/neobundle.vim
	url = https://github.com/Shougo/neobundle.vim
```
上記は、サブモジュールとして何を利用しているか？それをどこに保存するのか？また、どこから取得するのか？といった情報がまとまっています。このファイルをdotfilesにpushしておきましょう。

これで、submoduleとして、neobundleが管理できるようになりました。

## どうやって利用するのか？
別の環境で、dotfilesを復元する場合、cloneするときに--recursiveというオプションをつけましょう。(`git submodule init``git submodule update`する方法もあります。)

```
cd ${HOME}
git clone --recursive https://github.com/yukimura1227/dotfiles.git
# 自分の場合は、各種.XXファイルは、dotfiles配下のものにシンボリックリンクを貼るようにしているので、さらに、以下のshellを打つ
sh ${HOME}/dotfiles/create_link_to_dotfiles.sh
```

上記のように、--recursiveを付与してcloneすると、自動的にsubmoduleの初期化と取得を実施してくれます。

githubでdotfilesを長らく管理している人や、gitを昔から愛用している人にとっては、git submoduleは常識なんだと思いますが、私はにわかだったりするので、git管理しているディレクトリに他のgit管理されているものをcloneしてどうしよう。。。ってなってました。
とても勉強になりました。