From 642ced97bcb2d0fbfd5798d04c680fcd3cfc5db9 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 12:39:27 +0400 Subject: [PATCH 01/16] Move listers to powerline.listers.vim module --- .../config_files/themes/vim/tabline.json | 1 + powerline/listers/__init__.py | 0 powerline/listers/vim.py | 104 +++++++++++++++++ powerline/segments/vim/__init__.py | 105 ++---------------- 4 files changed, 112 insertions(+), 98 deletions(-) create mode 100644 powerline/listers/__init__.py create mode 100644 powerline/listers/vim.py diff --git a/powerline/config_files/themes/vim/tabline.json b/powerline/config_files/themes/vim/tabline.json index a51da75f..d252b073 100644 --- a/powerline/config_files/themes/vim/tabline.json +++ b/powerline/config_files/themes/vim/tabline.json @@ -4,6 +4,7 @@ "left": [ { "type": "segment_list", + "module": "powerline.listers.vim", "name": "tabbuflister", "segments": [ { diff --git a/powerline/listers/__init__.py b/powerline/listers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py new file mode 100644 index 00000000..b8f3eaa3 --- /dev/null +++ b/powerline/listers/vim.py @@ -0,0 +1,104 @@ +# vim:fileencoding=utf-8:noet + +from __future__ import unicode_literals, absolute_import, division + +try: + import vim +except ImportError: + vim = {} # NOQA + +from powerline.theme import requires_segment_info +from powerline.bindings.vim import (current_tabpage, list_tabpages) + + +def tabpage_updated_segment_info(segment_info, tabpage): + segment_info = segment_info.copy() + window = tabpage.window + buffer = window.buffer + segment_info.update( + tabpage=tabpage, + tabnr=tabpage.number, + window=window, + winnr=window.number, + window_id=int(window.vars.get('powerline_window_id', -1)), + buffer=buffer, + bufnr=buffer.number, + ) + return segment_info + + +@requires_segment_info +def tablister(pl, segment_info): + '''List all tab pages in segment_info format + + Specifically generates a list of segment info dictionaries with ``window``, + ``winnr``, ``window_id``, ``buffer`` and ``bufnr`` keys set to tab-local + ones and additional ``tabpage`` and ``tabnr`` keys. + + Sets segment ``mode`` to either ``tab`` (for current tab page) or ``nc`` + (for all other tab pages). + + Works best with vim-7.4 or later: earlier versions miss tabpage object and + thus window objects are not available as well. + ''' + cur_tabpage = current_tabpage() + cur_tabnr = cur_tabpage.number + + def add_multiplier(tabpage, dct): + dct['priority_multiplier'] = 1 + (0.001 * abs(tabpage.number - cur_tabnr)) + return dct + + return [ + ( + tabpage_updated_segment_info(segment_info, tabpage), + add_multiplier(tabpage, {'mode': ('tab' if tabpage == cur_tabpage else 'nc')}) + ) + for tabpage in list_tabpages() + ] + + +def buffer_updated_segment_info(segment_info, buffer): + segment_info = segment_info.copy() + segment_info.update( + window=None, + winnr=None, + window_id=None, + buffer=buffer, + bufnr=buffer.number, + ) + return segment_info + + +@requires_segment_info +def bufferlister(pl, segment_info): + '''List all buffers in segment_info format + + Specifically generates a list of segment info dictionaries with ``buffer`` + and ``bufnr`` keys set to buffer-specific ones, ``window``, ``winnr`` and + ``window_id`` keys unset. + + Sets segment ``mode`` to either ``buf`` (for current buffer) or ``nc`` + (for all other buffers). + ''' + cur_buffer = vim.current.buffer + cur_bufnr = cur_buffer.number + + def add_multiplier(buffer, dct): + dct['priority_multiplier'] = 1 + (0.001 * abs(buffer.number - cur_bufnr)) + return dct + + return [ + ( + buffer_updated_segment_info(segment_info, buffer), + add_multiplier(buffer, {'mode': ('tab' if buffer == cur_buffer else 'nc')}) + ) + for buffer in vim.buffers + ] + + +@requires_segment_info +def tabbuflister(*args, **kwargs): + if len(list_tabpages()) == 1: + return bufferlister(*args, **kwargs) + else: + return tablister(*args, **kwargs) diff --git a/powerline/segments/vim/__init__.py b/powerline/segments/vim/__init__.py index 4a1c4706..3e991e4f 100644 --- a/powerline/segments/vim/__init__.py +++ b/powerline/segments/vim/__init__.py @@ -4,15 +4,13 @@ from __future__ import unicode_literals, absolute_import, division import os import re + try: import vim except ImportError: vim = {} # NOQA -try: - from __builtin__ import xrange as range -except ImportError: - pass +from collections import defaultdict from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption, buffer_name, vim_getwinvar, @@ -23,7 +21,11 @@ from powerline.lib import add_divider_highlight_group from powerline.lib.vcs import guess, tree_status from powerline.lib.humanize_bytes import humanize_bytes from powerline.lib import wraps_saveargs as wraps -from collections import defaultdict + +try: + from __builtin__ import xrange as range +except ImportError: + pass vim_funcs = { @@ -629,96 +631,3 @@ def single_tab(pl, single_text='Bufs', multiple_text='Tabs'): 'contents': multiple_text, 'highlight_group': ['many_tabs'], }] - - -def tabpage_updated_segment_info(segment_info, tabpage): - segment_info = segment_info.copy() - window = tabpage.window - buffer = window.buffer - segment_info.update( - tabpage=tabpage, - tabnr=tabpage.number, - window=window, - winnr=window.number, - window_id=int(window.vars.get('powerline_window_id', -1)), - buffer=buffer, - bufnr=buffer.number, - ) - return segment_info - - -@requires_segment_info -def tablister(pl, segment_info): - '''List all tab pages in segment_info format - - Specifically generates a list of segment info dictionaries with ``window``, - ``winnr``, ``window_id``, ``buffer`` and ``bufnr`` keys set to tab-local - ones and additional ``tabpage`` and ``tabnr`` keys. - - Sets segment ``mode`` to either ``tab`` (for current tab page) or ``nc`` - (for all other tab pages). - - Works best with vim-7.4 or later: earlier versions miss tabpage object and - thus window objects are not available as well. - ''' - cur_tabpage = current_tabpage() - cur_tabnr = cur_tabpage.number - - def add_multiplier(tabpage, dct): - dct['priority_multiplier'] = 1 + (0.001 * abs(tabpage.number - cur_tabnr)) - return dct - - return [ - ( - tabpage_updated_segment_info(segment_info, tabpage), - add_multiplier(tabpage, {'mode': ('tab' if tabpage == cur_tabpage else 'nc')}) - ) - for tabpage in list_tabpages() - ] - - -def buffer_updated_segment_info(segment_info, buffer): - segment_info = segment_info.copy() - segment_info.update( - window=None, - winnr=None, - window_id=None, - buffer=buffer, - bufnr=buffer.number, - ) - return segment_info - - -@requires_segment_info -def bufferlister(pl, segment_info): - '''List all buffers in segment_info format - - Specifically generates a list of segment info dictionaries with ``buffer`` - and ``bufnr`` keys set to buffer-specific ones, ``window``, ``winnr`` and - ``window_id`` keys unset. - - Sets segment ``mode`` to either ``buf`` (for current buffer) or ``nc`` - (for all other buffers). - ''' - cur_buffer = vim.current.buffer - cur_bufnr = cur_buffer.number - - def add_multiplier(buffer, dct): - dct['priority_multiplier'] = 1 + (0.001 * abs(buffer.number - cur_bufnr)) - return dct - - return [ - ( - buffer_updated_segment_info(segment_info, buffer), - add_multiplier(buffer, {'mode': ('tab' if buffer == cur_buffer else 'nc')}) - ) - for buffer in vim.buffers - ] - - -@requires_segment_info -def tabbuflister(*args, **kwargs): - if len(list_tabpages()) == 1: - return bufferlister(*args, **kwargs) - else: - return tablister(*args, **kwargs) From 61fc73d93dd4d461b05940dc95f45588193779a4 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 12:42:25 +0400 Subject: [PATCH 02/16] Make listers accept any number of keyword arguments --- powerline/listers/vim.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py index b8f3eaa3..e0b3a92a 100644 --- a/powerline/listers/vim.py +++ b/powerline/listers/vim.py @@ -28,7 +28,7 @@ def tabpage_updated_segment_info(segment_info, tabpage): @requires_segment_info -def tablister(pl, segment_info): +def tablister(pl, segment_info, **kwargs): '''List all tab pages in segment_info format Specifically generates a list of segment info dictionaries with ``window``, @@ -70,7 +70,7 @@ def buffer_updated_segment_info(segment_info, buffer): @requires_segment_info -def bufferlister(pl, segment_info): +def bufferlister(pl, segment_info, **kwargs): '''List all buffers in segment_info format Specifically generates a list of segment info dictionaries with ``buffer`` @@ -97,8 +97,8 @@ def bufferlister(pl, segment_info): @requires_segment_info -def tabbuflister(*args, **kwargs): +def tabbuflister(**kwargs): if len(list_tabpages()) == 1: - return bufferlister(*args, **kwargs) + return bufferlister(**kwargs) else: - return tablister(*args, **kwargs) + return tablister(**kwargs) From 54f0537d298368a8a7f2baa84b41f47fa9d4d8cb Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 12:57:34 +0400 Subject: [PATCH 03/16] Do not show unlisted buffers Closes #972 --- powerline/listers/vim.py | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py index e0b3a92a..e59e623b 100644 --- a/powerline/listers/vim.py +++ b/powerline/listers/vim.py @@ -8,7 +8,7 @@ except ImportError: vim = {} # NOQA from powerline.theme import requires_segment_info -from powerline.bindings.vim import (current_tabpage, list_tabpages) +from powerline.bindings.vim import (current_tabpage, list_tabpages, vim_getbufoption) def tabpage_updated_segment_info(segment_info, tabpage): @@ -57,7 +57,7 @@ def tablister(pl, segment_info, **kwargs): ] -def buffer_updated_segment_info(segment_info, buffer): +def buffer_updated_segment_info(segment_info, buffer, mode): segment_info = segment_info.copy() segment_info.update( window=None, @@ -65,20 +65,25 @@ def buffer_updated_segment_info(segment_info, buffer): window_id=None, buffer=buffer, bufnr=buffer.number, + mode=mode, ) return segment_info @requires_segment_info -def bufferlister(pl, segment_info, **kwargs): +def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): '''List all buffers in segment_info format Specifically generates a list of segment info dictionaries with ``buffer`` and ``bufnr`` keys set to buffer-specific ones, ``window``, ``winnr`` and - ``window_id`` keys unset. + ``window_id`` keys set to None. Sets segment ``mode`` to either ``buf`` (for current buffer) or ``nc`` (for all other buffers). + + :param bool show_unlisted: + True if unlisted buffers should be shown as well. Current buffer is + always shown. ''' cur_buffer = vim.current.buffer cur_bufnr = cur_buffer.number @@ -89,10 +94,21 @@ def bufferlister(pl, segment_info, **kwargs): return [ ( - buffer_updated_segment_info(segment_info, buffer), - add_multiplier(buffer, {'mode': ('tab' if buffer == cur_buffer else 'nc')}) + buf_segment_info, + add_multiplier(buf_segment_info['buffer'], {'mode': buf_segment_info['mode']}) + ) + for buf_segment_info in ( + buffer_updated_segment_info( + segment_info, + buffer, + ('buf' if buffer is cur_buffer else 'nc') + ) + for buffer in vim.buffers + ) if ( + buf_segment_info['buffer'] is cur_buffer + or show_unlisted + or int(vim_getbufoption(buf_segment_info, 'buflisted')) ) - for buffer in vim.buffers ] From ff2009d5e3473396fc798762df589f9db5bfe8dd Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:03:40 +0400 Subject: [PATCH 04/16] Update mode in segment_info in tabpage lister --- powerline/listers/vim.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py index e59e623b..95378c38 100644 --- a/powerline/listers/vim.py +++ b/powerline/listers/vim.py @@ -11,7 +11,7 @@ from powerline.theme import requires_segment_info from powerline.bindings.vim import (current_tabpage, list_tabpages, vim_getbufoption) -def tabpage_updated_segment_info(segment_info, tabpage): +def tabpage_updated_segment_info(segment_info, tabpage, mode): segment_info = segment_info.copy() window = tabpage.window buffer = window.buffer @@ -23,6 +23,7 @@ def tabpage_updated_segment_info(segment_info, tabpage): window_id=int(window.vars.get('powerline_window_id', -1)), buffer=buffer, bufnr=buffer.number, + mode=mode, ) return segment_info @@ -49,10 +50,10 @@ def tablister(pl, segment_info, **kwargs): return dct return [ - ( - tabpage_updated_segment_info(segment_info, tabpage), - add_multiplier(tabpage, {'mode': ('tab' if tabpage == cur_tabpage else 'nc')}) - ) + (lambda mode: ( + tabpage_updated_segment_info(segment_info, tabpage, mode), + add_multiplier(tabpage, {'mode': mode}) + ))('tab' if tabpage == cur_tabpage else 'nc') for tabpage in list_tabpages() ] From 24938e0bb91f4eb636577dd921a9ea16f9b06940 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:06:19 +0400 Subject: [PATCH 05/16] Remove duplicate information from configuration/segments.rst --- docs/source/configuration/segments.rst | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/source/configuration/segments.rst b/docs/source/configuration/segments.rst index e6e48f36..ce32302a 100644 --- a/docs/source/configuration/segments.rst +++ b/docs/source/configuration/segments.rst @@ -15,13 +15,7 @@ Segments are regular Python functions, and they may accept arguments. All arguments should have a default value which will be used for themes that don't provide an ``args`` dict. -A segment function must return one of the following values: - -* ``None``, which will remove the segment from the prompt/statusline. -* A string, which will be the segment contents. -* A list of dicts consisting of a ``contents`` string, and - a ``highlight_group`` list. This is useful for providing a particular - highlighting group depending on the segment contents. +More information is available in :ref:`Writing segments ` section. Available segments ================== From 402cc9e9111c1368a273ea918f1d3bf53807b6a5 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:21:46 +0400 Subject: [PATCH 06/16] Also show documentation for plugin-specific segments --- docs/source/configuration/segments/vim.rst | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/docs/source/configuration/segments/vim.rst b/docs/source/configuration/segments/vim.rst index 5d6c31a9..ace646c4 100644 --- a/docs/source/configuration/segments/vim.rst +++ b/docs/source/configuration/segments/vim.rst @@ -4,3 +4,31 @@ Vim segments .. automodule:: powerline.segments.vim :members: + + +Plugin-specific segments +======================== + +Syntastic segments +------------------ + +.. automodule:: powerline.segments.vim.plugin.syntastic + :members: + +Ctrl-P segments +--------------- + +.. automodule:: powerline.segments.vim.plugin.ctrlp + :members: + +Tagbar segments +--------------- + +.. automodule:: powerline.segments.vim.plugin.tagbar + :members: + +NERDTree segments +----------------- + +.. automodule:: powerline.segments.vim.plugin.nerdtree + :members: From c3099ce48b25bd6496be1aaca9c482dee65b883e Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:22:31 +0400 Subject: [PATCH 07/16] Add lister reference --- docs/source/configuration.rst | 1 + docs/source/configuration/listers.rst | 21 +++++++++++++++++++++ docs/source/develop/segments.rst | 2 ++ 3 files changed, 24 insertions(+) create mode 100644 docs/source/configuration/listers.rst diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst index 88663a6c..8ed3fe7d 100644 --- a/docs/source/configuration.rst +++ b/docs/source/configuration.rst @@ -133,4 +133,5 @@ References configuration/reference configuration/segments + configuration/listers configuration/local diff --git a/docs/source/configuration/listers.rst b/docs/source/configuration/listers.rst new file mode 100644 index 00000000..c0db03d0 --- /dev/null +++ b/docs/source/configuration/listers.rst @@ -0,0 +1,21 @@ +**************** +Lister reference +**************** + +Listers are special segment collections which allow to show some list of +segments for each entity in the list of entities (multiply their segments list +by a list of entities). E.g. ``powerline.listers.vim.tablister`` presented with +``powerline.segments.vim.tabnr`` and ``….file_name`` as segments will emit +segments with buffer names and tabpage numbers for each tabpage shown by vim. + +Listers appear in configuration as irregular segments having ``segment_list`` as +their type and ``segments`` key with a list of segments (a bit more details in +:ref:`Themes section of configuration reference `). + +Currently only Vim listers are available. + +Vim listers +----------- + +.. automodule:: powerline.listers.vim + :members: diff --git a/docs/source/develop/segments.rst b/docs/source/develop/segments.rst index 592f3052..2c9aecc1 100644 --- a/docs/source/develop/segments.rst +++ b/docs/source/develop/segments.rst @@ -1,3 +1,5 @@ +.. _dev-segments: + **************** Writing segments **************** From a3324134d11bd3957406973c80635a5f60ee1b01 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:33:59 +0400 Subject: [PATCH 08/16] Use generators in place of list comprehension in listers --- powerline/listers/vim.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py index 95378c38..aa7449bd 100644 --- a/powerline/listers/vim.py +++ b/powerline/listers/vim.py @@ -49,13 +49,13 @@ def tablister(pl, segment_info, **kwargs): dct['priority_multiplier'] = 1 + (0.001 * abs(tabpage.number - cur_tabnr)) return dct - return [ - (lambda mode: ( + return ( + (lambda tabpage, mode: ( tabpage_updated_segment_info(segment_info, tabpage, mode), add_multiplier(tabpage, {'mode': mode}) - ))('tab' if tabpage == cur_tabpage else 'nc') + ))(tabpage, 'tab' if tabpage == cur_tabpage else 'nc') for tabpage in list_tabpages() - ] + ) def buffer_updated_segment_info(segment_info, buffer, mode): @@ -93,7 +93,7 @@ def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): dct['priority_multiplier'] = 1 + (0.001 * abs(buffer.number - cur_bufnr)) return dct - return [ + return ( ( buf_segment_info, add_multiplier(buf_segment_info['buffer'], {'mode': buf_segment_info['mode']}) @@ -110,7 +110,7 @@ def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): or show_unlisted or int(vim_getbufoption(buf_segment_info, 'buflisted')) ) - ] + ) @requires_segment_info From d1782d4aafae5e90e8d4aee0383b677fb2d2541e Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:43:22 +0400 Subject: [PATCH 09/16] Add documentation about creating listers --- docs/source/configuration/listers.rst | 2 ++ docs/source/develop.rst | 1 + docs/source/develop/listers.rst | 45 +++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 docs/source/develop/listers.rst diff --git a/docs/source/configuration/listers.rst b/docs/source/configuration/listers.rst index c0db03d0..107159a1 100644 --- a/docs/source/configuration/listers.rst +++ b/docs/source/configuration/listers.rst @@ -12,6 +12,8 @@ Listers appear in configuration as irregular segments having ``segment_list`` as their type and ``segments`` key with a list of segments (a bit more details in :ref:`Themes section of configuration reference `). +More information in :ref:`Writing listers ` section. + Currently only Vim listers are available. Vim listers diff --git a/docs/source/develop.rst b/docs/source/develop.rst index e7b29cc7..6ee44f27 100644 --- a/docs/source/develop.rst +++ b/docs/source/develop.rst @@ -7,5 +7,6 @@ Developer guide :glob: develop/segments + develop/listers develop/local-themes develop/extensions diff --git a/docs/source/develop/listers.rst b/docs/source/develop/listers.rst new file mode 100644 index 00000000..dc027511 --- /dev/null +++ b/docs/source/develop/listers.rst @@ -0,0 +1,45 @@ +.. _dev-listers: + +*************** +Writing listers +*************** + +Listers allow you to show some segments multiple times: once per each entity +(buffer, tabpage, etc) lister knows. They are functions which receive the +following arguments: + +``pl`` + A :py:class:`powerline.PowerlineLogger` class instance. It must be used for + logging. + +``segment_info`` + Base segment info dictionary. Lister function or class must have + ``powerline_requires_segment_info`` to receive this argument. + + .. warning:: + Listers are close to useless if they do not have access to this + argument. + + Refer to :ref:`segment_info detailed description ` for + further details. + +And also any other argument(s) specified by user in :ref:`args key +` (no additional arguments by default). + +Listers must return a sequence of pairs. First item in the pair must contain +a ``segment_info`` dictionary specific to one of the listed entities. + +Second item must contain another dictionary: it will be used to modify the +resulting segment. In addition to usual keys that describe segment the following +keys may be present (it is advised that *only* the following keys will be used): + +``mode`` + Segment-specific mode. Used to alter segment highlighting. + +``priority_multiplier`` + Value (usually a ``float``) used to multiply segment priority. It is useful + for finer-grained controlling which segments disappear first: e.g. when + listing tab pages make first disappear directory names of the tabpages which + are most far away from current tabpage, then (when all directory names + disappeared) buffer names. Check out existing listers implementation in + :file:`powerline/listers/vim.py`. From ac7a9596ab2e2a5669d4c6abc4bdd3d4e23f2f07 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:46:14 +0400 Subject: [PATCH 10/16] Remove nonlocal image URLs from overview --- docs/source/overview.rst | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/source/overview.rst b/docs/source/overview.rst index ed2abefd..b599b349 100644 --- a/docs/source/overview.rst +++ b/docs/source/overview.rst @@ -48,20 +48,20 @@ Vim statusline **Mode-dependent highlighting** -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-mode-normal.png +* .. image:: _static/img/pl-mode-normal.png :alt: Normal mode -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-mode-insert.png +* .. image:: _static/img/pl-mode-insert.png :alt: Insert mode -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-mode-visual.png +* .. image:: _static/img/pl-mode-visual.png :alt: Visual mode -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-mode-replace.png +* .. image:: _static/img/pl-mode-replace.png :alt: Replace mode **Automatic truncation of segments in small windows** -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-truncate1.png +* .. image:: _static/img/pl-truncate1.png :alt: Truncation illustration -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-truncate2.png +* .. image:: _static/img/pl-truncate2.png :alt: Truncation illustration -* .. image:: https://raw.github.com/Lokaltog/powerline/develop/docs/source/_static/img/pl-truncate3.png +* .. image:: _static/img/pl-truncate3.png :alt: Truncation illustration From 096c4801b02b40217d7898a67105c3431c374bad Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:51:26 +0400 Subject: [PATCH 11/16] Use buf_nc and tab_nc modes in listers --- .../colorschemes/vim/default.json | 38 +++++++++++++++++++ .../colorschemes/vim/solarized.json | 20 ++++++++++ .../colorschemes/vim/solarizedlight.json | 20 ++++++++++ .../config_files/themes/vim/tabline.json | 2 +- powerline/lint/__init__.py | 2 +- powerline/listers/vim.py | 8 ++-- 6 files changed, 84 insertions(+), 6 deletions(-) diff --git a/powerline/config_files/colorschemes/vim/default.json b/powerline/config_files/colorschemes/vim/default.json index b4f1b483..3f2afb31 100644 --- a/powerline/config_files/colorschemes/vim/default.json +++ b/powerline/config_files/colorschemes/vim/default.json @@ -51,6 +51,44 @@ "dark_green_gray": "gray5" } }, + "tab_nc": { + "colors": { + "brightyellow": "darkorange", + "brightestred": "darkred", + "gray0": "gray0", + "gray1": "gray0", + "gray2": "gray0", + "gray3": "gray1", + "gray4": "gray1", + "gray5": "gray1", + "gray6": "gray1", + "gray7": "gray4", + "gray8": "gray4", + "gray9": "gray4", + "gray10": "gray5", + "white": "gray6", + "dark_green_gray": "gray5" + } + }, + "buf_nc": { + "colors": { + "brightyellow": "darkorange", + "brightestred": "darkred", + "gray0": "gray0", + "gray1": "gray0", + "gray2": "gray0", + "gray3": "gray1", + "gray4": "gray1", + "gray5": "gray1", + "gray6": "gray1", + "gray7": "gray4", + "gray8": "gray4", + "gray9": "gray4", + "gray10": "gray5", + "white": "gray6", + "dark_green_gray": "gray5" + } + }, "i": { "colors": { "gray0": "darkestblue", diff --git a/powerline/config_files/colorschemes/vim/solarized.json b/powerline/config_files/colorschemes/vim/solarized.json index a3703d74..f7f393fe 100644 --- a/powerline/config_files/colorschemes/vim/solarized.json +++ b/powerline/config_files/colorschemes/vim/solarized.json @@ -43,6 +43,26 @@ "oldlace": "gray61" } }, + "tab_nc": { + "colors": { + "darkgreencopper": "royalblue5", + "lightskyblue4": "royalblue5", + "azure4": "darkgreencopper", + "gray61": "lightskyblue4", + "lightyellow": "azure4", + "oldlace": "gray61" + } + }, + "buf_nc": { + "colors": { + "darkgreencopper": "royalblue5", + "lightskyblue4": "royalblue5", + "azure4": "darkgreencopper", + "gray61": "lightskyblue4", + "lightyellow": "azure4", + "oldlace": "gray61" + } + }, "i": { "groups": { "background": { "fg": "oldlace", "bg": "darkgreencopper", "attr": [] }, diff --git a/powerline/config_files/colorschemes/vim/solarizedlight.json b/powerline/config_files/colorschemes/vim/solarizedlight.json index cd86a7a8..cab94968 100644 --- a/powerline/config_files/colorschemes/vim/solarizedlight.json +++ b/powerline/config_files/colorschemes/vim/solarizedlight.json @@ -43,6 +43,26 @@ "gray13": "gray61" } }, + "tab_nc": { + "colors": { + "lightyellow": "darkgreencopper", + "azure4": "darkgreencopper", + "lightskyblue4": "lightyellow", + "gray61": "azure4", + "royalblue5": "lightskyblue4", + "gray13": "gray61" + } + }, + "buf_nc": { + "colors": { + "lightyellow": "darkgreencopper", + "azure4": "darkgreencopper", + "lightskyblue4": "lightyellow", + "gray61": "azure4", + "royalblue5": "lightskyblue4", + "gray13": "gray61" + } + }, "i": { "groups": { "background": { "fg": "gray13", "bg": "lightyellow", "attr": [] }, diff --git a/powerline/config_files/themes/vim/tabline.json b/powerline/config_files/themes/vim/tabline.json index d252b073..c51d66fa 100644 --- a/powerline/config_files/themes/vim/tabline.json +++ b/powerline/config_files/themes/vim/tabline.json @@ -11,7 +11,7 @@ "name": "tabnr", "after": " ", "draw_soft_divider": false, - "exclude_modes": ["tab", "buf"], + "exclude_modes": ["tab", "buf", "buf_nc"], "priority": 5 }, { diff --git a/powerline/lint/__init__.py b/powerline/lint/__init__.py index 995bc1f6..d9eb1112 100644 --- a/powerline/lint/__init__.py +++ b/powerline/lint/__init__.py @@ -733,7 +733,7 @@ top_colorscheme_spec = (Spec( mode_translations_value_spec(), ).optional().context_message('Error while loading mode translations (key {key})').optional(), ).context_message('Error while loading top-level coloscheme')) -vim_mode_spec = Spec().oneof(set(list(vim_modes) + ['nc'])).copy +vim_mode_spec = Spec().oneof(set(list(vim_modes) + ['nc', 'tab_nc', 'buf_nc'])).copy vim_colorscheme_spec = (Spec( name=name_spec(), groups=groups_spec(), diff --git a/powerline/listers/vim.py b/powerline/listers/vim.py index aa7449bd..b8d38ecb 100644 --- a/powerline/listers/vim.py +++ b/powerline/listers/vim.py @@ -36,7 +36,7 @@ def tablister(pl, segment_info, **kwargs): ``winnr``, ``window_id``, ``buffer`` and ``bufnr`` keys set to tab-local ones and additional ``tabpage`` and ``tabnr`` keys. - Sets segment ``mode`` to either ``tab`` (for current tab page) or ``nc`` + Sets segment ``mode`` to either ``tab`` (for current tab page) or ``tab_nc`` (for all other tab pages). Works best with vim-7.4 or later: earlier versions miss tabpage object and @@ -53,7 +53,7 @@ def tablister(pl, segment_info, **kwargs): (lambda tabpage, mode: ( tabpage_updated_segment_info(segment_info, tabpage, mode), add_multiplier(tabpage, {'mode': mode}) - ))(tabpage, 'tab' if tabpage == cur_tabpage else 'nc') + ))(tabpage, 'tab' if tabpage == cur_tabpage else 'tab_nc') for tabpage in list_tabpages() ) @@ -79,7 +79,7 @@ def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): and ``bufnr`` keys set to buffer-specific ones, ``window``, ``winnr`` and ``window_id`` keys set to None. - Sets segment ``mode`` to either ``buf`` (for current buffer) or ``nc`` + Sets segment ``mode`` to either ``buf`` (for current buffer) or ``buf_nc`` (for all other buffers). :param bool show_unlisted: @@ -102,7 +102,7 @@ def bufferlister(pl, segment_info, show_unlisted=False, **kwargs): buffer_updated_segment_info( segment_info, buffer, - ('buf' if buffer is cur_buffer else 'nc') + ('buf' if buffer is cur_buffer else 'buf_nc') ) for buffer in vim.buffers ) if ( From 407a8bca7e094efdea245a832f8e0b090723df09 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 13:59:00 +0400 Subject: [PATCH 12/16] Fix incorrect description of draw_inner_divider --- docs/source/develop/segments.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/develop/segments.rst b/docs/source/develop/segments.rst index 2c9aecc1..d1214bed 100644 --- a/docs/source/develop/segments.rst +++ b/docs/source/develop/segments.rst @@ -61,8 +61,8 @@ Detailed description of used dictionary keys: .. _dev-segments-draw_inner_divider: ``draw_inner_divider`` - Determines whether *any* divider between segments returned by function - should be drawn. Defaults to ``False``. + Determines whether soft divider between segments returned by function should + be drawn. Defaults to ``False``. .. _dev-segments-highlight_group: From 6106e914e3fbc753dffcab95f26f21979ab49b38 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 14:00:08 +0400 Subject: [PATCH 13/16] Remove duplicate documentation of draw_inner_divider --- docs/source/configuration/reference.rst | 2 ++ docs/source/develop/segments.rst | 14 ++++---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/source/configuration/reference.rst b/docs/source/configuration/reference.rst index 9d166292..12966b45 100644 --- a/docs/source/configuration/reference.rst +++ b/docs/source/configuration/reference.rst @@ -448,6 +448,8 @@ ascii Theme without any unicode characters at all background colors, soft ones are used between segments with same background. Both options default to ``True``. + .. _config-themes-seg-draw_inner_divider: + ``draw_inner_divider`` Determines whether inner soft dividers are to be drawn for function segments. Only applicable for functions returning multiple segments. diff --git a/docs/source/develop/segments.rst b/docs/source/develop/segments.rst index d1214bed..63ea35db 100644 --- a/docs/source/develop/segments.rst +++ b/docs/source/develop/segments.rst @@ -53,16 +53,10 @@ Detailed description of used dictionary keys: Text displayed by segment. Should be a ``unicode`` (Python2) or ``str`` (Python3) instance. -``draw_hard_divider``, ``draw_soft_divider`` - Determines whether given divider should be drawn. Both have the same meaning - as :ref:`the similar keys in configuration - `. - -.. _dev-segments-draw_inner_divider: - -``draw_inner_divider`` - Determines whether soft divider between segments returned by function should - be drawn. Defaults to ``False``. +``draw_hard_divider``, ``draw_soft_divider``, ``draw_inner_divider`` + Determines whether given divider should be drawn. All have the same meaning + as :ref:`the similar keys in configuration ` + (:ref:`draw_inner_divider `). .. _dev-segments-highlight_group: From a792fb0e1c215429ac0121de28382329d5634b31 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 14:25:12 +0400 Subject: [PATCH 14/16] Add support for `draw_inner_divider` in listers --- docs/source/develop/listers.rst | 6 ++++++ powerline/config_files/themes/vim/tabline.json | 2 -- powerline/segment.py | 6 ++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/source/develop/listers.rst b/docs/source/develop/listers.rst index dc027511..8c7b439e 100644 --- a/docs/source/develop/listers.rst +++ b/docs/source/develop/listers.rst @@ -23,6 +23,12 @@ following arguments: Refer to :ref:`segment_info detailed description ` for further details. +``draw_inner_divider`` + If False (default) soft dividers between segments in the listed group will + not be drawn regardless of actual segment settings. If True they will be + drawn, again regardless of actual segment settings. Set it to ``None`` in + order to respect segment settings. + And also any other argument(s) specified by user in :ref:`args key ` (no additional arguments by default). diff --git a/powerline/config_files/themes/vim/tabline.json b/powerline/config_files/themes/vim/tabline.json index c51d66fa..d4a9e69b 100644 --- a/powerline/config_files/themes/vim/tabline.json +++ b/powerline/config_files/themes/vim/tabline.json @@ -10,13 +10,11 @@ { "name": "tabnr", "after": " ", - "draw_soft_divider": false, "exclude_modes": ["tab", "buf", "buf_nc"], "priority": 5 }, { "name": "file_directory", - "draw_soft_divider": false, "priority": 40 }, { diff --git a/powerline/segment.py b/powerline/segment.py index cde42398..a1958d0e 100644 --- a/powerline/segment.py +++ b/powerline/segment.py @@ -95,6 +95,8 @@ def get_attr_func(contents_func, key, args): def process_segment_lister(pl, segment_info, parsed_segments, side, lister, subsegments, patcher_args): for subsegment_info, subsegment_update in lister(pl=pl, segment_info=segment_info, **patcher_args): + draw_inner_divider = subsegment_update.pop('draw_inner_divider', False) + old_pslen = len(parsed_segments) for subsegment in subsegments: if subsegment_update: subsegment = subsegment.copy() @@ -102,6 +104,10 @@ def process_segment_lister(pl, segment_info, parsed_segments, side, lister, subs if subsegment_update['priority_multiplier'] and subsegment['priority']: subsegment['priority'] *= subsegment_update['priority_multiplier'] process_segment(pl, side, subsegment_info, parsed_segments, subsegment) + new_pslen = len(parsed_segments) + if new_pslen > old_pslen + 1 and draw_inner_divider is not None: + for i in range(old_pslen, new_pslen - 1) if side == 'left' else range(old_pslen + 1, new_pslen): + parsed_segments[i]['draw_soft_divider'] = draw_inner_divider return None From 31731a93daf0c6419bbcd2064109e483f4a6ae01 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 14:25:43 +0400 Subject: [PATCH 15/16] Add bufnr and modified_indicator segments to tabline --- powerline/config_files/colorschemes/vim/__main__.json | 2 +- powerline/config_files/themes/vim/tabline.json | 11 +++++++++++ tests/test_tabline.vim | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/powerline/config_files/colorschemes/vim/__main__.json b/powerline/config_files/colorschemes/vim/__main__.json index ea9ba29e..e7d995b8 100644 --- a/powerline/config_files/colorschemes/vim/__main__.json +++ b/powerline/config_files/colorschemes/vim/__main__.json @@ -15,7 +15,7 @@ "position": "information:additional", "single_tab": "line_current", "many_tabs": "line_current", - "bufnr": "information:unimportant", + "bufnr": "file_directory", "winnr": "information:unimportant", "tabnr": "file_directory" } diff --git a/powerline/config_files/themes/vim/tabline.json b/powerline/config_files/themes/vim/tabline.json index d4a9e69b..42aed081 100644 --- a/powerline/config_files/themes/vim/tabline.json +++ b/powerline/config_files/themes/vim/tabline.json @@ -13,6 +13,12 @@ "exclude_modes": ["tab", "buf", "buf_nc"], "priority": 5 }, + { + "name": "bufnr", + "after": " ", + "exclude_modes": ["tab", "buf", "tab_nc"], + "priority": 5 + }, { "name": "file_directory", "priority": 40 @@ -23,6 +29,11 @@ "display_no_file": true }, "priority": 10 + }, + { + "name": "modified_indicator", + "exclude_modes": ["tab", "tab_nc"], + "priority": 5 } ] }, diff --git a/tests/test_tabline.vim b/tests/test_tabline.vim index 3819e74b..8e2cca40 100755 --- a/tests/test_tabline.vim +++ b/tests/test_tabline.vim @@ -26,7 +26,7 @@ catch cquit endtry -if result isnot# '%#Pl_240_5789784_235_2500134_NONE# ./%#Pl_244_8421504_235_2500134_bold#abc %#Pl_244_8421504_235_2500134_NONE# %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#def %#Pl_235_2500134_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                               %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Bufs ' +if result isnot# '%#Pl_240_5789784_235_2500134_NONE# 1 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#abc %#Pl_244_8421504_235_2500134_NONE# %#Pl_240_5789784_235_2500134_NONE#2 %#Pl_240_5789784_235_2500134_NONE#./%#Pl_244_8421504_235_2500134_bold#def %#Pl_235_2500134_240_5789784_NONE# %#Pl_250_12369084_240_5789784_NONE#./%#Pl_231_16777215_240_5789784_bold#ghi %#Pl_240_5789784_236_3158064_NONE# %#Pl_231_16777215_236_3158064_NONE#                                           %#Pl_252_13684944_236_3158064_NONE# %#Pl_235_2500134_252_13684944_bold# Bufs ' call writefile(['Unexpected tabline (2)', result], 'message.fail') cquit endif From 62e8e78866a5d941ce701a2186bcc251896ac6e6 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 16 Aug 2014 14:36:48 +0400 Subject: [PATCH 16/16] Fix exclude_/include_modes support with new segment['mode'] key --- powerline/renderer.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/powerline/renderer.py b/powerline/renderer.py index ec84e198..204a328d 100644 --- a/powerline/renderer.py +++ b/powerline/renderer.py @@ -258,12 +258,14 @@ class Renderer(object): # Handle excluded/included segments for the current mode segments = [ self._get_highlighting(segment, segment['mode'] or mode) - for segment in segments - if ( - mode not in segment['exclude_modes'] + for segment, segment_mode in ( + (segment, segment['mode']) + for segment in segments + ) if ( + segment_mode not in segment['exclude_modes'] and ( not segment['include_modes'] - or mode in segment['include_modes'] + or segment_mode in segment['include_modes'] ) ) ]