Vim 特定ディレクトリ(サブディレクトリも含む)のファイルを保存時に自動的にアップロードするプラグインを書いた
既存のもので良いものを見つけられなかったので書いた Netrwをそのまま利用する被せ物
IntelliJ,Netbeans,AptanaなどIDEはプロジェクト内のファイルを保存時にアップロード、リモート編集時はローカルにダウンロードする同期機能がある
自分は「ローカル→リモートへの同期」のみ使うのでそれをVimでも行いたかった
概要
BuffWritePre時に対応するリモートファイルへNwriteする
function
function | operation |
---|---|
autoupload#UploadFile() | バッファをリモートへ保存 |
autoupload#OpenRemoteFile(...) | リモートファイルを開く 引数で開き方を指定可(diff splitなど) |
autoupload#OpenRemoteDirectory(...) | リモートディレクトリを開く 引数で開き方を指定可(tabe vsplitなど) |
autoupload#ReplaceLocalWithRemote() | バッファのファイルをリモートファイルへ置換 |
動作確認
OS | APP | res |
---|---|---|
CentOS7.5 | Neovim 0.2.2 | ◯ |
macOS High Sierra | MacVim 8.0 | ◯ |
macOS High Sierra | Neovim 0.2.2 | ◯ |
macOS High Sierra | vim 8.0 | ◯ |
Windows10 | KaoriYa Vim 8.0 | ◯ |
How to use
Settings
add ~/.vimrc
" autoupload plugin let g:sync_enable = 1 "<- 有効化 let g:sync_settings = '~/.vim/.autoupload' "<- 設定ファイル let g:sync_logfile = '' "<- アップロードログファイル let g:sync_upload_confirm = 1 "<- アップロードの確認メッセージを表示する let g:sync_replace_confirm = 1 "<- 置換時の確認メッセージを表示する let g:sync_default_open_command_remotedirectory = 'leftabove vsplit' let g:sync_default_open_command_remotefile = 'leftabove vsplit' " netrw let g:netrw_uid = '' "<- プラグインによって上書きされる let g:netrw_passwd = '' "<- プラグインによって上書きされる let g:netrw_list_cmd = '' "<- プラグインによって上書きされる let g:netrw_quiet = 0 " macOS let g:netrw_scp_cmd = 'scp' let g:netrw_ssh_cmd = 'ssh' " windows機で公開鍵認証方式などにssh-agentとしてpageant.exeを利用する場合はplink.exeが必要 let g:netrw_scp_cmd = '"C:\\Program Files\\PuTTY\\pscp.exe"' let g:netrw_ssh_cmd = '"C:\\Program Files\\PuTTY\\plink.exe"' " コマンドサンプル command! EnableAutoUpload call autoupload#EnableAutoUpload() command! DissconnectAutoUpload call autoupload#DissconnectAutoUpload() command! UploadFile call autoupload#UploadFile() command! OpenRemoteFile call autoupload#OpenRemoteFile() command! OpenRemoteDirectory call autoupload#OpenRemoteDirectory() command! OpenRemoteFileDiff call autoupload#OpenRemoteFile('vertical diffsplit') command! ReplaceLocalWithRemote call autoupload#ReplaceLocalWithRemote()
add ~/.vimrc || create ~/.vim/.sync
- ~/.vimrcか設定ファイルにローカルディレクトリをキー値とした辞書g:autouploadを書く
- ユーザーIDやパスワードはオプションで、空にすると必要な時に入力画面がでる
- ssh-agentを使って公開鍵認証方式で接続するためuidやpasswdの入力の必要がない場合は'NOTUSE'とする
- 'list'はリモートディレクトリを開くautoupload#OpenRemoteDirectoryのために必要
- 'list'の文字列"#####"はプラグインが相対パスに置換する
let g:autoupload = { \ '/dev/project1/':{ \ 'remote':'ftp://miracle-bug.com//public_html' \ 'uid':'' \ }, \ '/dev/project2':{ \ 'remote':'sftp://miracle-bug.com:9999//dev/abc/xyz/', \ 'uid':'NOTUSE', \ 'passwd':'NOTUSE' \ }, \ 'C:\dev\project3\fuel':{ \ 'remote':'scp://miracle-bug.com:9999//web/fuel/', \ 'uid':'user3', \ 'passwd':'NOTUSE', OSx,linux \ 'list':'ssh -p 9999 user3@miracle-bug.com "cd "#####";ls -Fa"' Windows \ 'list':'"C:\Program Files\PuTTY\plink.exe" -P 9999 user3@miracle-bug.com "cd "#####" ;ls -Fa"' \ } \}
command
call autoupload#UploadFile()
単純に':Nwrite'するのみ
編集中のファイルが'/dev/project1/app/bootstrap.php'なら{RELATIVE_PATH} は'app/bootstrap.php'になる
g:sync_upload_confirm = 1 の時は確認メッセージがでる
:Nwrite "ftp://miracle-bug.com//public_html/{RELATIVE_PATH}" ftp://miracle-bug.com//public_html/app/bootstrap.php"
call autoupload#OpenRemoteFile(...)
編集中のファイルに対応するリモートファイルを開く
編集中のファイルが'/dev/project1/app/bootstrap.php'なら{RELATIVE_PATH} は'app/bootstrap.php'になる
引数で開き方を変更できる
call autoupload#OpenRemoteFile('vertical diffsplit')
diffsplitなら差分を即確認できる
引数なしのデフォルトの開き方は設定可能
g:sync_default_open_command_remotefile = 'leftabove vsplit'
:vsplit "scp://miracle-bug.com:9999//web/fuel/{RELATIVE_PATH}" scp://miracle-bug.com:9999//web/fuel/app/bootstrap.php
call autoupload#OpenRemoteDirectory(...)
編集中のファイルに対応するリモートのディレクトリを開く
編集中のファイルが'/dev/project1/app/bootstrap.php'なら{RELATIVE_PATH} は'app/'になる
引数で開き方を変更可能
call autoupload#OpenRemoteDirectory('vertical diffsplit')
引数なしのデフォルトの開き方は設定可能
g:sync_default_open_command_remotedirectory = 'leftabove vsplit'
:e "scp://miracle-bug.com:9999//web/fuel/{RELATIVE_PATH}" scp://miracle-bug.com:9999//web/fuel/app/"
call autoupload#ReplaceLocalWithRemote()
編集中のファイルを対応するリモートのファイルへ置換
編集中のファイルが'/dev/project1/app/bootstrap.php'なら{RELATIVE_PATH} は'app/bootstrap.php'になる
g:sync_replace_confirm = 1 の時は確認メッセージがでる
:e "scp://miracle-bug.com:9999//web/fuel/{RELATIVE_PATH}" scp://miracle-bug.com:9999//web/fuel/app/bootstrap.php :w /dev/project1/app/bootstrap.php