Ansibleによるvim環境構築

2016.06.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

最近個人で使っている Mac mini のバックアップを取り、OSXをクリーンインストールする機会がありました。

これを機に開発周りのOSXでの環境構築をほぼ自動化できるようAnsibleのplaybookを作成し、brewやbrew-caskを用いてCLI及びデスクトップアプリケーションのインストールを自動化しました。プロビジョニングの際に用いたplaybookは下記レポジトリに公開してあります。

UsrNameu1/OSXProvision

最近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ロール配下ディレクトリ構成です

└── vim
    ├── tasks
    │   └── main.yml
    ├── templates
    │   └── .vimrc.j2
    └── vars
        └── main.yml

まず、tasks/main.yml を見てみます

tasks/main.yml

---
- 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_destvars/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

" 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 のプラグインをインストールする以下の様な記述に書き換えられます

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

dein_vim_dest: ~/Sources/Provision/Github/DeinVim
vim_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にインストールしたいパッケージを追加するだけでいいので目にも優しく、大変助かっています。

参考サイト