Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vimでローカルファイル保存時に自動でFTPアップロードするVim scriptを書いてみた

$
0
0

Vimでローカルファイル保存時に自動でFTPアップロードするVim scriptを探しましたが、
納得するものが見つけられなかったので初めて自分でVim scriptを書いてみました

車輪の再発明的なアレなので既存のもっと良いものがあれば是非教えてください

下記エントリーを参考にしました
http://d.hatena.ne.jp/y_yanbe/20071107/1194450620

■説明

  • 同期対象ディレクトリとリモートディレクトリの辞書ファイルを[g:sync_directories_file]に設定する
  • アップロード確認ダイアログでNoを選択したのち、アップロードをする場合は[:EnableSync]を実行する
  • バッファー中の同期対象ディレクトリ内のファイルを全て一括アップロードする場合は[:Bufdo w]する
  • 安全のために1インスタンス1FTP接続としている
     ※ファイルを保存時のアップロードをするかどうかのダイアログでYesを選択した時点で固定
  • WindowsのGvimの場合リモートサーバーのURLにユーザー名を入れておくとパスワードのみ聞かれる
     ※.netrcの使えないwindowsでパスワードを保存する良いやり方知りませんか?
  • MacやLinuxでは.netrcにユーザー名とパスワードを設定していないと駄目でした
  • サーバー5つ試した結果、1つがサブディレクトリのファイルのアップロードに失敗するのでサーバー側の設定なのかな・・・?


~/.vimsynclist
letg:sync_directories = {}
letg:sync_directories['D:\dev\aaaa\'] ='scp://username@ftp.xxx.jp/public_html'letg:sync_directories['D:\dev\bbbb\'] ='ftp://username@ftp.bbb.ccc.jp/var/web/'
~/.vimrc
" 保存時にSyncFileを呼び出すautocmd!BufWritePost * :call SyncFile()" 変数定義letg:sync_enable =1letg:sync_listnotfound =0letg:sync_local_dir =""letg:sync_remote_dir =""letg:sync_directories = {}
letg:sync_directories_file ='~/.vimsynclist'" アップロードの有効化
command! EnableSync call EnableSync()function! EnableSync()    " ディレクトリリストファイルが存在する場合有効化、存在しない場合通知if filereadable(expand(g:sync_directories_file))letg:sync_enable =1
        echo "synchronizing"elseletg:sync_listnotfound =1letconf=confirm("Not Found ".g:sync_directories_file,"confirm")endifendfunction" ローカルファイル変更時にアップロードfunction! SyncFile()if0==g:sync_enable
        returnendif    " ディレクトリリストファイルが存在する場合読み込み、存在しない場合通知if filereadable(expand(g:sync_directories_file))
        execute printf('source %s',g:sync_directories_file)elseif0==g:sync_listnotfound
            letconf=confirm("Not Found ".g:sync_directories_file,"confirm")endifletg:sync_listnotfound =1returnendif    " 保存を実行したファイルのパスを取得しUnix形式へletfilename= substitute(substitute(expand("%:p"),"\\","/","g"),":","","")if"/"!=filename[0]
        letfilename="/" . filenameendif    "echo "filename = " . filename    " 同期対象ディレクトリが決定していない場合=接続先が決まってない場合if""==g:sync_local_dir

        " 同期候補を選択for [local_dir, remote_dir] in items(g:sync_directories)            " 同期候補ローカルディレクトリパスをUnix形式へlet local_dir = substitute(substitute(local_dir,"\\","/","g"),":","","")if"/"!= local_dir[0]
                let local_dir ="/" . local_dir
            endif            "echo "local_dir = " . local_dir            " 保存を実行したファイルが同期候補ディレクトリ内のファイルである場合let matches = matchstr(filename, local_dir)            "echo "matches = " . matchesif""!= matches
                let choice =confirm("want to upload?","Yes\nNo")if1== choice
                    " Yesを選択した場合、同期対象ディレクトリを決定letg:sync_local_dir = local_dir
                    letg:sync_remote_dir = remote_dir
                elseif2== choice
                    letg:sync_enable =0elsereturnendifendifendforendif    " 同期対象ディレクトリが決定している場合=接続先が決まっている場合if""!=g:sync_local_dir

        " 保存を実行したファイルが同期対象ディレクトリ内のファイルである場合let matches = matchstr(filename,g:sync_local_dir)        "echo "matches = " . matchesif""!= matches

            " 相対パスを設定、パスセパレーター修正let relative_path = substitute(filename,g:sync_local_dir,"","")            "echo "relative_path = " . relative_pathif"/"!= relative_path[0]
                let relative_path ="/" . relative_path
            endifletl= strlen(g:sync_remote_dir)if"/"==g:sync_remote_dir[l-1]
                let relative_path = relative_path[1:-1]
            endiflet full_path =g:sync_remote_dir . relative_path

            echo "Nwrite " . full_path
            exec "Nwrite " . full_path

        endifendifendfunction

Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>