Weiyi Lou 10 лет назад
Родитель
Сommit
e1d813d207
3 измененных файлов с 140 добавлено и 95 удалено
  1. 137 93
      vim/autoload/plug.vim
  2. 2 1
      vim/plugins.vim
  3. 1 1
      zsh/oh-my-zsh

+ 137 - 93
vim/autoload/plug.vim

@@ -26,7 +26,7 @@
 "
 "
 "   " Using a non-master branch
 "   " Using a non-master branch
 "   Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
 "   Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' }
-
+"
 "   " Plugin options
 "   " Plugin options
 "   Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
 "   Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
 "
 "
@@ -117,13 +117,13 @@ function! s:define_commands()
   if !executable('git')
   if !executable('git')
     return s:err('`git` executable not found. vim-plug requires git.')
     return s:err('`git` executable not found. vim-plug requires git.')
   endif
   endif
-  command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install('<bang>' == '!', [<f-args>])
-  command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate  call s:update('<bang>' == '!', [<f-args>])
-  command! -nargs=0 -bar -bang PlugClean call s:clean('<bang>' == '!')
+  command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>])
+  command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate  call s:update(<bang>0, [<f-args>])
+  command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0)
   command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
   command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif
   command! -nargs=0 -bar PlugStatus  call s:status()
   command! -nargs=0 -bar PlugStatus  call s:status()
   command! -nargs=0 -bar PlugDiff    call s:diff()
   command! -nargs=0 -bar PlugDiff    call s:diff()
-  command! -nargs=? -bar PlugSnapshot call s:snapshot(<f-args>)
+  command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>)
 endfunction
 endfunction
 
 
 function! s:to_a(v)
 function! s:to_a(v)
@@ -146,6 +146,16 @@ function! s:assoc(dict, key, val)
   let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
   let a:dict[a:key] = add(get(a:dict, a:key, []), a:val)
 endfunction
 endfunction
 
 
+function! s:ask(message)
+  call inputsave()
+  echohl WarningMsg
+  let proceed = input(a:message.' (y/N) ') =~? '^y'
+  echohl None
+  call inputrestore()
+  echo "\r"
+  return proceed
+endfunction
+
 function! plug#end()
 function! plug#end()
   if !exists('g:plugs')
   if !exists('g:plugs')
     return s:err('Call plug#begin() first')
     return s:err('Call plug#begin() first')
@@ -521,16 +531,20 @@ function! s:syntax()
   syn match plugStar /^*/
   syn match plugStar /^*/
   syn match plugMessage /\(^- \)\@<=.*/
   syn match plugMessage /\(^- \)\@<=.*/
   syn match plugName /\(^- \)\@<=[^ ]*:/
   syn match plugName /\(^- \)\@<=[^ ]*:/
+  syn match plugSha /\%(: \)\@<=[0-9a-z]\{4,}$/
+  syn match plugTag /(tag: [^)]\+)/
   syn match plugInstall /\(^+ \)\@<=[^:]*/
   syn match plugInstall /\(^+ \)\@<=[^:]*/
   syn match plugUpdate /\(^* \)\@<=[^:]*/
   syn match plugUpdate /\(^* \)\@<=[^:]*/
-  syn match plugCommit /^  [0-9a-z]\{7} .*/ contains=plugRelDate,plugSha
+  syn match plugCommit /^  [0-9a-z]\{7} .*/ contains=plugRelDate,plugSha,plugTag
   syn match plugSha /\(^  \)\@<=[0-9a-z]\{7}/ contained
   syn match plugSha /\(^  \)\@<=[0-9a-z]\{7}/ contained
   syn match plugRelDate /([^)]*)$/ contained
   syn match plugRelDate /([^)]*)$/ contained
   syn match plugNotLoaded /(not loaded)$/
   syn match plugNotLoaded /(not loaded)$/
   syn match plugError /^x.*/
   syn match plugError /^x.*/
+  syn match plugH2 /^.*:\n-\+$/
   syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
   syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean
   hi def link plug1       Title
   hi def link plug1       Title
   hi def link plug2       Repeat
   hi def link plug2       Repeat
+  hi def link plugH2      Type
   hi def link plugX       Exception
   hi def link plugX       Exception
   hi def link plugBracket Structure
   hi def link plugBracket Structure
   hi def link plugNumber  Number
   hi def link plugNumber  Number
@@ -547,6 +561,7 @@ function! s:syntax()
   hi def link plugError   Error
   hi def link plugError   Error
   hi def link plugRelDate Comment
   hi def link plugRelDate Comment
   hi def link plugSha     Identifier
   hi def link plugSha     Identifier
+  hi def link plugTag     Constant
 
 
   hi def link plugNotLoaded Comment
   hi def link plugNotLoaded Comment
 endfunction
 endfunction
@@ -761,7 +776,7 @@ endfunction
 function! s:update_impl(pull, force, args) abort
 function! s:update_impl(pull, force, args) abort
   let args = copy(a:args)
   let args = copy(a:args)
   let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
   let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ?
-                  \ remove(args, -1) : get(g:, 'plug_threads', s:is_win ? 1 : 16)
+                  \ remove(args, -1) : get(g:, 'plug_threads', 16)
 
 
   let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
   let managed = filter(copy(g:plugs), 's:is_managed(v:key)')
   let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
   let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') :
@@ -798,9 +813,8 @@ function! s:update_impl(pull, force, args) abort
     echohl None
     echohl None
   endif
   endif
 
 
-  let python = (has('python') || has('python3')) && !s:is_win && !has('win32unix')
-      \ && (!s:nvim || has('vim_starting'))
-  let ruby = has('ruby') && !s:nvim && (v:version >= 703 || v:version == 702 && has('patch374'))
+  let python = (has('python') || has('python3')) && (!s:nvim || has('vim_starting'))
+  let ruby = has('ruby') && !s:nvim && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running'))
 
 
   let s:update = {
   let s:update = {
     \ 'start':   reltime(),
     \ 'start':   reltime(),
@@ -903,7 +917,13 @@ function! s:job_handler(job_id, data, event) abort
   endif
   endif
 
 
   if a:event == 'stdout'
   if a:event == 'stdout'
-    let self.result .= substitute(s:to_s(a:data), '[\r\n]', '', 'g') . "\n"
+    let complete = empty(a:data[-1])
+    let lines = map(filter(a:data, 'len(v:val) > 0'), 'split(v:val, "[\r\n]")[-1]')
+    call extend(self.lines, lines)
+    let self.result = join(self.lines, "\n")
+    if !complete
+      call remove(self.lines, -1)
+    endif
     " To reduce the number of buffer updates
     " To reduce the number of buffer updates
     let self.tick = get(self, 'tick', -1) + 1
     let self.tick = get(self, 'tick', -1) + 1
     if self.tick % len(s:jobs) == 0
     if self.tick % len(s:jobs) == 0
@@ -920,7 +940,7 @@ function! s:job_handler(job_id, data, event) abort
 endfunction
 endfunction
 
 
 function! s:spawn(name, cmd, opts)
 function! s:spawn(name, cmd, opts)
-  let job = { 'name': a:name, 'running': 1, 'error': 0, 'result': '',
+  let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [], 'result': '',
             \ 'new': get(a:opts, 'new', 0),
             \ 'new': get(a:opts, 'new', 0),
             \ 'on_stdout': function('s:job_handler'),
             \ 'on_stdout': function('s:job_handler'),
             \ 'on_exit' : function('s:job_handler'),
             \ 'on_exit' : function('s:job_handler'),
@@ -1063,7 +1083,6 @@ endfunction
 function! s:update_python()
 function! s:update_python()
 let py_exe = has('python') ? 'python' : 'python3'
 let py_exe = has('python') ? 'python' : 'python3'
 execute py_exe "<< EOF"
 execute py_exe "<< EOF"
-""" Due to use of signals this function is POSIX only. """
 import datetime
 import datetime
 import functools
 import functools
 import os
 import os
@@ -1090,9 +1109,11 @@ G_CLONE_OPT = vim.eval('s:clone_opt')
 G_PROGRESS = vim.eval('s:progress_opt(1)')
 G_PROGRESS = vim.eval('s:progress_opt(1)')
 G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
 G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads'))
 G_STOP = thr.Event()
 G_STOP = thr.Event()
+G_IS_WIN = vim.eval('s:is_win') == '1'
 
 
 class PlugError(Exception):
 class PlugError(Exception):
-  pass
+  def __init__(self, msg):
+    self.msg = msg
 class CmdTimedOut(PlugError):
 class CmdTimedOut(PlugError):
   pass
   pass
 class CmdFailed(PlugError):
 class CmdFailed(PlugError):
@@ -1103,10 +1124,9 @@ class Action(object):
   INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
   INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
 
 
 class Buffer(object):
 class Buffer(object):
-  def __init__(self, lock, num_plugs, is_pull, is_win):
+  def __init__(self, lock, num_plugs, is_pull):
     self.bar = ''
     self.bar = ''
     self.event = 'Updating' if is_pull else 'Installing'
     self.event = 'Updating' if is_pull else 'Installing'
-    self.is_win = is_win
     self.lock = lock
     self.lock = lock
     self.maxy = int(vim.eval('winheight(".")'))
     self.maxy = int(vim.eval('winheight(".")'))
     self.num_plugs = num_plugs
     self.num_plugs = num_plugs
@@ -1134,8 +1154,7 @@ class Buffer(object):
 
 
     with self.lock:
     with self.lock:
       vim.command('normal! 2G')
       vim.command('normal! 2G')
-      if not self.is_win:
-        vim.command('redraw')
+      vim.command('redraw')
 
 
   def write(self, action, name, lines):
   def write(self, action, name, lines):
     first, rest = lines[0], lines[1:]
     first, rest = lines[0], lines[1:]
@@ -1164,9 +1183,12 @@ class Buffer(object):
       pass
       pass
 
 
 class Command(object):
 class Command(object):
+  CD = 'cd /d' if G_IS_WIN else 'cd'
+
   def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
   def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None):
     self.cmd = cmd
     self.cmd = cmd
-    self.cmd_dir = cmd_dir
+    if cmd_dir:
+      self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd)
     self.timeout = timeout
     self.timeout = timeout
     self.callback = cb if cb else (lambda msg: None)
     self.callback = cb if cb else (lambda msg: None)
     self.clean = clean if clean else (lambda: None)
     self.clean = clean if clean else (lambda: None)
@@ -1216,9 +1238,11 @@ class Command(object):
 
 
     try:
     try:
       tfile = tempfile.NamedTemporaryFile(mode='w+b')
       tfile = tempfile.NamedTemporaryFile(mode='w+b')
-      self.proc = subprocess.Popen(self.cmd, cwd=self.cmd_dir, stdout=tfile,
-                                   stderr=subprocess.STDOUT, shell=True,
-                                   preexec_fn=os.setsid)
+      preexec_fn = not G_IS_WIN and os.setsid or None
+      self.proc = subprocess.Popen(self.cmd, stdout=tfile,
+                                   stderr=subprocess.STDOUT,
+                                   stdin=subprocess.PIPE, shell=True,
+                                   preexec_fn=preexec_fn)
       thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
       thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,))
       thrd.start()
       thrd.start()
 
 
@@ -1236,7 +1260,7 @@ class Command(object):
 
 
         if first_line or random.random() < G_LOG_PROB:
         if first_line or random.random() < G_LOG_PROB:
           first_line = False
           first_line = False
-          line = nonblock_read(tfile.name)
+          line = '' if G_IS_WIN else nonblock_read(tfile.name)
           if line:
           if line:
             self.callback([line])
             self.callback([line])
 
 
@@ -1260,7 +1284,10 @@ class Command(object):
   def terminate(self):
   def terminate(self):
     """ Terminate process and cleanup. """
     """ Terminate process and cleanup. """
     if self.alive:
     if self.alive:
-      os.killpg(self.proc.pid, signal.SIGTERM)
+      if G_IS_WIN:
+        os.kill(self.proc.pid, signal.SIGINT)
+      else:
+        os.killpg(self.proc.pid, signal.SIGTERM)
     self.clean()
     self.clean()
 
 
 class Plugin(object):
 class Plugin(object):
@@ -1283,7 +1310,7 @@ class Plugin(object):
         with self.lock:
         with self.lock:
           thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
           thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
     except PlugError as exc:
     except PlugError as exc:
-      self.write(Action.ERROR, self.name, [str(exc)])
+      self.write(Action.ERROR, self.name, exc.msg)
     except KeyboardInterrupt:
     except KeyboardInterrupt:
       G_STOP.set()
       G_STOP.set()
       self.write(Action.ERROR, self.name, ['Interrupted!'])
       self.write(Action.ERROR, self.name, ['Interrupted!'])
@@ -1295,6 +1322,8 @@ class Plugin(object):
 
 
   def install(self):
   def install(self):
     target = self.args['dir']
     target = self.args['dir']
+    if target[-1] == '\\':
+      target = target[0:-1]
 
 
     def clean(target):
     def clean(target):
       def _clean():
       def _clean():
@@ -1411,10 +1440,9 @@ def main():
   nthreads = int(vim.eval('s:update.threads'))
   nthreads = int(vim.eval('s:update.threads'))
   plugs = vim.eval('s:update.todo')
   plugs = vim.eval('s:update.todo')
   mac_gui = vim.eval('s:mac_gui') == '1'
   mac_gui = vim.eval('s:mac_gui') == '1'
-  is_win = vim.eval('s:is_win') == '1'
 
 
   lock = thr.Lock()
   lock = thr.Lock()
-  buf = Buffer(lock, len(plugs), G_PULL, is_win)
+  buf = Buffer(lock, len(plugs), G_PULL)
   buf_q, work_q = queue.Queue(), queue.Queue()
   buf_q, work_q = queue.Queue(), queue.Queue()
   for work in plugs.items():
   for work in plugs.items():
     work_q.put(work)
     work_q.put(work)
@@ -1471,16 +1499,20 @@ function! s:update_ruby()
 
 
   def killall pid
   def killall pid
     pids = [pid]
     pids = [pid]
-    unless `which pgrep 2> /dev/null`.empty?
-      children = pids
-      until children.empty?
-        children = children.map { |pid|
-          `pgrep -P #{pid}`.lines.map { |l| l.chomp }
-        }.flatten
-        pids += children
+    if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
+      pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil }
+    else
+      unless `which pgrep 2> /dev/null`.empty?
+        children = pids
+        until children.empty?
+          children = children.map { |pid|
+            `pgrep -P #{pid}`.lines.map { |l| l.chomp }
+          }.flatten
+          pids += children
+        end
       end
       end
+      pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
     end
     end
-    pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil }
   end
   end
 
 
   require 'thread'
   require 'thread'
@@ -1506,7 +1538,7 @@ function! s:update_ruby()
     $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
     $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})"
     $curbuf[2] = '[' + bar.ljust(tot) + ']'
     $curbuf[2] = '[' + bar.ljust(tot) + ']'
     VIM::command('normal! 2G')
     VIM::command('normal! 2G')
-    VIM::command('redraw') unless iswin
+    VIM::command('redraw')
   }
   }
   where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
   where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } }
   log   = proc { |name, result, type|
   log   = proc { |name, result, type|
@@ -1618,8 +1650,8 @@ function! s:update_ruby()
           exists = File.directory? dir
           exists = File.directory? dir
           ok, result =
           ok, result =
             if exists
             if exists
-              dir = iswin ? dir : esc(dir)
-              ret, data = bt.call "#{cd} #{dir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url", nil, nil, nil
+              chdir = "#{cd} #{iswin ? dir : esc(dir)}"
+              ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config remote.origin.url", nil, nil, nil
               current_uri = data.lines.to_a.last
               current_uri = data.lines.to_a.last
               if !ret
               if !ret
                 if data =~ /^Interrupted|^Timeout/
                 if data =~ /^Interrupted|^Timeout/
@@ -1635,7 +1667,7 @@ function! s:update_ruby()
                 if pull
                 if pull
                   log.call name, 'Updating ...', :update
                   log.call name, 'Updating ...', :update
                   fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
                   fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : ''
-                  bt.call "#{cd} #{dir} && git fetch #{fetch_opt} #{progress} 2>&1 && git checkout -q #{checkout} 2>&1 && git merge --ff-only #{merge} 2>&1 && #{subm}", name, :update, nil
+                  bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1 && git checkout -q #{checkout} 2>&1 && git merge --ff-only #{merge} 2>&1 && #{subm}", name, :update, nil
                 else
                 else
                   [true, skip]
                   [true, skip]
                 end
                 end
@@ -1800,10 +1832,7 @@ function! s:clean(force)
   if empty(todo)
   if empty(todo)
     call append(line('$'), 'Already clean.')
     call append(line('$'), 'Already clean.')
   else
   else
-    call inputsave()
-    let yes = a:force || (input('Proceed? (y/N) ') =~? '^y')
-    call inputrestore()
-    if yes
+    if a:force || s:ask('Proceed?')
       for dir in todo
       for dir in todo
         call s:rm_rf(dir)
         call s:rm_rf(dir)
       endfor
       endfor
@@ -1969,41 +1998,63 @@ function! s:section(flags)
   call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
   call search('\(^[x-] \)\@<=[^:]\+:', a:flags)
 endfunction
 endfunction
 
 
-function! s:diff()
-  call s:prepare()
-  call append(0, 'Collecting updated changes ...')
-  normal! gg
-  redraw
+function! s:format_git_log(line)
+  let [sha, refs, subject, date] = split(a:line, nr2char(1))
+  let tag = matchstr(refs, 'tag: [^,)]\+')
+  let tag = empty(tag) ? ' ' : ' ('.tag.') '
+  return printf('  %s%s%s (%s)', sha, tag, subject, date)
+endfunction
 
 
-  let cnt = 0
-  for [k, v] in filter(items(g:plugs), '!has_key(v:val[1], "commit")')
-    if !isdirectory(v.dir) || !s:is_managed(k)
-      continue
-    endif
+function! s:append_ul(lnum, text)
+  call append(a:lnum, ['', a:text, repeat('-', len(a:text))])
+endfunction
 
 
-    let diff = s:system_chomp('git log --pretty=format:"%h %s (%cr)" "HEAD...HEAD@{1}"', v.dir)
-    if !empty(diff)
-      call append(1, '')
-      call append(2, '- '.k.':')
-      call append(3, map(s:lines(diff), '"  ". v:val'))
-      let cnt += 1
-      normal! gg
+function! s:diff()
+  call s:prepare()
+  call append(0, ['Collecting changes ...', ''])
+  let cnts = [0, 0]
+  let bar = ''
+  let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)')
+  call s:progress_bar(2, bar, len(total))
+  for origin in [1, 0]
+    call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:')
+    for [k, v] in reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))'))))
+      let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..'
+      let diff = s:system_chomp('git log --pretty=format:"%h%x01%d%x01%s%x01%cr" '.s:shellesc(range), v.dir)
+      if !empty(diff)
+        let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : ''
+        call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)')))
+        let cnts[origin] += 1
+      endif
+      let bar .= '='
+      call s:progress_bar(2, bar, len(total))
+      normal! 2G
       redraw
       redraw
+    endfor
+    if !cnts[origin]
+      call append(5, ['', 'N/A'])
     endif
     endif
   endfor
   endfor
+  call setline(1, printf('%d plugin(s) updated.', cnts[0])
+        \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : ''))
 
 
-  call setline(1, cnt == 0 ? 'No updates.' : 'Last update:')
-  nnoremap <silent> <buffer> <cr> :silent! call <SID>preview_commit()<cr>
-  nnoremap <silent> <buffer> o    :silent! call <SID>preview_commit()<cr>
-  nnoremap <silent> <buffer> X    :call <SID>revert()<cr>
-  normal! gg
-  setlocal nomodifiable
-  if cnt > 0
+  if cnts[0] || cnts[1]
+    nnoremap <silent> <buffer> <cr> :silent! call <SID>preview_commit()<cr>
+    nnoremap <silent> <buffer> o    :silent! call <SID>preview_commit()<cr>
+  endif
+  if cnts[0]
+    nnoremap <silent> <buffer> X :call <SID>revert()<cr>
     echo "Press 'X' on each block to revert the update"
     echo "Press 'X' on each block to revert the update"
   endif
   endif
+  normal! gg
+  setlocal nomodifiable
 endfunction
 endfunction
 
 
 function! s:revert()
 function! s:revert()
+  if search('^Pending updates', 'bnW')
+    return
+  endif
+
   let name = s:find_name(line('.'))
   let name = s:find_name(line('.'))
   if empty(name) || !has_key(g:plugs, name) ||
   if empty(name) || !has_key(g:plugs, name) ||
     \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
     \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y'
@@ -2017,42 +2068,35 @@ function! s:revert()
   echo 'Reverted.'
   echo 'Reverted.'
 endfunction
 endfunction
 
 
-function! s:snapshot(...) abort
-  let home = get(s:, 'plug_home_org', g:plug_home)
-  let [type, var, header] = s:is_win ?
-    \ ['dosbatch', '%PLUG_HOME%',
-    \   ['@echo off', ':: Generated by vim-plug', ':: '.strftime("%c"), '',
-    \    ':: Make sure to PlugUpdate first', '', 'set PLUG_HOME='.home]] :
-    \ ['sh', '$PLUG_HOME',
-    \   ['#!/bin/sh',  '# Generated by vim-plug', '# '.strftime("%c"), '',
-    \    'vim +PlugUpdate +qa', '', 'PLUG_HOME='.s:esc(home)]]
-
+function! s:snapshot(force, ...) abort
   call s:prepare()
   call s:prepare()
-  execute 'setf' type
-  call append(0, header)
-  call append('$', '')
+  setf vim
+  call append(0, ['" Generated by vim-plug',
+                \ '" '.strftime("%c"),
+                \ '" :source this file in vim to restore the snapshot',
+                \ '" or execute: vim -S snapshot.vim',
+                \ '', '', 'PlugUpdate!'])
   1
   1
-  redraw
-
-  let dirs = sort(map(values(filter(copy(g:plugs),
-        \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')), 'v:val.dir'))
-  let anchor = line('$') - 1
-  for dir in reverse(dirs)
-    let sha = s:system_chomp('git rev-parse --short HEAD', dir)
+  let anchor = line('$') - 3
+  let names = sort(keys(filter(copy(g:plugs),
+        \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
+  for name in reverse(names)
+    let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir)
     if !empty(sha)
     if !empty(sha)
-      call append(anchor, printf('cd %s && git reset --hard %s',
-            \ substitute(dir, '^\V'.escape(g:plug_home, '\'), var, ''), sha))
+      call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
       redraw
       redraw
     endif
     endif
   endfor
   endfor
 
 
   if a:0 > 0
   if a:0 > 0
     let fn = expand(a:1)
     let fn = expand(a:1)
-    let fne = s:esc(fn)
+    if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?'))
+      return
+    endif
     call writefile(getline(1, '$'), fn)
     call writefile(getline(1, '$'), fn)
-    if !s:is_win | call s:system('chmod +x ' . fne) | endif
-    echo 'Saved to '.a:1
-    silent execute 'e' fne
+    echo 'Saved as '.a:1
+    silent execute 'e' s:esc(fn)
+    setf vim
   endif
   endif
 endfunction
 endfunction
 
 

+ 2 - 1
vim/plugins.vim

@@ -73,13 +73,14 @@ Plug 'ajh17/VimCompletesMe'
 " Coding Language Support {{{
 " Coding Language Support {{{
 Plug 'LnL7/vim-nix'
 Plug 'LnL7/vim-nix'
 Plug 'elzr/vim-json'
 Plug 'elzr/vim-json'
+Plug 'nicklasos/vim-jsx-riot'
+Plug 'pearofducks/ansible-vim'
 Plug 'scrooloose/syntastic'
 Plug 'scrooloose/syntastic'
 Plug 'sheerun/vim-polyglot'
 Plug 'sheerun/vim-polyglot'
 Plug 'tobyS/pdv'
 Plug 'tobyS/pdv'
 Plug 'tobyS/vmustache'
 Plug 'tobyS/vmustache'
 Plug 'vim-pandoc/vim-pandoc-syntax'
 Plug 'vim-pandoc/vim-pandoc-syntax'
 Plug 'vim-scripts/yaml.vim'
 Plug 'vim-scripts/yaml.vim'
-Plug 'nicklasos/vim-jsx-riot'
 " }}}
 " }}}
 
 
 " Discarded {{{
 " Discarded {{{

+ 1 - 1
zsh/oh-my-zsh

@@ -1 +1 @@
-Subproject commit 22632aac7c99e02ec38223c84b2348435a82d1b5
+Subproject commit f558a460c289a41811e0c4b89f04d539c66224a1