Ansibleによるvim環境構築
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
最近個人で使っている Mac mini のバックアップを取り、OSXをクリーンインストールする機会がありました。
これを機に開発周りのOSXでの環境構築をほぼ自動化できるようAnsibleのplaybookを作成し、brewやbrew-caskを用いてCLI及びデスクトップアプリケーションのインストールを自動化しました。プロビジョニングの際に用いたplaybookは下記レポジトリに公開してあります。
最近vim界隈ではNeoBundle作者の@ShougoMatsuさんによる新しいパッケージマネージャーDein.vimが発表され、作者もそちらに移行するようアナウンスしているようなので、Dein.vimによるpluginの管理を vars/main.yml 配下で一元管理する機能をもったroleを作成し、vimの環境構築もansibleで管理するようにしてみました。
本記事ではこの中のvimの環境構築用のroleを中心に見ていきます。
尚、このplaybookを作成するにあたって、brew, brew-caskまわりのrole作成には
HomebrewとAnsibleでMacの開発環境構築を自動化する
に大変お世話になりました。ありがとうございます。
roleの解説
ansibleのvimロール配下ディレクトリ構成です
1 2 3 4 5 6 7 | └── vim ├── tasks │ └── main.yml ├── templates │ └── .vimrc.j2 └── vars └── main.yml |
まず、tasks/main.yml を見てみます
tasks/main.yml
1 2 3 4 5 6 7 8 9 10 | ---- name: dein.vim file directory file: path={{ dein_vim_dest }} state=directory- name: clone dein.vim repo git: repo=https://github.com/Shougo/dein.vim.git dest={{ dein_vim_dest }}- name: generate .vimrc with plugins template: src=.vimrc.j2 dest=~/.vimrc when: vim_plugins |
l2. dein.vim file directory
dein.vimのインストールされるディレクトリを作成します。このなかの dein_vim_dest は vars/main.yml で定義される定数です。
l5. clone dein.vim repo
dein.vimのレポジトリから先ほど作成したディレクトリにgit cloneしてきます
l8. generate .vimrc with plugins
vim_plugins 定数(これも vars/main.yml で定義される定数)と templates/.vimrc.j2 にもとづいて、インストールされるプラグインのリストが記述された .vimrc がホームディレクトリ配下に作成されます。
続いて templates/.vimrc.j2 の dein.vim プラグインインストールに関わる部分を見てみます。
templates/.vimrc.j2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | " Required:set runtimepath^={{ dein_vim_dest }}" Required:call dein#begin(expand('{{ dein_vim_dest }}'))" Let dein manage dein" Required:call dein#add('Shougo/dein.vim')" Add or remove your plugins here:{% for plugin in vim_plugins %}{% if plugin.revision is defined %}call dein#add('{{ plugin.name }}', { 'rev': '{{ plugin.revision }}' }){% else %}call dein#add('{{ plugin.name | default(plugin) }}'){% endif %}{% endfor %}" Required:call dein#end()" Required:filetype plugin indent on" If you want to install not installed plugins on startup.if dein#check_install() call dein#install()endif |
キモとなる部分は l12~l18の部分で、jinja2テンプレートによって vars/main.yml 内の vim_plugins 定数に宣言されるリストが dein.vim のプラグインをインストールする以下の様な記述に書き換えられます
1 2 3 | call dein#add('Shougo/neosnippet.vim')call dein#add('Shougo/neosnippet-snippets')call dein#add('Shougo/vimshell', { 'rev': 3787e5 }) |
vimを起動するときにpluginのチェックが行われ、インストールされていないプラグインがあればdein.vimによってインストールされます。
vars/main.yml
1 2 3 4 5 6 | dein_vim_dest: ~/Sources/Provision/Github/DeinVimvim_plugins: - Shougo/neosnippet.vim - Shougo/neosnippet-snippets - { name: Shougo/vimshell, revision: 3787e5 } - scrooloose/nerdtree |
このファイルではタスク実行時に参照される定数を宣言します。
dein_vim_dest: これは dein.vim のインストール先のディレクトリを表しますvim_plugins: dein.vim によってインストールするpluginのリストを表します。revisionでバージョン指定も可能です。
まとめ
vim環境を構築するためのroleは以上になります。私はあまり肥大化した.vimrcを管理したくない派なのですが、vim_pluginsにインストールしたいパッケージを追加するだけでいいので目にも優しく、大変助かっています。