~/git/www/index.htmlを保存したら、/var/www/index.htmlにコピーするみたいなことをやる。

コピー先に書き込み権限がないと失敗するので、権限は与えておく。

" vimrc全体で使うaugroup
augroup MyVimrc
    autocmd!
augroup END

" autocmdの設定
function! SetAutocmdSyncSaveDir(sync_save_dir_list) abort
    for sync_save_dir in a:sync_save_dir_list
        if len(glob(sync_save_dir['glob'])) == 0
            echoerr 'no match glob'
        endif

        execute 'autocmd MyVimrc BufWritePost ' . sync_save_dir['glob']
        \   . ' call s:syncSaveDir("' . sync_save_dir['from'] . '", "' . sync_save_dir['to'] . '")'
    endfor
endfunction

" コピーするための関数
function! s:syncSaveDir(from, to)
    let l:current_file = expand('%:p')
    " カレントファイルのフルパスのfrom部分をtoに置換する。
    " バックスラッシュをエスケープする必要あり
    let l:target_file = substitute(l:current_file, escape(a:from, '\'), a:to , '')
    let l:target_dir = fnamemodify(l:target_file, ':h')

    if !isdirectory(l:target_dir)
        call mkdir(l:target_dir, 'p')
    endif

    call writefile(readfile(l:current_file, 'b'), l:target_file, 'b')
endfunction

let s:sync_save_dir_list = [
\    {
\      'glob' : '~/git/www/**/*',
\      'from' : expand('~/git/www/'),
\      'to'   : '/var/www/',
\    }
\]

call SetAutocmdSyncSaveDir(s:sync_save_dir_list)
  • globにautocmdを発動させたいグロブを設定する
  • fromにコピー元を、toにコピー先を設定する
  • 設定は絶対パスで。~を使う場合はexpandしてやる
  • FreeBsdでは/homeが/usr/homeのシンボリックリンクだったりするので~をexpandで展開してやるほうが無難。
  • windowsの場合はC:などから始める。set shellslashしている場合はスラッシュ、してない場合はバックスラッシュでディレクトリを区切る

てな感じで。

関連