Writing Appropriately

職務経歴

Vim 特定ディレクトリ(サブディレクトリも含む)のファイルを保存時に自動的にアップロードするプラグインを書いた

既存のもので良いものを見つけられなかったので書いた Netrwをそのまま利用する被せ物

IntelliJ,Netbeans,AptanaなどIDEはプロジェクト内のファイルを保存時にアップロード、リモート編集時はローカルにダウンロードする同期機能がある

自分は「ローカル→リモートへの同期」のみ使うのでそれをVimでも行いたかった

開発はIntelliJを使ってます 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

GitHub

github.com