Vimでローカルファイル保存時に自動でFTPアップロードするVim scriptを探しましたが、
納得するものが見つけられなかったので初めて自分でVim scriptを書いてみました
車輪の再発明的なアレなので既存のもっと良いものがあれば是非教えてください
下記エントリーを参考にしました
http://d.hatena.ne.jp/y_yanbe/20071107/1194450620
■説明
- 同期対象ディレクトリとリモートディレクトリの辞書ファイルを[g:sync_directories_file]に設定する
- アップロード確認ダイアログでNoを選択したのち、アップロードをする場合は[:EnableSync]を実行する
- バッファー中の同期対象ディレクトリ内のファイルを全て一括アップロードする場合は[:Bufdo w]する
- 安全のために1インスタンス1FTP接続としている
※ファイルを保存時のアップロードをするかどうかのダイアログでYesを選択した時点で固定 - WindowsのGvimの場合リモートサーバーのURLにユーザー名を入れておくとパスワードのみ聞かれる
※.netrcの使えないwindowsでパスワードを保存する良いやり方知りませんか? - MacやLinuxでは.netrcにユーザー名とパスワードを設定していないと駄目でした
- サーバー5つ試した結果、1つがサブディレクトリのファイルのアップロードに失敗するのでサーバー側の設定なのかな・・・?
~/.vimsynclist
letg:sync_directories = {}
letg:sync_directories['D:\dev\aaaa\'] ='scp://username@ftp.xxx.jp/public_html'letg:sync_directories['D:\dev\bbbb\'] ='ftp://username@ftp.bbb.ccc.jp/var/web/'
~/.vimrc
" 保存時にSyncFileを呼び出すautocmd!BufWritePost * :call SyncFile()" 変数定義letg:sync_enable =1letg:sync_listnotfound =0letg:sync_local_dir =""letg:sync_remote_dir =""letg:sync_directories = {}
letg:sync_directories_file ='~/.vimsynclist'" アップロードの有効化
command! EnableSync call EnableSync()function! EnableSync() " ディレクトリリストファイルが存在する場合有効化、存在しない場合通知if filereadable(expand(g:sync_directories_file))letg:sync_enable =1
echo "synchronizing"elseletg:sync_listnotfound =1letconf=confirm("Not Found ".g:sync_directories_file,"confirm")endifendfunction" ローカルファイル変更時にアップロードfunction! SyncFile()if0==g:sync_enable
returnendif " ディレクトリリストファイルが存在する場合読み込み、存在しない場合通知if filereadable(expand(g:sync_directories_file))
execute printf('source %s',g:sync_directories_file)elseif0==g:sync_listnotfound
letconf=confirm("Not Found ".g:sync_directories_file,"confirm")endifletg:sync_listnotfound =1returnendif " 保存を実行したファイルのパスを取得しUnix形式へletfilename= substitute(substitute(expand("%:p"),"\\","/","g"),":","","")if"/"!=filename[0]
letfilename="/" . filenameendif "echo "filename = " . filename " 同期対象ディレクトリが決定していない場合=接続先が決まってない場合if""==g:sync_local_dir
" 同期候補を選択for [local_dir, remote_dir] in items(g:sync_directories) " 同期候補ローカルディレクトリパスをUnix形式へlet local_dir = substitute(substitute(local_dir,"\\","/","g"),":","","")if"/"!= local_dir[0]
let local_dir ="/" . local_dir
endif "echo "local_dir = " . local_dir " 保存を実行したファイルが同期候補ディレクトリ内のファイルである場合let matches = matchstr(filename, local_dir) "echo "matches = " . matchesif""!= matches
let choice =confirm("want to upload?","Yes\nNo")if1== choice
" Yesを選択した場合、同期対象ディレクトリを決定letg:sync_local_dir = local_dir
letg:sync_remote_dir = remote_dir
elseif2== choice
letg:sync_enable =0elsereturnendifendifendforendif " 同期対象ディレクトリが決定している場合=接続先が決まっている場合if""!=g:sync_local_dir
" 保存を実行したファイルが同期対象ディレクトリ内のファイルである場合let matches = matchstr(filename,g:sync_local_dir) "echo "matches = " . matchesif""!= matches
" 相対パスを設定、パスセパレーター修正let relative_path = substitute(filename,g:sync_local_dir,"","") "echo "relative_path = " . relative_pathif"/"!= relative_path[0]
let relative_path ="/" . relative_path
endifletl= strlen(g:sync_remote_dir)if"/"==g:sync_remote_dir[l-1]
let relative_path = relative_path[1:-1]
endiflet full_path =g:sync_remote_dir . relative_path
echo "Nwrite " . full_path
exec "Nwrite " . full_path
endifendifendfunction