bit

WindowsのVIMで開発しているスクリプトをリモートのLinuxで動作確認するために半自動でSCPする

というありがちなパターン。

WinSCPがインストールされている前提で、その keepuptodate コマンドでもいいんだけど、今回は反映タイミングは制御したかったので、初VIMスクリプトの練習として書いてみた。

といっても、パスセパレータのエスケープが面倒だったんで、この記事の隠れ主題として、VIMスクリプトの中でセパレータをどこで何個書けばよいかの備忘録というのがある。

下記スクリプト呼び出されている WinSCP スクリプト(sync.winscp)はリモートに接続して、syncしたりputしたりしてclose→exitするものであれば何でもよく、このVIMスクリプトと同じディレクトリに置いておくように記載している。

" Sync
let s:winscp = 'C:\\Program Files (x86)\\WinSCP\\WinSCP.exe'
let s:script_filepath = expand('%:h') . '\sync.winscp'

function! Sync()
  let l:script_filepath = substitute(s:script_filepath, '\\', '\\\\', 'g')

  let l:command =
\   printf('call system("\"%s\" /console /script=\"%s\"")',
\   s:winscp, l:script_filepath)

  execute l:command
endfunction

command! Sync :call Sync()

んで、VIMを起動したときに最初にこのスクリプトを source しておくと、開発したスクリプトをリモートのLinuxに持っていきたいときに :Sync とするだけでそれができる。

(追記)
Windowsでも、Cygwinなどの scp.exe がインストールされていてパスが適切に設定されていれば、:edit scp://~ でリモートのファイルを透過的に編集できるらしい。まあいいや。VIMスクリプトのいい練習になったのでよしとする。