summaryrefslogtreecommitdiffstats
path: root/powerline/segments/vim/plugin/tagbar.py
diff options
context:
space:
mode:
Diffstat (limited to 'powerline/segments/vim/plugin/tagbar.py')
-rw-r--r--powerline/segments/vim/plugin/tagbar.py51
1 files changed, 51 insertions, 0 deletions
diff --git a/powerline/segments/vim/plugin/tagbar.py b/powerline/segments/vim/plugin/tagbar.py
new file mode 100644
index 0000000..e683758
--- /dev/null
+++ b/powerline/segments/vim/plugin/tagbar.py
@@ -0,0 +1,51 @@
+# vim:fileencoding=utf-8:noet
+from __future__ import (unicode_literals, division, absolute_import, print_function)
+
+try:
+ import vim
+except ImportError:
+ vim = object()
+
+from powerline.bindings.vim import vim_command_exists, vim_get_autoload_func
+from powerline.theme import requires_segment_info
+
+
+currenttag = None
+tag_cache = {}
+
+
+@requires_segment_info
+def current_tag(segment_info, pl, flags='s'):
+ '''Return tag that is near the cursor.
+
+ :param str flags:
+ Specifies additional properties of the displayed tag. Supported values:
+
+ * s - display complete signature
+ * f - display the full hierarchy of the tag
+ * p - display the raw prototype
+
+ More info in the `official documentation`_ (search for
+ “tagbar#currenttag”).
+
+ .. _`official documentation`: https://github.com/majutsushi/tagbar/blob/master/doc/tagbar.txt
+ '''
+ global currenttag
+ global tag_cache
+ window_id = segment_info['window_id']
+ if segment_info['mode'] == 'nc':
+ return tag_cache.get(window_id, (None,))[-1]
+ if not currenttag:
+ if vim_command_exists('Tagbar'):
+ currenttag = vim_get_autoload_func('tagbar#currenttag')
+ if not currenttag:
+ return None
+ else:
+ return None
+ prev_key, r = tag_cache.get(window_id, (None, None))
+ key = (int(vim.eval('b:changedtick')), segment_info['window'].cursor[0])
+ if prev_key and key == prev_key:
+ return r
+ r = currenttag('%s', '', flags)
+ tag_cache[window_id] = (key, r)
+ return r