aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorCan Celik <ogulcancelik@gmail.com>2026-08-10 01:20:09 +0300
committerGitHub <noreply@github.com>2026-08-10 01:20:09 +0300
commite48d83067a5a9b05dfd0a82761068866ab2d294d (patch)
tree159b92f857f85e40037879c7f32da4957093597b /scripts
parente2aa86a9e8b6445488ef11b2c0a8b4c22a6f79ce (diff)
feat: add configurable tab bar status (#2586)
* feat: show a zoom indicator in the desktop tab bar Reserve the right edge of the tab row for a ZOOM pill while the focused pane is zoomed, matching the accent style of the mode bars. The per-tab Z suffix stays; the pill makes the zoomed state visible at a glance like tmux's status-right flag. * feat: optionally show the hostname in the desktop tab bar Add ui.tab_bar_hostname to display the machine's hostname at the right edge of the tab row, like tmux's #h in status-right. The value resolves where the server renders, so remote sessions show the remote host. Off by default. * fix: strip control characters from the tab bar hostname * fix: hide the hostname when it would squeeze out the tab strip * feat: add configurable tab bar status * fix: harden tab bar status updates * fix: terminate tab bar status process trees * fix: disable status commands on unsupported platforms * fix: skip unchanged status command renders * fix: keep tab bar status opt-in by default --------- Co-authored-by: David Heinemeier Hansson <david@hey.com>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/config_reference_check.py6
-rw-r--r--scripts/test_config_reference_check.py19
2 files changed, 23 insertions, 2 deletions
diff --git a/scripts/config_reference_check.py b/scripts/config_reference_check.py
index f9aa5e72..c23b284b 100644
--- a/scripts/config_reference_check.py
+++ b/scripts/config_reference_check.py
@@ -35,7 +35,9 @@ SKIPPED_SUBTREES = ("keys.command",)
FIELD_RE = re.compile(r"^\s*pub ([a-z_][a-z0-9_]*):\s*(.+?),?\s*$")
STRUCT_RE = re.compile(r"^\s*pub(?:\(crate\))? struct ([A-Za-z0-9_]+)\s*\{\s*$")
ENUM_RE = re.compile(r"^\s*pub(?:\(crate\))? enum ([A-Za-z0-9_]+)\s*\{\s*$")
-VARIANT_RE = re.compile(r"^\s*([A-Z][A-Za-z0-9_]*)\s*(?:\(.*\))?\s*,?\s*$")
+VARIANT_RE = re.compile(
+ r"^\s*([A-Z][A-Za-z0-9_]*)\s*(?:\(.*\)|\{)?\s*,?\s*$"
+)
RENAME_ALL_RE = re.compile(r'rename_all\s*=\s*"([^"]+)"')
RENAME_RE = re.compile(r'rename\s*=\s*"([^"]+)"')
@@ -190,11 +192,11 @@ def parse_enum_body(
index += 1
break
- depth += stripped.count("{") - stripped.count("}")
if depth == 0 and not stripped.startswith(("#[", "///")):
match = VARIANT_RE.match(stripped)
if match:
variants.append(apply_rename_all(match.group(1), rename_all or "lowercase"))
+ depth += stripped.count("{") - stripped.count("}")
index += 1
model.enums[name] = variants
diff --git a/scripts/test_config_reference_check.py b/scripts/test_config_reference_check.py
index 317aae8a..b5a804b1 100644
--- a/scripts/test_config_reference_check.py
+++ b/scripts/test_config_reference_check.py
@@ -32,6 +32,8 @@ pub struct UiConfig {
pub sidebar_width: u16,
/// Host cursor policy. Default: auto.
pub host_cursor: HostCursorModeConfig,
+ /// Tab bar status entries.
+ pub tab_bar_right: Vec<TabBarRightEntryConfig>,
#[serde(rename = "accent_color")]
pub accent: String,
#[serde(skip)]
@@ -64,6 +66,19 @@ pub enum HostCursorModeConfig {
}
#[derive(Debug, Deserialize)]
+#[serde(tag = "type", rename_all = "snake_case")]
+pub enum TabBarRightEntryConfig {
+ Hostname,
+ Datetime {
+ format: String,
+ },
+ Command {
+ command: String,
+ interval_seconds: u64,
+ },
+}
+
+#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub enum BindingConfig {
One(String),
@@ -129,6 +144,10 @@ class CollectKeysTests(unittest.TestCase):
self.assertEqual(
entries["ui.host_cursor"]["values"], ["auto", "native-cursor", "drawn"]
)
+ self.assertEqual(
+ entries["ui.tab_bar_right"]["values"],
+ ["hostname", "datetime", "command"],
+ )
self.assertNotIn("values", entries["keys.zoom"])