Allow tab title templates to use the current max title length

This commit is contained in:
Kovid Goyal 2022-07-29 07:43:55 +05:30
parent 6b2337c9c0
commit 0ce2a23af3
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 23 additions and 12 deletions

View File

@ -1163,11 +1163,16 @@ A template to render the tab title. The default just renders the title with
optional symbols for bell and activity. If you wish to include the tab-index as optional symbols for bell and activity. If you wish to include the tab-index as
well, use something like: :code:`{index}:{title}`. Useful if you have shortcuts well, use something like: :code:`{index}:{title}`. Useful if you have shortcuts
mapped for :code:`goto_tab N`. If you prefer to see the index as a superscript, mapped for :code:`goto_tab N`. If you prefer to see the index as a superscript,
use :code:`{sup.index}`. In addition you can use :code:`{layout_name}` for the use :code:`{sup.index}`. All data available is:
current layout name, :code:`{num_windows}` for the number of windows in the tab,
:code:`{num_window_groups}` for the number of window groups (not counting * :code:`title` - the current tab title
overlay windows) in the tab, and :code:`{tab.active_wd}` for the working directory * :code:`index` - the tab index useable with :code:`goto_tab N` shortcuts
of the active_window. * :code:`layout_name` - the current layout name
* :code:`num_windows` - the number of windows in the tab
* :code:`num_window_groups` - the number of window groups (not counting overlay windows) in the tab
* :code:`tab.active_wd` - the working directory of the currently active window in the tab (expensive, requires syscall)
* :code:`max_title_length` - the maximum title length available
Note that formatting is done by Python's string formatting machinery, so you can Note that formatting is done by Python's string formatting machinery, so you can
use, for instance, :code:`{layout_name[:2].upper()}` to show only the first two use, for instance, :code:`{layout_name[:2].upper()}` to show only the first two
letters of the layout name, upper-cased. If you want to style the text, you can letters of the layout name, upper-cased. If you want to style the text, you can

View File

@ -184,7 +184,12 @@ class TabAccessor:
return (tab.get_cwd_of_active_window() if tab else '') or '' return (tab.get_cwd_of_active_window() if tab else '') or ''
def draw_title(draw_data: DrawData, screen: Screen, tab: TabBarData, index: int) -> None: safe_builtins = {
'max': max, 'min': min, 'str': str, 'repr': repr, 'abs': abs, 'len': len,
}
def draw_title(draw_data: DrawData, screen: Screen, tab: TabBarData, index: int, max_title_length: int = 0) -> None:
ta = TabAccessor(tab.tab_id) ta = TabAccessor(tab.tab_id)
data = { data = {
'index': index, 'index': index,
@ -208,6 +213,7 @@ def draw_title(draw_data: DrawData, screen: Screen, tab: TabBarData, index: int)
'sub': SupSub(data, True), 'sub': SupSub(data, True),
'bell_symbol': draw_data.bell_on_tab if tab.needs_attention else '', 'bell_symbol': draw_data.bell_on_tab if tab.needs_attention else '',
'activity_symbol': draw_data.tab_activity_symbol if tab.has_activity_since_last_focus else '', 'activity_symbol': draw_data.tab_activity_symbol if tab.has_activity_since_last_focus else '',
'max_title_length': max_title_length,
} }
template = draw_data.title_template template = draw_data.title_template
if tab.is_active and draw_data.active_title_template is not None: if tab.is_active and draw_data.active_title_template is not None:
@ -220,7 +226,7 @@ def draw_title(draw_data: DrawData, screen: Screen, tab: TabBarData, index: int)
if prefix: if prefix:
template = '{fmt.fg.red}' + prefix + '{fmt.fg.tab}' + template template = '{fmt.fg.red}' + prefix + '{fmt.fg.tab}' + template
try: try:
title = eval(compile_template(template), {'__builtins__': {}}, eval_locals) title = eval(compile_template(template), {'__builtins__': safe_builtins}, eval_locals)
except Exception as e: except Exception as e:
report_template_failure(template, str(e)) report_template_failure(template, str(e))
title = tab.title title = tab.title
@ -259,7 +265,7 @@ def draw_tab_with_slant(
else: else:
draw_sep(left_sep) draw_sep(left_sep)
screen.draw(' ') screen.draw(' ')
draw_title(draw_data, screen, tab, index) draw_title(draw_data, screen, tab, index, max_title_length)
extra = screen.cursor.x - before - max_title_length extra = screen.cursor.x - before - max_title_length
if extra >= 0: if extra >= 0:
screen.cursor.x -= extra + 3 screen.cursor.x -= extra + 3
@ -280,7 +286,7 @@ def draw_tab_with_separator(
) -> int: ) -> int:
if draw_data.leading_spaces: if draw_data.leading_spaces:
screen.draw(' ' * draw_data.leading_spaces) screen.draw(' ' * draw_data.leading_spaces)
draw_title(draw_data, screen, tab, index) draw_title(draw_data, screen, tab, index, max_title_length)
trailing_spaces = min(max_title_length - 1, draw_data.trailing_spaces) trailing_spaces = min(max_title_length - 1, draw_data.trailing_spaces)
max_title_length -= trailing_spaces max_title_length -= trailing_spaces
extra = screen.cursor.x - before - max_title_length extra = screen.cursor.x - before - max_title_length
@ -311,11 +317,11 @@ def draw_tab_with_fade(
screen.cursor.bg = bg screen.cursor.bg = bg
screen.draw(' ') screen.draw(' ')
screen.cursor.bg = orig_bg screen.cursor.bg = orig_bg
draw_title(draw_data, screen, tab, index) draw_title(draw_data, screen, tab, index, max(0, max_title_length - 8))
extra = screen.cursor.x - before - max_title_length extra = screen.cursor.x - before - max_title_length
if extra > 0: if extra > 0:
screen.cursor.x = before screen.cursor.x = before
draw_title(draw_data, screen, tab, index) draw_title(draw_data, screen, tab, index, max(0, max_title_length - 8))
extra = screen.cursor.x - before - max_title_length extra = screen.cursor.x - before - max_title_length
if extra > 0: if extra > 0:
screen.cursor.x -= extra + 1 screen.cursor.x -= extra + 1
@ -366,7 +372,7 @@ def draw_tab_with_powerline(
if min_title_length >= max_title_length: if min_title_length >= max_title_length:
screen.draw('') screen.draw('')
else: else:
draw_title(draw_data, screen, tab, index) draw_title(draw_data, screen, tab, index, max_title_length)
extra = screen.cursor.x + start_draw - before - max_title_length extra = screen.cursor.x + start_draw - before - max_title_length
if extra > 0 and extra + 1 < screen.cursor.x: if extra > 0 and extra + 1 < screen.cursor.x:
screen.cursor.x -= extra + 1 screen.cursor.x -= extra + 1