Windows に初めから用意されている ftp.exe を利用してサイトを更新するなら、データを(同じフォルダ構造で)ローカルに保存しているフォルダを cmd.exe の subst コマンドを使って仮想ドライブ化するといろいろと便利。
上記の例だと、D:\website というフォルダを W ドライブに指定している。
Vim で HTML ファイルを編集したそばから Vim script の関数を呼び出して手軽にアップロードする。
せっかくだから、カレントウインドウ上に開かれているすべてのファイルを一気にアップロードしてみよう。
なお、アップロードするファイルをうっかりミスらないよう、カレントディレクトリと対象のファイルが同じドライブになければエラーを出すようにした。
let hostname = '' "FTP ホスト名 let username = '' "FTP ユーザー名 let password = '' "ログインパスワード let driveletter = '' "subst で設定したドライブレター function! FtpUpload(mode=demo) let lcd = expand("%:p:h") if (lcd[0] != g:driveletter) echo 'Error! This buffer has a different drive letter' return endif let cmd = ['open ' .g:hostname, g:username, g:password, 'lcd ' .lcd, 'cd /'] "カレントバッファをアップロード if a:mode == "" let filename = substitute(substitute(expand("%:p"), "\\", "/", "g"), "^.:/", "", "") call add(cmd, 'put ' .'/' .filename ." " .filename) endif "カレントウインドウのすべてのバッファをアップロード if a:mode == "windo" let filename = [] windo call add(filename, \ substitute(substitute(expand("%:p"), "\\", "/", "g"), "^.:/", "", "")) for i in range(len(filename)) call add(cmd, 'put ' .'/' .filename[i] .' ' .filename[i]) endfor endif call add(cmd, 'bye') let tmp = tempname() call writefile(cmd, tmp) call system('ftp -i -s:' .tmp) call delete(tmp) echo 'uploaded' return 1 endfunction
この例だと、call FtpUpload("") でカレントバッファのファイルを、call FtpUpload("windo") でカレントウインドウに開いているすべてのファイルをアップロードする。
ちなみにこれは cmd のバッチを一時ファイルに書き出して実行しているので(その後削除)、 vim エンジンでアップロードしているわけではない。