1
0

update config

This commit is contained in:
valeth 2015-05-24 08:04:28 +02:00
parent 12b3147bbc
commit 7fa5c3354f
7 changed files with 112 additions and 64 deletions

View File

@ -22,7 +22,7 @@
" Plug 'https://github.com/junegunn/vim-github-dashboard.git' " Plug 'https://github.com/junegunn/vim-github-dashboard.git'
" "
" " Plugin options " " Plugin options
" Plug 'nsf/gocode', { 'tag': 'go.weekly.2012-03-13', 'rtp': 'vim' } " Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' }
" "
" " Plugin outside ~/.vim/plugged with post-update hook " " Plugin outside ~/.vim/plugged with post-update hook
" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' } " Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': 'yes \| ./install' }
@ -72,8 +72,6 @@ let s:plug_tab = get(s:, 'plug_tab', -1)
let s:plug_buf = get(s:, 'plug_buf', -1) let s:plug_buf = get(s:, 'plug_buf', -1)
let s:mac_gui = has('gui_macvim') && has('gui_running') let s:mac_gui = has('gui_macvim') && has('gui_running')
let s:is_win = has('win32') || has('win64') let s:is_win = has('win32') || has('win64')
let s:py2 = has('python') && !has('nvim') && !s:is_win && !has('win32unix')
let s:ruby = has('ruby') && !has('nvim') && (v:version >= 703 || v:version == 702 && has('patch374'))
let s:nvim = has('nvim') && exists('*jobwait') && !s:is_win let s:nvim = has('nvim') && exists('*jobwait') && !s:is_win
let s:me = resolve(expand('<sfile>:p')) let s:me = resolve(expand('<sfile>:p'))
let s:base_spec = { 'branch': 'master', 'frozen': 0 } let s:base_spec = { 'branch': 'master', 'frozen': 0 }
@ -746,6 +744,10 @@ 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 s:update = { let s:update = {
\ 'start': reltime(), \ 'start': reltime(),
\ 'all': todo, \ 'all': todo,
@ -754,7 +756,7 @@ function! s:update_impl(pull, force, args) abort
\ 'pull': a:pull, \ 'pull': a:pull,
\ 'force': a:force, \ 'force': a:force,
\ 'new': {}, \ 'new': {},
\ 'threads': (s:py2 || s:ruby || s:nvim) ? min([len(todo), threads]) : 1, \ 'threads': (python || ruby || s:nvim) ? min([len(todo), threads]) : 1,
\ 'bar': '', \ 'bar': '',
\ 'fin': 0 \ 'fin': 0
\ } \ }
@ -763,21 +765,25 @@ function! s:update_impl(pull, force, args) abort
call append(0, ['', '']) call append(0, ['', ''])
normal! 2G normal! 2G
let s:clone_opt = get(g:, 'plug_shallow', 1) ?
\ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : ''
" Python version requirement (>= 2.7) " Python version requirement (>= 2.7)
if s:py2 && !s:ruby && !s:nvim && s:update.threads > 1 if python && !has('python3') && !ruby && !s:nvim && s:update.threads > 1
redir => pyv redir => pyv
silent python import platform; print(platform.python_version()) silent python import platform; print(platform.python_version())
redir END redir END
let s:py2 = s:version_requirement( let python = s:version_requirement(
\ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6])
endif endif
if (s:py2 || s:ruby) && !s:nvim && s:update.threads > 1
if (python || ruby) && s:update.threads > 1
try try
let imd = &imd let imd = &imd
if s:mac_gui if s:mac_gui
set noimd set noimd
endif endif
if s:ruby if ruby
call s:update_ruby() call s:update_ruby()
else else
call s:update_python() call s:update_python()
@ -961,16 +967,18 @@ while 1 " Without TCO, Vim stack is bound to explode
call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...')
redraw redraw
let checkout = s:shellesc(has_key(spec, 'tag') ? spec.tag : spec.branch) let has_tag = has_key(spec, 'tag')
let merge = s:shellesc(has_key(spec, 'tag') ? spec.tag : 'origin/'.spec.branch) let checkout = s:shellesc(has_tag ? spec.tag : spec.branch)
let merge = s:shellesc(has_tag ? spec.tag : 'origin/'.spec.branch)
if !new if !new
let [valid, msg] = s:git_valid(spec, 0) let [valid, msg] = s:git_valid(spec, 0)
if valid if valid
if pull if pull
let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : ''
call s:spawn(name, call s:spawn(name,
\ printf('(git fetch %s 2>&1 && git checkout -q %s 2>&1 && git merge --ff-only %s 2>&1 && git submodule update --init --recursive 2>&1)', \ printf('(git fetch %s %s 2>&1 && git checkout -q %s 2>&1 && git merge --ff-only %s 2>&1 && git submodule update --init --recursive 2>&1)',
\ prog, checkout, merge), { 'dir': spec.dir }) \ fetch_opt, prog, checkout, merge), { 'dir': spec.dir })
else else
let s:jobs[name] = { 'running': 0, 'result': 'Already installed', 'error': 0 } let s:jobs[name] = { 'running': 0, 'result': 'Already installed', 'error': 0 }
endif endif
@ -979,7 +987,8 @@ while 1 " Without TCO, Vim stack is bound to explode
endif endif
else else
call s:spawn(name, call s:spawn(name,
\ printf('git clone %s --recursive %s -b %s %s 2>&1', \ printf('git clone %s %s --recursive %s -b %s %s 2>&1',
\ has_tag ? '' : s:clone_opt,
\ prog, \ prog,
\ s:shellesc(spec.uri), \ s:shellesc(spec.uri),
\ checkout, \ checkout,
@ -996,12 +1005,16 @@ endwhile
endfunction endfunction
function! s:update_python() function! s:update_python()
python << EOF let py_exe = has('python3') ? 'python3' : 'python'
execute py_exe "<< EOF"
""" Due to use of signals this function is POSIX only. """ """ Due to use of signals this function is POSIX only. """
import datetime import datetime
import functools import functools
import os import os
import Queue try:
import queue
except ImportError:
import Queue as queue
import random import random
import re import re
import shutil import shutil
@ -1013,18 +1026,27 @@ import time
import traceback import traceback
import vim import vim
G_NVIM = vim.eval("has('nvim')") == '1'
G_PULL = vim.eval('s:update.pull') == '1' G_PULL = vim.eval('s:update.pull') == '1'
G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1
G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)'))
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_THREADS = {}
class CmdTimedOut(Exception): class BaseExc(Exception):
def __init__(self, msg):
self._msg = msg
@property
def msg(self):
return self._msg
class CmdTimedOut(BaseExc):
pass pass
class CmdFailed(Exception): class CmdFailed(BaseExc):
pass pass
class InvalidURI(Exception): class InvalidURI(BaseExc):
pass pass
class Action(object): class Action(object):
INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-']
@ -1048,13 +1070,13 @@ class GLog(object):
with open(fname, 'ab') as flog: with open(fname, 'ab') as flog:
ltime = datetime.datetime.now().strftime("%H:%M:%S.%f") ltime = datetime.datetime.now().strftime("%H:%M:%S.%f")
msg = '[{0},{1}] {2}{3}'.format(name, ltime, msg, '\n') msg = '[{0},{1}] {2}{3}'.format(name, ltime, msg, '\n')
flog.write(msg) flog.write(msg.encode())
class Buffer(object): class Buffer(object):
def __init__(self, lock, num_plugs): def __init__(self, lock, num_plugs, is_pull, is_win):
self.bar = '' self.bar = ''
self.event = 'Updating' if vim.eval('s:update.pull') == '1' else 'Installing' self.event = 'Updating' if is_pull else 'Installing'
self.is_win = vim.eval('s:is_win') == '1' 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
@ -1080,15 +1102,12 @@ class Buffer(object):
num_spaces = self.num_plugs - len(self.bar) num_spaces = self.num_plugs - len(self.bar)
curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ')
vim.command('normal! 2G')
if not self.is_win:
vim.command('redraw')
def write(self, *args, **kwargs):
with self.lock: with self.lock:
self._write(*args, **kwargs) vim.command('normal! 2G')
if not self.is_win:
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:]
msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)]
padded_rest = [' ' + line for line in rest] padded_rest = [' ' + line for line in rest]
@ -1159,7 +1178,7 @@ class Command(object):
proc = None proc = None
first_line = True first_line = True
try: try:
tfile = tempfile.NamedTemporaryFile() tfile = tempfile.NamedTemporaryFile(mode='w+b', delete=False)
proc = subprocess.Popen(self.cmd, cwd=self.cmd_dir, stdout=tfile, proc = subprocess.Popen(self.cmd, cwd=self.cmd_dir, stdout=tfile,
stderr=subprocess.STDOUT, shell=True, preexec_fn=os.setsid) stderr=subprocess.STDOUT, shell=True, preexec_fn=os.setsid)
while proc.poll() is None: while proc.poll() is None:
@ -1180,7 +1199,7 @@ class Command(object):
raise CmdTimedOut(['Timeout!']) raise CmdTimedOut(['Timeout!'])
tfile.seek(0) tfile.seek(0)
result = [line.rstrip() for line in tfile] result = [line.decode().rstrip() for line in tfile]
if proc.returncode != 0: if proc.returncode != 0:
msg = [''] msg = ['']
@ -1192,18 +1211,21 @@ class Command(object):
if self.clean: if self.clean:
self.clean() self.clean()
raise raise
finally:
os.remove(tfile.name)
return result return result
class Plugin(object): class Plugin(object):
def __init__(self, name, args, buf, lock): def __init__(self, name, args, buf_q, lock):
self.name = name self.name = name
self.args = args self.args = args
self.buf = buf self.buf_q = buf_q
self.lock = lock self.lock = lock
tag = args.get('tag', 0) tag = args.get('tag', 0)
self.checkout = esc(tag if tag else args['branch']) self.checkout = esc(tag if tag else args['branch'])
self.merge = esc(tag if tag else 'origin/' + args['branch']) self.merge = esc(tag if tag else 'origin/' + args['branch'])
self.tag = tag
def manage(self): def manage(self):
try: try:
@ -1212,9 +1234,9 @@ class Plugin(object):
else: else:
self.install() self.install()
with self.lock: with self.lock:
vim.command("let s:update.new['{0}'] = 1".format(self.name)) thread_vim_command("let s:update.new['{0}'] = 1".format(self.name))
except (CmdTimedOut, CmdFailed, InvalidURI) as exc: except (CmdTimedOut, CmdFailed, InvalidURI) as exc:
self.write(Action.ERROR, self.name, exc.message) 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!'])
@ -1236,9 +1258,9 @@ class Plugin(object):
return _clean return _clean
self.write(Action.INSTALL, self.name, ['Installing ...']) self.write(Action.INSTALL, self.name, ['Installing ...'])
callback = functools.partial(self.buf.write, Action.INSTALL, self.name) callback = functools.partial(self.write, Action.INSTALL, self.name)
cmd = 'git clone {0} --recursive {1} -b {2} {3} 2>&1'.format( cmd = 'git clone {0} {1} --recursive {2} -b {3} {4} 2>&1'.format(
G_PROGRESS, self.args['uri'], self.checkout, esc(target)) '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], self.checkout, esc(target))
com = Command(cmd, None, G_TIMEOUT, G_RETRIES, callback, clean(target)) com = Command(cmd, None, G_TIMEOUT, G_RETRIES, callback, clean(target))
result = com.attempt_cmd() result = com.attempt_cmd()
self.write(Action.DONE, self.name, result[-1:]) self.write(Action.DONE, self.name, result[-1:])
@ -1256,8 +1278,9 @@ class Plugin(object):
if G_PULL: if G_PULL:
self.write(Action.UPDATE, self.name, ['Updating ...']) self.write(Action.UPDATE, self.name, ['Updating ...'])
callback = functools.partial(self.buf.write, Action.UPDATE, self.name) callback = functools.partial(self.write, Action.UPDATE, self.name)
cmds = ['git fetch {0}'.format(G_PROGRESS), fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else ''
cmds = ['git fetch {0} {1}'.format(fetch_opt, G_PROGRESS),
'git checkout -q {0}'.format(self.checkout), 'git checkout -q {0}'.format(self.checkout),
'git merge --ff-only {0}'.format(self.merge), 'git merge --ff-only {0}'.format(self.merge),
'git submodule update --init --recursive'] 'git submodule update --init --recursive']
@ -1278,7 +1301,7 @@ class Plugin(object):
def write(self, action, name, msg): def write(self, action, name, msg):
GLog.write('{0} {1}: {2}'.format(action, name, '\n'.join(msg))) GLog.write('{0} {1}: {2}'.format(action, name, '\n'.join(msg)))
self.buf.write(action, name, msg) self.buf_q.put((action, name, msg))
class PlugThread(thr.Thread): class PlugThread(thr.Thread):
def __init__(self, tname, args): def __init__(self, tname, args):
@ -1288,17 +1311,21 @@ class PlugThread(thr.Thread):
def run(self): def run(self):
thr.current_thread().name = self.tname thr.current_thread().name = self.tname
work_q, lock, buf = self.args buf_q, work_q, lock = self.args
try: try:
while not G_STOP.is_set(): while not G_STOP.is_set():
name, args = work_q.get_nowait() name, args = work_q.get_nowait()
GLog.write('{0}: Dir {1}'.format(name, args['dir'])) GLog.write('{0}: Dir {1}'.format(name, args['dir']))
plug = Plugin(name, args, buf, lock) plug = Plugin(name, args, buf_q, lock)
plug.manage() plug.manage()
work_q.task_done() work_q.task_done()
except Queue.Empty: except queue.Empty:
GLog.write('Queue now empty.') GLog.write('Queue now empty.')
finally:
global G_THREADS
with lock:
del G_THREADS[thr.current_thread().name]
class RefreshThread(thr.Thread): class RefreshThread(thr.Thread):
def __init__(self, lock): def __init__(self, lock):
@ -1309,19 +1336,26 @@ class RefreshThread(thr.Thread):
def run(self): def run(self):
while self.running: while self.running:
with self.lock: with self.lock:
vim.command('noautocmd normal! a') thread_vim_command('noautocmd normal! a')
time.sleep(0.2) time.sleep(0.2)
def stop(self): def stop(self):
self.running = False self.running = False
if G_NVIM:
def thread_vim_command(cmd):
vim.session.threadsafe_call(lambda: vim.command(cmd))
else:
def thread_vim_command(cmd):
vim.command(cmd)
def esc(name): def esc(name):
return '"' + name.replace('"', '\"') + '"' return '"' + name.replace('"', '\"') + '"'
def nonblock_read(fname): def nonblock_read(fname):
""" Read a file with nonblock flag. Return the last line. """ """ Read a file with nonblock flag. Return the last line. """
fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK)
buf = os.read(fread, 100000) buf = os.read(fread, 100000).decode()
os.close(fread) os.close(fread)
line = buf.rstrip('\r\n') line = buf.rstrip('\r\n')
@ -1338,7 +1372,6 @@ def main():
if GLog.ON and os.path.exists(GLog.LOGDIR): if GLog.ON and os.path.exists(GLog.LOGDIR):
shutil.rmtree(GLog.LOGDIR) shutil.rmtree(GLog.LOGDIR)
threads = []
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'
@ -1348,24 +1381,33 @@ def main():
GLog.write('Num Threads: {0}'.format(nthreads)) GLog.write('Num Threads: {0}'.format(nthreads))
lock = thr.Lock() lock = thr.Lock()
buf = Buffer(lock, len(plugs)) buf = Buffer(lock, len(plugs), G_PULL, is_win)
work_q = 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)
GLog.write('Starting Threads') GLog.write('Starting Threads')
global G_THREADS
for num in range(nthreads): for num in range(nthreads):
tname = 'PlugT-{0:02}'.format(num) tname = 'PlugT-{0:02}'.format(num)
thread = PlugThread(tname, (work_q, lock, buf)) thread = PlugThread(tname, (buf_q, work_q, lock))
thread.start() thread.start()
threads.append(thread) G_THREADS[tname] = thread
if mac_gui: if mac_gui:
rthread = RefreshThread(lock) rthread = RefreshThread(lock)
rthread.start() rthread.start()
GLog.write('Joining Live Threads') GLog.write('Buffer Writing Loop')
for thread in threads: while not buf_q.empty() or len(G_THREADS) != 0:
thread.join() try:
action, name, msg = buf_q.get(True, 0.25)
buf.write(action, name, msg)
buf_q.task_done()
except queue.Empty:
pass
except KeyboardInterrupt:
G_STOP.set()
if mac_gui: if mac_gui:
rthread.stop() rthread.stop()
rthread.join() rthread.join()
@ -1533,6 +1575,7 @@ function! s:update_ruby()
end end
} if VIM::evaluate('s:mac_gui') == 1 } if VIM::evaluate('s:mac_gui') == 1
clone_opt = VIM::evaluate('s:clone_opt')
progress = VIM::evaluate('s:progress_opt(1)') progress = VIM::evaluate('s:progress_opt(1)')
nthr.times do nthr.times do
mtx.synchronize do mtx.synchronize do
@ -1562,7 +1605,8 @@ function! s:update_ruby()
else else
if pull if pull
log.call name, 'Updating ...', :update log.call name, 'Updating ...', :update
bt.call "#{cd} #{dir} && git fetch #{progress} 2>&1 && git checkout -q #{checkout} 2>&1 && git merge --ff-only #{merge} 2>&1 && #{subm}", name, :update, nil 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
else else
[true, skip] [true, skip]
end end
@ -1570,7 +1614,7 @@ function! s:update_ruby()
else else
d = esc dir.sub(%r{[\\/]+$}, '') d = esc dir.sub(%r{[\\/]+$}, '')
log.call name, 'Installing ...', :install log.call name, 'Installing ...', :install
bt.call "git clone #{progress} --recursive #{uri} -b #{checkout} #{d} 2>&1", name, :install, proc { bt.call "git clone #{clone_opt unless tag} #{progress} --recursive #{uri} -b #{checkout} #{d} 2>&1", name, :install, proc {
FileUtils.rm_rf dir FileUtils.rm_rf dir
} }
end end

View File

@ -1,8 +1,5 @@
imap jk <ESC> imap jk <ESC>
vmap jk <ESC> imap JK <ESC>
imap Jk <ESC>
"aug FastEscape set timeoutlen=500
"au!
"au InsertEnter * set timeoutlen=0
"au InsertLeave * set timeoutlen=1000
"aug END

5
core/linewrap.vim Normal file
View File

@ -0,0 +1,5 @@
if has("linebreak")
let &showbreak = "↳ "
set breakindent
set breakindentopt=sbr
endif

View File

@ -1,4 +1,3 @@
set autowrite
set shortmess=aoOtTI set shortmess=aoOtTI
set clipboard=unnamed,unnamedplus,autoselect set clipboard=unnamed,unnamedplus,autoselect

View File

@ -11,6 +11,7 @@ Plug 'vim-scripts/gnupg'
Plug 'tomasr/molokai' Plug 'tomasr/molokai'
Plug 'junegunn/seoul256.vim' Plug 'junegunn/seoul256.vim'
Plug 'baeuml/summerfruit256.vim'
Plug 'zefei/vim-colortuner', { 'on': 'Colortuner' } Plug 'zefei/vim-colortuner', { 'on': 'Colortuner' }
Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' }

View File

@ -1 +0,0 @@
set confirm

View File

@ -1,3 +1,6 @@
set confirm
set autowrite
command! Wq wq command! Wq wq
command! WQ wq command! WQ wq
command! Q q command! Q q