mirror of
https://github.com/powerline/powerline.git
synced 2025-07-28 08:14:41 +02:00
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
|
endfor
|
||||||
endfunction
|
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 = ''
|
let s:last_current_window_id = ''
|
||||||
augroup Powerline
|
augroup Powerline
|
||||||
autocmd!
|
autocmd!
|
||||||
|
@ -10,21 +10,26 @@ def default_cache_key(**kwargs):
|
|||||||
|
|
||||||
class memoize(object):
|
class memoize(object):
|
||||||
'''Memoization decorator with timeout.'''
|
'''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.timeout = timeout
|
||||||
self.cache_key = cache_key
|
self.cache_key = cache_key
|
||||||
self._cache = {}
|
self.cache = {}
|
||||||
|
self.cache_reg_func = cache_reg_func
|
||||||
|
|
||||||
def __call__(self, func):
|
def __call__(self, func):
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
def decorated_function(**kwargs):
|
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)
|
key = self.cache_key(**kwargs)
|
||||||
try:
|
try:
|
||||||
cached = self._cache.get(key, None)
|
cached = self.cache.get(key, None)
|
||||||
except TypeError:
|
except TypeError:
|
||||||
return func(**kwargs)
|
return func(**kwargs)
|
||||||
if cached is None or time.time() - cached['time'] > self.timeout:
|
if cached is None or time.time() - cached['time'] > self.timeout:
|
||||||
cached = self._cache[key] = {
|
cached = self.cache[key] = {
|
||||||
'result': func(**kwargs),
|
'result': func(**kwargs),
|
||||||
'time': time.time(),
|
'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.theme import requires_segment_info
|
||||||
from powerline.lib import memoize, humanize_bytes
|
from powerline.lib import memoize, humanize_bytes
|
||||||
from powerline.lib.vcs import guess
|
from powerline.lib.vcs import guess
|
||||||
|
from collections import defaultdict
|
||||||
|
|
||||||
vim_funcs = {
|
vim_funcs = {
|
||||||
'virtcol': vim_get_func('virtcol', rettype=int),
|
'virtcol': vim_get_func('virtcol', rettype=int),
|
||||||
'fnamemodify': vim_get_func('fnamemodify'),
|
'fnamemodify': vim_get_func('fnamemodify'),
|
||||||
|
'expand': vim_get_func('expand'),
|
||||||
'getfsize': vim_get_func('getfsize', rettype=int),
|
'getfsize': vim_get_func('getfsize', rettype=int),
|
||||||
'bufnr': vim_get_func('bufnr', 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):
|
def bufnr(segment_info, **kwargs):
|
||||||
'''Used for cache key, returns current buffer number'''
|
'''Used for cache key, returns current buffer number'''
|
||||||
return segment_info['bufnr']
|
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
|
@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):
|
def file_size(segment_info, suffix='B', binary_prefix=False):
|
||||||
'''Return file size.
|
'''Return file size.
|
||||||
|
|
||||||
@ -254,7 +285,7 @@ def modified_buffers(text=u'+', join_str=','):
|
|||||||
|
|
||||||
|
|
||||||
@requires_segment_info
|
@requires_segment_info
|
||||||
@memoize(2, cache_key=bufnr)
|
@memoize(2, cache_key=bufnr, cache_reg_func=purgeall_on_shell)
|
||||||
def branch(segment_info):
|
def branch(segment_info):
|
||||||
'''Return the current working branch.'''
|
'''Return the current working branch.'''
|
||||||
repo = guess(path=os.path.abspath(segment_info['buffer'].name or os.getcwd()))
|
repo = guess(path=os.path.abspath(segment_info['buffer'].name or os.getcwd()))
|
||||||
@ -263,9 +294,8 @@ def branch(segment_info):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
# TODO Drop cache on BufWrite event
|
|
||||||
@requires_segment_info
|
@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):
|
def file_vcs_status(segment_info):
|
||||||
'''Return the VCS status for this buffer.'''
|
'''Return the VCS status for this buffer.'''
|
||||||
name = segment_info['buffer'].name
|
name = segment_info['buffer'].name
|
||||||
@ -287,7 +317,7 @@ def file_vcs_status(segment_info):
|
|||||||
|
|
||||||
|
|
||||||
@requires_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):
|
def repository_status(segment_info):
|
||||||
'''Return the status for the current repo.'''
|
'''Return the status for the current repo.'''
|
||||||
repo = guess(path=os.path.abspath(segment_info['buffer'].name or os.getcwd()))
|
repo = guess(path=os.path.abspath(segment_info['buffer'].name or os.getcwd()))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user