牢獄機械文書群 目次 » 計算機 » 現在地
Vim から FTP アップロード
2012-04-26 18:02

Windows に初めから用意されている ftp.exe を利用してサイトを更新するなら、データを(同じフォルダ構造で)ローカルに保存しているフォルダを cmd.exe の subst コマンドを使って仮想ドライブ化するといろいろと便利。

subst W: D:\website

上記の例だと、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 エンジンでアップロードしているわけではない。

« もどる
inserted by FC2 system