Purge cache on BufWrite
Instead of much simpler solution define an API that may be used for anybody willing to add cache purging on events with a few keystrokes
This commit is contained in:
parent
c45747a3b8
commit
6fc7d6acc9
|
@ -67,6 +67,13 @@ function! s:UpdateWindows(use_last_current_window_id)
|
|||
endfor
|
||||
endfunction
|
||||
|
||||
function! PowerlineRegisterCachePurgerEvent(event)
|
||||
exec s:powerline_pycmd 'from powerline.segments.vim import launchevent as powerline_launchevent'
|
||||
augroup Powerline
|
||||
exec 'autocmd!' a:event '*' s:powerline_pycmd.' powerline_launchevent("'.a:event.'")'
|
||||
augroup END
|
||||
endfunction
|
||||
|
||||
let s:last_current_window_id = ''
|
||||
augroup Powerline
|
||||
autocmd!
|
||||
|
|
|
@ -10,21 +10,26 @@ def default_cache_key(**kwargs):
|
|||
|
||||
class memoize(object):
|
||||
'''Memoization decorator with timeout.'''
|
||||
def __init__(self, timeout, cache_key=default_cache_key):
|
||||
def __init__(self, timeout, cache_key=default_cache_key, cache_reg_func=None):
|
||||
self.timeout = timeout
|
||||
self.cache_key = cache_key
|
||||
self._cache = {}
|
||||
self.cache = {}
|
||||
self.cache_reg_func = cache_reg_func
|
||||
|
||||
def __call__(self, func):
|
||||
@wraps(func)
|
||||
def decorated_function(**kwargs):
|
||||
if self.cache_reg_func:
|
||||
self.cache_reg_func(self.cache)
|
||||
self.cache_reg_func = None
|
||||
|
||||
key = self.cache_key(**kwargs)
|
||||
try:
|
||||
cached = self._cache.get(key, None)
|
||||
cached = self.cache.get(key, None)
|
||||
except TypeError:
|
||||
return func(**kwargs)
|
||||
if cached is None or time.time() - cached['time'] > self.timeout:
|
||||
cached = self._cache[key] = {
|
||||
cached = self.cache[key] = {
|
||||
'result': func(**kwargs),
|
||||
'time': time.time(),
|
||||
}
|
||||
|
|
|
@ -12,10 +12,12 @@ from powerline.bindings.vim import vim_get_func, getbufvar
|
|||
from powerline.theme import requires_segment_info
|
||||
from powerline.lib import memoize, humanize_bytes
|
||||
from powerline.lib.vcs import guess
|
||||
from collections import defaultdict
|
||||
|
||||
vim_funcs = {
|
||||
'virtcol': vim_get_func('virtcol', rettype=int),
|
||||
'fnamemodify': vim_get_func('fnamemodify'),
|
||||
'expand': vim_get_func('expand'),
|
||||
'getfsize': vim_get_func('getfsize', rettype=int),
|
||||
'bufnr': vim_get_func('bufnr', rettype=int),
|
||||
}
|
||||
|
@ -47,6 +49,35 @@ mode_translations = {
|
|||
}
|
||||
|
||||
|
||||
eventcaches = defaultdict(lambda : [])
|
||||
bufeventcaches = defaultdict(lambda : [])
|
||||
def purgeonevents_reg(events, eventcaches=bufeventcaches):
|
||||
def cache_reg_func(cache):
|
||||
for event in events:
|
||||
if event not in eventcaches:
|
||||
vim.eval('PowerlineRegisterCachePurgerEvent("' + event + '")')
|
||||
eventcaches[event].append(cache)
|
||||
|
||||
return cache_reg_func
|
||||
|
||||
purgeall_on_shell = purgeonevents_reg(('ShellCmdPost', 'ShellFilterPost', 'FocusGained'), eventcaches=eventcaches)
|
||||
purgebuf_on_shell_and_write = purgeonevents_reg(('BufWritePost', 'ShellCmdPost', 'ShellFilterPost', 'FocusGained'))
|
||||
|
||||
|
||||
def launchevent(event):
|
||||
global eventcaches
|
||||
global bufeventcaches
|
||||
for cache in eventcaches[event]:
|
||||
cache.clear()
|
||||
if bufeventcaches[event]:
|
||||
buf = int(vim_funcs['expand']('<abuf>'))
|
||||
for cache in bufeventcaches[event]:
|
||||
try:
|
||||
cache.pop(buf)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
|
||||
def bufnr(segment_info, **kwargs):
|
||||
'''Used for cache key, returns current buffer number'''
|
||||
return segment_info['bufnr']
|
||||
|
@ -157,7 +188,7 @@ def file_name(segment_info, display_no_file=False, no_file_text='[No file]'):
|
|||
|
||||
|
||||
@requires_segment_info
|
||||
@memoize(2, cache_key=bufnr)
|
||||
@memoize(2, cache_key=bufnr, cache_reg_func=purgebuf_on_shell_and_write)
|
||||
def file_size(segment_info, suffix='B', binary_prefix=False):
|
||||
'''Return file size.
|
||||
|
||||
|
@ -254,7 +285,7 @@ def modified_buffers(text=u'+', join_str=','):
|
|||
|
||||
|
||||
@requires_segment_info
|
||||
@memoize(2, cache_key=bufnr)
|
||||
@memoize(2, cache_key=bufnr, cache_reg_func=purgeall_on_shell)
|
||||
def branch(segment_info):
|
||||
'''Return the current working branch.'''
|
||||
repo = guess(path=os.path.abspath(segment_info['buffer'].name or os.getcwd()))
|
||||
|
@ -263,9 +294,8 @@ def branch(segment_info):
|
|||
return None
|
||||
|
||||
|
||||
# TODO Drop cache on BufWrite event
|
||||
@requires_segment_info
|
||||
@memoize(2, cache_key=bufnr)
|
||||
@memoize(2, cache_key=bufnr, cache_reg_func=purgebuf_on_shell_and_write)
|
||||
def file_vcs_status(segment_info):
|
||||
'''Return the VCS status for this buffer.'''
|
||||
name = segment_info['buffer'].name
|
||||
|
@ -287,7 +317,7 @@ def file_vcs_status(segment_info):
|
|||
|
||||
|
||||
@requires_segment_info
|
||||
@memoize(2, cache_key=bufnr)
|
||||
@memoize(2, cache_key=bufnr, cache_reg_func=purgeall_on_shell)
|
||||
def repository_status(segment_info):
|
||||
'''Return the status for the current repo.'''
|
||||
repo = guess(path=os.path.abspath(segment_info['buffer'].name or os.getcwd()))
|
||||
|
|
Loading…
Reference in New Issue