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:
ZyX 2013-02-14 22:40:08 +04:00 committed by Kim Silkebækken
parent c45747a3b8
commit 6fc7d6acc9
3 changed files with 51 additions and 9 deletions

View File

@ -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!

View File

@ -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(),
}

View File

@ -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()))