basyura's blog

あしたになったらほんきだす。

rake で vim 環境を同期する

rake でなくてもいいんだ。Rakefile を書いてみたかっただけなんだ。

複数の環境(windows(cygwin) × 3 , mac)で vim 環境の同期を取りたい場合に検討が必要なもの。

  • vimrc , gvimrc
  • vimonline に登録されているフォルダ分割されている plugin
  • vimonline に登録されている vba
  • そのへんにアップされているフォルダ分割されている plugin
  • そのへんにアップされている vba
  • github に登録されている plugin

正直、vba がいちばんうざい。github を使ってどう管理するか。今のフォルダ構成。

.vim
|-- README
|-- Rakefile
|-- source.list
|-- bin
|-- autoload
|-- backup
|-- colors
|-- dict
|-- doc
|-- ftplugin
|-- indent
|-- plugin
|-- gitplugins
|   |-- deleteme
|   |-- fakecygpty
|   |-- git-vim
|   |-- hatena-vim
|   |-- lingr-vim
|   |-- neocomplcache
|   |-- quickrun
|   |-- unite.vim
|   |-- vim-altercmd
|   |-- vim-rails
|   |-- vimfiler
|   |-- vimproc
|   `-- vimshell
|-- plugins
|   |-- refe
|   |-- restart
|   |-- scratch
|   |-- vim-fuzzyfinder
|   `-- vim-l9
|-- proc
|   |-- cygwin
|   |   `-- proc.dll
|   |-- mac
|   |   `-- proc.so
|   `-- windows
|       `-- proc.dll
|-- rc
|   |-- gvimrc
|   `-- vimrc
|-- snippets
|-- swp
`-- syntax

.vimrc の runtimepath 設定

set runtimepath+=~/.vim
set runtimepath+=~/.vim/plugins/*
set runtimepath+=~/.vim/gitplugins/*
let g:vimball_home = "~/.vim"

vimrc , gvimrc

rc フォルダに登録して自分のリポジトリで管理。環境ごとに個別の設定が必要な場合は個別の設定ファイルを用意して vimrc から読み込ませる。

if filereadable($HOME . '/.vimrc_secret')
  source ~/.vimrc_secret
endif

.vimrc_local って名前の方がいいと思うけど、もともとパスワードを保存していた名残。

vimonline に登録されているフォルダ分割されているスクリプト

plugins フォルダ配下に登録して自分のリポジトリで管理。最新版があった場合は手動で上書きしてコミット。最新版が出ても検知しづらいのが難点。

vimonline に登録されている vba

正直爆発して欲しい。g:vimball_home に .vim を指定しているので、autoload、plugin、syntax といったフォルダに自動展開される。基本的にそのままコミットして自分のリポジトリで管理。ファイル数が多い場合は plugins フォルダ配下に専用フォルダを作って手動配置。めんどくさい。

そのへんにアップされているフォルダ分割されている plugin

plugins フォルダ配下に登録して自分のリポジトリで管理。最新版があった場合は手動で上書きしてコミット。最新版が出ても検知しづらいのが難点。

そのへんにアップされている vba

爆発してほしい。vimonline の vba と同様

github に登録されている plugin

自分のリポジトリ配下に他人のリポジトリをコミットすることはできないので、gitplugins ディレクトリ配下に github から clone して配置。一個ずつ pull するのがめんどいので 全部 pull してくれるバッチを書いた。

まとめて rake

ここまできて、各環境ごとに入れている github の plugin を同期できないことに気がつく。ある端末に入ってるプラグインが別の端末に入ってなかったり。
解決策として git のリポジトリを書いた source.list を作って、該当の plugin が gitplugins フォルダ配下に無い場合は clone 、有る場合は pull する Rakefile を書いた。ついでに、リポジトリの最新化も入れた。ごりごりの Ruby script だけど・・・。

# -*- coding: utf-8 -*-

task :default => "all_update"

task :all_update => [:pull_vimfiles , :clone_github , :update_github] do
end

task :pull_vimfiles do
  puts ""
  puts ">>> pull vimfiles ..."
  puts `git pull`
end

task :clone_github do
  puts ""
  puts ">>> check github repositories ..."
  f = open("source.list" , "r")
  f.read.each_line do |line|
    line.chomp!
    path = "./gitplugins/#{line.split(/\//)[-1]}".sub(/\.git/ , "")
    if File.exist?(path)
      puts "#{path} ... ok"
    else
      puts "#{path} ... no"
      Dir.chdir("gitplugins")
      `git clone #{line}`
      Dir.chdir("..")
    end
  end
  f.close
end

task :update_github do
  puts ""
  puts ">>> pull github repositories ..."
  Dir.chdir("gitplugins")
  Dir.glob("*") do |d|
    next unless File.directory? d
    Dir.chdir(d)
    puts ""
    puts "pull #{d} ..."
    puts `git pull`
    Dir.chdir("..")
  end
  Dir.chdir("..")
end

これで、毎朝 rake をするだけで家で作った環境を会社ですぐに同期することができるようになって超便利!
次は vimonline に登録されている plugin の同期をどうにかしたいと思っている。