Merge pull request 'feat(config-settings): rename config-toggle → config-settings; add __fish_user_dots_path UI' (#64) from feat/config-settings-rename-path-var into main
Reviewed-on: #64
This commit was merged in pull request #64.
This commit is contained in:
@@ -47,7 +47,7 @@ This config layers on top of the CachyOS base Fish configuration and adds:
|
|||||||
> set -U __fish_config_op_logging off
|
> set -U __fish_config_op_logging off
|
||||||
> ```
|
> ```
|
||||||
>
|
>
|
||||||
> Or run **`config-toggle`** for an interactive menu to flip logging (and any
|
> Or run **`config-settings`** for an interactive menu to flip logging (and any
|
||||||
> other opinionated category) on or off — no variable names to remember.
|
> other opinionated category) on or off — no variable names to remember.
|
||||||
>
|
>
|
||||||
> This takes effect immediately in every open shell. See [Session Logging](#session-logging)
|
> This takes effect immediately in every open shell. See [Session Logging](#session-logging)
|
||||||
@@ -89,7 +89,7 @@ set -U __fish_config_op_logging off # disable; takes effect in every open shel
|
|||||||
set -Ue __fish_config_op_logging # re-enable (erase the override)
|
set -Ue __fish_config_op_logging # re-enable (erase the override)
|
||||||
```
|
```
|
||||||
|
|
||||||
Prefer an interactive interface? Run **`config-toggle`** for a full-screen
|
Prefer an interactive interface? Run **`config-settings`** for a full-screen
|
||||||
picker that flips logging — and every other opinionated category — on or off
|
picker that flips logging — and every other opinionated category — on or off
|
||||||
per session or universally, without memorizing variable names.
|
per session or universally, without memorizing variable names.
|
||||||
|
|
||||||
@@ -255,7 +255,7 @@ test -f "$__fish_user_dots_path/local.fish"
|
|||||||
|
|
||||||
Everything opinionated in this config — command shadows, startup side-effects, key and environment overrides, terminal integrations, logging, and the first-run greeting — is active by default but can be switched off.
|
Everything opinionated in this config — command shadows, startup side-effects, key and environment overrides, terminal integrations, logging, and the first-run greeting — is active by default but can be switched off.
|
||||||
|
|
||||||
> **The easy way — `config-toggle`:** Run `config-toggle` for an interactive TUI that flips every setting below on, off, or back to default — per-session or universally — without typing a single variable name. Use the arrow keys (or `h`/`j`/`k`/`l`) to navigate and adjust, `Tab` to switch scope, and `q` to quit. Changes apply instantly. The panel auto-sizes to your terminal width (four tiers from 52- to 78-wide with a 6-column margin), centers itself horizontally, and redraws within ~0.3 s of a resize.
|
> **The easy way — `config-settings`:** Run `config-settings` for an interactive TUI that flips every setting below on, off, or back to default — per-session or universally — without typing a single variable name. Use the arrow keys (or `h`/`j`/`k`/`l`) to navigate and adjust, `Tab` to switch scope, and `q` to quit. Changes apply instantly. The panel auto-sizes to your terminal width (four tiers from 52- to 78-wide with a 6-column margin), centers itself horizontally, and redraws within ~0.3 s of a resize.
|
||||||
|
|
||||||
If you'd rather set them by hand, each category is controlled by a universal variable. Six category toggles and one master switch are available:
|
If you'd rather set them by hand, each category is controlled by a universal variable. Six category toggles and one master switch are available:
|
||||||
|
|
||||||
|
|||||||
@@ -155,8 +155,9 @@ yt-dlp=### yt-dlp
|
|||||||
miscfns=## 5.14 Miscellaneous
|
miscfns=## 5.14 Miscellaneous
|
||||||
config-help=### config-help
|
config-help=### config-help
|
||||||
config-update=### config-update
|
config-update=### config-update
|
||||||
config-toggle=### config-toggle
|
config-settings=### config-settings
|
||||||
toggle=### config-toggle
|
config-toggle=### config-settings
|
||||||
|
toggle=### config-settings
|
||||||
bash=### bash
|
bash=### bash
|
||||||
cheat=### cheat
|
cheat=### cheat
|
||||||
dockup=### dockup
|
dockup=### dockup
|
||||||
|
|||||||
+35
-13
@@ -48,7 +48,7 @@ A production-grade Fish shell configuration targeting Fish 4.x. It provides:
|
|||||||
> your machine, but the files persist locally.
|
> your machine, but the files persist locally.
|
||||||
>
|
>
|
||||||
> - Disable all logging with: `set -U __fish_config_op_logging off`
|
> - Disable all logging with: `set -U __fish_config_op_logging off`
|
||||||
> - Prefer a menu? Run the interactive picker: `config-toggle`
|
> - Prefer a menu? Run the interactive picker: `config-settings`
|
||||||
> - See Section 7 (C5 - Logging and Capture) for the full breakdown.
|
> - See Section 7 (C5 - Logging and Capture) for the full breakdown.
|
||||||
|
|
||||||
The configuration is split across:
|
The configuration is split across:
|
||||||
@@ -1347,19 +1347,24 @@ Add -i (interactive confirmation) to destructive commands:
|
|||||||
config-update --dry-run
|
config-update --dry-run
|
||||||
config-update --force
|
config-update --force
|
||||||
|
|
||||||
### config-toggle
|
### config-settings
|
||||||
|
|
||||||
Synopsis: config-toggle [-h]
|
Synopsis: config-settings [-h]
|
||||||
|
|
||||||
Opens an interactive TUI for toggling the six opinionated component
|
Opens an interactive TUI for managing fish configuration settings. Handles
|
||||||
categories (C1–C6) and the master disable variable without having to
|
the six opinionated component categories (C1–C6), the master disable
|
||||||
type or remember variable names. Two scope tabs allow independent
|
variable, and the __fish_user_dots_path path variable — without having to
|
||||||
per-scope configuration:
|
type or remember variable names. Two scope tabs allow independent per-scope
|
||||||
|
configuration for category toggles:
|
||||||
|
|
||||||
Universal — persists across all sessions (set -U)
|
Universal — persists across all sessions (set -U)
|
||||||
Session — current shell only (set -g)
|
Session — current shell only (set -g)
|
||||||
|
|
||||||
Changes apply immediately on each value keypress. Always available
|
The Dots Path row always operates on the universal scope regardless of the
|
||||||
|
active tab.
|
||||||
|
|
||||||
|
Changes to category toggles apply immediately on each keypress. Changes to
|
||||||
|
the path variable use an inline edit prompt (Enter). Always available
|
||||||
regardless of the __fish_config_opinionated master state.
|
regardless of the __fish_config_opinionated master state.
|
||||||
|
|
||||||
The panel adapts to the terminal width automatically, selecting from
|
The panel adapts to the terminal width automatically, selecting from
|
||||||
@@ -1374,17 +1379,30 @@ Add -i (interactive confirmation) to destructive commands:
|
|||||||
|
|
||||||
Navigation:
|
Navigation:
|
||||||
↑ ↓ / k j Move cursor
|
↑ ↓ / k j Move cursor
|
||||||
← → / h l Set value: OFF ← DEFAULT → ON (clamped)
|
← → / h l Set value: OFF ← DEFAULT → ON (toggle rows); LEFT clears path
|
||||||
|
Enter Edit the Dots Path (path row only)
|
||||||
Tab Switch scope (Universal ↔ Session)
|
Tab Switch scope (Universal ↔ Session)
|
||||||
q / Escape Exit
|
q / Escape Exit
|
||||||
|
|
||||||
Left/Right (or vim-style h/l) move the highlighted value one step along
|
Left/Right (or vim-style h/l) move the highlighted toggle value one step
|
||||||
the OFF–DEFAULT–ON scale and stop at the ends. DEFAULT erases the
|
along the OFF–DEFAULT–ON scale and stop at the ends. DEFAULT erases the
|
||||||
variable so the master switch / built-in default applies.
|
variable so the master switch / built-in default applies. On the Dots Path
|
||||||
|
row, LEFT/h clears the universal variable; RIGHT/l is a no-op (use Enter).
|
||||||
|
|
||||||
|
Dots Path row [U] tag: the tag confirms this row always writes to the
|
||||||
|
universal scope, regardless of which tab is active. Setting it per-session
|
||||||
|
would have no effect on startup sourcing.
|
||||||
|
|
||||||
Flags:
|
Flags:
|
||||||
--help / -h Show usage.
|
--help / -h Show usage.
|
||||||
|
|
||||||
|
config-settings
|
||||||
|
|
||||||
|
### config-toggle (deprecated)
|
||||||
|
|
||||||
|
Deprecated alias for config-settings. Prints a deprecation notice to
|
||||||
|
stderr, then delegates all arguments to config-settings.
|
||||||
|
|
||||||
config-toggle
|
config-toggle
|
||||||
|
|
||||||
### bash
|
### bash
|
||||||
@@ -1659,7 +1677,7 @@ Examples:
|
|||||||
# (erase both to go back to full-flavor defaults)
|
# (erase both to go back to full-flavor defaults)
|
||||||
|
|
||||||
For an interactive alternative to setting these variables by hand, run
|
For an interactive alternative to setting these variables by hand, run
|
||||||
config-toggle — a full-screen TUI that flips any category (including C5
|
config-settings — a full-screen TUI that flips any category (including C5
|
||||||
logging) on or off, per session or universally. See its entry in Section 5.
|
logging) on or off, per session or universally. See its entry in Section 5.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
@@ -2098,6 +2116,10 @@ control in a private directory. The path defaults to
|
|||||||
|
|
||||||
set -U __fish_user_dots_path /path/to/your/dots/fish
|
set -U __fish_user_dots_path /path/to/your/dots/fish
|
||||||
|
|
||||||
|
Or use the interactive TUI — run `config-settings` and navigate to the
|
||||||
|
"Dots Path" row (last row). Press Enter to type a new path, or ← / h to
|
||||||
|
reset to the default.
|
||||||
|
|
||||||
config.fish sources local.fish from that directory on every interactive
|
config.fish sources local.fish from that directory on every interactive
|
||||||
session. local.fish is responsible for sourcing its own secrets.fish:
|
session. local.fish is responsible for sourcing its own secrets.fish:
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
# __config_toggle_apply <varname> <scope> <value>
|
# __config_settings_apply <varname> <scope> <value>
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
# Applies a state value to an opinionated-component variable in the given
|
# Applies a state value to an opinionated-component variable in the given
|
||||||
# scope, immediately and persistently. Used by config-toggle's Left/Right
|
# scope, immediately and persistently. Used by config-settings's Left/Right
|
||||||
# (and vim h/l) directional handlers so the set/erase logic lives in one
|
# (and vim h/l) directional handlers so the set/erase logic lives in one
|
||||||
# place. A value of "DEFAULT" erases the variable in that scope so the
|
# place. A value of "DEFAULT" erases the variable in that scope so the
|
||||||
# master switch / built-in default takes over again.
|
# master switch / built-in default takes over again.
|
||||||
@@ -17,15 +17,15 @@
|
|||||||
# ARGUMENTS
|
# ARGUMENTS
|
||||||
# varname Variable name without the $ prefix
|
# varname Variable name without the $ prefix
|
||||||
# scope "universal" or "session"
|
# scope "universal" or "session"
|
||||||
# value "on", "off", or "DEFAULT"
|
# value "on", "off", "DEFAULT", or any arbitrary string (universal scope only)
|
||||||
#
|
#
|
||||||
# RETURNS
|
# RETURNS
|
||||||
# 0 Always
|
# 0 Always
|
||||||
#
|
#
|
||||||
# EXAMPLE
|
# EXAMPLE
|
||||||
# __config_toggle_apply __fish_config_op_aliases universal off
|
# __config_settings_apply __fish_config_op_aliases universal off
|
||||||
# __config_toggle_apply __fish_config_op_greeting session DEFAULT
|
# __config_settings_apply __fish_config_op_greeting session DEFAULT
|
||||||
function __config_toggle_apply
|
function __config_settings_apply
|
||||||
set -l varname $argv[1]
|
set -l varname $argv[1]
|
||||||
set -l scope $argv[2]
|
set -l scope $argv[2]
|
||||||
set -l value $argv[3]
|
set -l value $argv[3]
|
||||||
@@ -33,7 +33,7 @@ function __config_toggle_apply
|
|||||||
# stderr is suppressed because setting a value in one scope while the
|
# stderr is suppressed because setting a value in one scope while the
|
||||||
# other scope already holds the same variable makes interactive fish
|
# other scope already holds the same variable makes interactive fish
|
||||||
# emit a shadowing warning ("set: successfully set universal 'X'; but a
|
# emit a shadowing warning ("set: successfully set universal 'X'; but a
|
||||||
# global by that name shadows it"). config-toggle intentionally edits
|
# global by that name shadows it"). config-settings intentionally edits
|
||||||
# both scopes independently, so the warning is expected noise — and if
|
# both scopes independently, so the warning is expected noise — and if
|
||||||
# it reached the terminal it would push the cursor down a row and
|
# it reached the terminal it would push the cursor down a row and
|
||||||
# corrupt the in-place panel redraw (leaving a stacked top border
|
# corrupt the in-place panel redraw (leaving a stacked top border
|
||||||
@@ -48,6 +48,8 @@ function __config_toggle_apply
|
|||||||
set -U $varname off 2>/dev/null
|
set -U $varname off 2>/dev/null
|
||||||
case DEFAULT
|
case DEFAULT
|
||||||
set -Ue $varname 2>/dev/null
|
set -Ue $varname 2>/dev/null
|
||||||
|
case '*'
|
||||||
|
set -U $varname $value 2>/dev/null
|
||||||
end
|
end
|
||||||
case session
|
case session
|
||||||
switch $value
|
switch $value
|
||||||
@@ -2,10 +2,10 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
# __config_toggle_draw <cur_row> <cur_scope> <var1> ... <var7>
|
# __config_settings_draw <cur_row> <cur_scope> <var1> ... <var8>
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
# Renders the 14-line config-toggle TUI panel to stdout. Panel width and
|
# Renders the 16-line config-settings TUI panel to stdout. Panel width and
|
||||||
# horizontal position are chosen automatically from $COLUMNS each call,
|
# horizontal position are chosen automatically from $COLUMNS each call,
|
||||||
# so a terminal resize takes effect on the next keypress without any
|
# so a terminal resize takes effect on the next keypress without any
|
||||||
# extra bookkeeping. Four width tiers with a 6-col buffer per side:
|
# extra bookkeeping. Four width tiers with a 6-col buffer per side:
|
||||||
@@ -16,24 +16,24 @@
|
|||||||
# COLUMNS < 82 → 52-wide (IW=50, desc=17 chars) ← default
|
# COLUMNS < 82 → 52-wide (IW=50, desc=17 chars) ← default
|
||||||
#
|
#
|
||||||
# The box is horizontally centered via a left-padding prefix on every
|
# The box is horizontally centered via a left-padding prefix on every
|
||||||
# output line. \e[14A\e[J erases by line count so the horizontal offset
|
# output line. \e[16A\e[J erases by line count so the horizontal offset
|
||||||
# does not interfere with the redraw loop.
|
# does not interfere with the redraw loop.
|
||||||
#
|
#
|
||||||
# ARGUMENTS
|
# ARGUMENTS
|
||||||
# cur_row 0–6, the currently highlighted row
|
# cur_row 0–7, the currently highlighted row
|
||||||
# cur_scope "universal" or "session"
|
# cur_scope "universal" or "session"
|
||||||
# var1–var7 Variable names for rows 0–6 (in order per Variable Reference)
|
# var1–var8 Variable names for rows 0–7 (in order per Variable Reference)
|
||||||
#
|
#
|
||||||
# RETURNS
|
# RETURNS
|
||||||
# 0 Always
|
# 0 Always
|
||||||
#
|
#
|
||||||
# EXAMPLE
|
# EXAMPLE
|
||||||
# __config_toggle_draw 0 universal \
|
# __config_settings_draw 0 universal \
|
||||||
# __fish_config_op_aliases __fish_config_op_autoexec \
|
# __fish_config_op_aliases __fish_config_op_autoexec \
|
||||||
# __fish_config_op_overrides __fish_config_op_integrations \
|
# __fish_config_op_overrides __fish_config_op_integrations \
|
||||||
# __fish_config_op_logging __fish_config_op_greeting \
|
# __fish_config_op_logging __fish_config_op_greeting \
|
||||||
# __fish_config_opinionated
|
# __fish_config_opinionated __fish_user_dots_path
|
||||||
function __config_toggle_draw
|
function __config_settings_draw
|
||||||
set -l cur_row $argv[1]
|
set -l cur_row $argv[1]
|
||||||
set -l cur_scope $argv[2]
|
set -l cur_scope $argv[2]
|
||||||
set -l vars $argv[3..]
|
set -l vars $argv[3..]
|
||||||
@@ -50,7 +50,7 @@ function __config_toggle_draw
|
|||||||
|
|
||||||
# ── Width tier: 6-col buffer per side before stepping up ──────────────
|
# ── Width tier: 6-col buffer per side before stepping up ──────────────
|
||||||
# IW = inner width (chars between │ │); desc field = IW - 33.
|
# IW = inner width (chars between │ │); desc field = IW - 33.
|
||||||
# All four layouts are exactly 14 lines tall — panel_h in caller stays 14.
|
# All four layouts are exactly 16 lines tall — panel_h in caller stays 16.
|
||||||
set -l iw 50
|
set -l iw 50
|
||||||
set -l descs \
|
set -l descs \
|
||||||
"cmd shadows" \
|
"cmd shadows" \
|
||||||
@@ -131,7 +131,7 @@ function __config_toggle_draw
|
|||||||
set -l label $labels[$idx]
|
set -l label $labels[$idx]
|
||||||
set -l desc $descs[$idx]
|
set -l desc $descs[$idx]
|
||||||
|
|
||||||
set -l val (__config_toggle_get_val $var $cur_scope)
|
set -l val (__config_settings_get_val $var $cur_scope)
|
||||||
|
|
||||||
# Badge: 7 visible chars, coloured
|
# Badge: 7 visible chars, coloured
|
||||||
set -l badge
|
set -l badge
|
||||||
@@ -161,7 +161,7 @@ function __config_toggle_draw
|
|||||||
printf '%s│ %s │\n' $p (string repeat -n (math $iw - 6) '─')
|
printf '%s│ %s │\n' $p (string repeat -n (math $iw - 6) '─')
|
||||||
|
|
||||||
# ── Master row (index 6) ──────────────────────────────────────────────
|
# ── Master row (index 6) ──────────────────────────────────────────────
|
||||||
set -l val (__config_toggle_get_val $vars[7] $cur_scope)
|
set -l val (__config_settings_get_val $vars[7] $cur_scope)
|
||||||
set -l badge
|
set -l badge
|
||||||
switch $val
|
switch $val
|
||||||
case on
|
case on
|
||||||
@@ -181,12 +181,42 @@ function __config_toggle_draw
|
|||||||
$badge \
|
$badge \
|
||||||
(string pad -r -w (math $iw - 33) -- $descs[7])
|
(string pad -r -w (math $iw - 33) -- $descs[7])
|
||||||
|
|
||||||
|
# ── Separator before Path Settings ───────────────────────────────────
|
||||||
|
printf '%s│ %s │\n' $p (string repeat -n (math $iw - 6) '─')
|
||||||
|
|
||||||
|
# ── Path row (index 7) — always universal scope ───────────────────────
|
||||||
|
set -l path_var $vars[8]
|
||||||
|
set -l raw_path (__config_settings_get_val $path_var universal)
|
||||||
|
|
||||||
|
set -l path_badge
|
||||||
|
set -l path_dpad
|
||||||
|
if test "$raw_path" = DEFAULT
|
||||||
|
set path_badge "$c_dim""DEFAULT$c_reset"
|
||||||
|
set path_dpad (string pad -r -w (math $iw - 33) -- "—default— [U]")
|
||||||
|
else
|
||||||
|
set path_badge "$c_ok"" PATH $c_reset"
|
||||||
|
set -l max_path (math $iw - 37)
|
||||||
|
set -l truncated (string shorten -m $max_path -- "$raw_path")
|
||||||
|
set path_dpad (string pad -r -w (math $iw - 33) -- "$truncated [U]")
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l path_curs " "
|
||||||
|
if test $cur_row -eq 7
|
||||||
|
set path_curs "$c_sel▶$c_reset "
|
||||||
|
end
|
||||||
|
|
||||||
|
printf '%s│ %s%s [ %s ] %s │\n' \
|
||||||
|
$p $path_curs \
|
||||||
|
(string pad -r -w 12 -- "Dots Path") \
|
||||||
|
$path_badge \
|
||||||
|
$path_dpad
|
||||||
|
|
||||||
# ── Bottom divider ────────────────────────────────────────────────────
|
# ── Bottom divider ────────────────────────────────────────────────────
|
||||||
printf '%s│%s│\n' $p $HBR
|
printf '%s│%s│\n' $p $HBR
|
||||||
|
|
||||||
# ── Keybind hint ──────────────────────────────────────────────────────
|
# ── Keybind hint ──────────────────────────────────────────────────────
|
||||||
# string pad is width-aware (arrows count as 1 column)
|
# string pad is width-aware (arrows count as 1 column)
|
||||||
set -l hint " ↑↓/kj move ←→/hl set Tab scope q quit"
|
set -l hint " ↑↓/kj move ←→/hl set Enter edit path q quit"
|
||||||
printf '%s│%s%s%s│\n' $p $c_dim (string pad -r -w $iw -- $hint) $c_reset
|
printf '%s│%s%s%s│\n' $p $c_dim (string pad -r -w $iw -- $hint) $c_reset
|
||||||
|
|
||||||
# ── Bottom border ─────────────────────────────────────────────────────
|
# ── Bottom border ─────────────────────────────────────────────────────
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
# __config_toggle_get_val <varname> <scope>
|
# __config_settings_get_val <varname> <scope>
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
# Returns the current value of a named variable in the specified scope by
|
# Returns the current value of a named variable in the specified scope by
|
||||||
@@ -18,9 +18,9 @@
|
|||||||
# 0 Always; prints "on", "off", or "DEFAULT" to stdout
|
# 0 Always; prints "on", "off", or "DEFAULT" to stdout
|
||||||
#
|
#
|
||||||
# EXAMPLE
|
# EXAMPLE
|
||||||
# set result (__config_toggle_get_val __fish_config_op_aliases universal)
|
# set result (__config_settings_get_val __fish_config_op_aliases universal)
|
||||||
# # result == "on" | "off" | "DEFAULT"
|
# # result == "on" | "off" | "DEFAULT"
|
||||||
function __config_toggle_get_val
|
function __config_settings_get_val
|
||||||
set -l varname $argv[1]
|
set -l varname $argv[1]
|
||||||
set -l scope $argv[2]
|
set -l scope $argv[2]
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
# __config_toggle_read_key
|
# __config_settings_read_key
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
# Reads a single keypress directly from the controlling terminal in raw
|
# Reads a single keypress directly from the controlling terminal in raw
|
||||||
@@ -31,13 +31,13 @@
|
|||||||
# 1 The terminal could not be put into raw mode (stdin is not a TTY)
|
# 1 The terminal could not be put into raw mode (stdin is not a TTY)
|
||||||
#
|
#
|
||||||
# EXAMPLE
|
# EXAMPLE
|
||||||
# set -l key (__config_toggle_read_key)
|
# set -l key (__config_settings_read_key)
|
||||||
# or return # not a TTY — bail
|
# or return # not a TTY — bail
|
||||||
# switch $key
|
# switch $key
|
||||||
# case up; echo "moved up"
|
# case up; echo "moved up"
|
||||||
# case space; echo "toggled"
|
# case space; echo "toggled"
|
||||||
# end
|
# end
|
||||||
function __config_toggle_read_key
|
function __config_settings_read_key
|
||||||
# Snapshot current terminal settings; failure means stdin is not a TTY.
|
# Snapshot current terminal settings; failure means stdin is not a TTY.
|
||||||
set -l saved (stty -g </dev/tty 2>/dev/null)
|
set -l saved (stty -g </dev/tty 2>/dev/null)
|
||||||
or return 1
|
or return 1
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
# Copyright (C) 2026 Rootiest
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
# config-settings [-h | --help]
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
# Opens an interactive full-screen TUI for managing fish config settings,
|
||||||
|
# including the six opinionated component categories (C1–C6) and the master
|
||||||
|
# disable variable, without having to remember variable names. Two scope
|
||||||
|
# tabs allow independent per-scope configuration:
|
||||||
|
#
|
||||||
|
# Universal — persists across all sessions (set -U / set -Ue)
|
||||||
|
# Session — active for the current shell only (set -g / set -eg)
|
||||||
|
#
|
||||||
|
# Values are changed directionally with the arrow keys (or vim-style h/l)
|
||||||
|
# along an OFF ← DEFAULT → ON scale, and apply immediately — no confirm
|
||||||
|
# step. Always available regardless of __fish_config_opinionated state.
|
||||||
|
#
|
||||||
|
# ARGUMENTS
|
||||||
|
# -h, --help Print usage and exit
|
||||||
|
#
|
||||||
|
# RETURNS
|
||||||
|
# 0 Exited normally (q or Escape pressed)
|
||||||
|
# 1 Unknown flag passed
|
||||||
|
#
|
||||||
|
# EXAMPLE
|
||||||
|
# config-settings
|
||||||
|
function config-settings --description 'Interactive TUI for managing fish config settings'
|
||||||
|
set -l c_head (set_color --bold cyan)
|
||||||
|
set -l c_cmd (set_color --bold white)
|
||||||
|
set -l c_flag (set_color yellow)
|
||||||
|
set -l c_dim (set_color brblack)
|
||||||
|
set -l c_err (set_color red)
|
||||||
|
set -l c_reset (set_color normal)
|
||||||
|
|
||||||
|
# ── Argument parsing ──────────────────────────────────
|
||||||
|
for arg in $argv
|
||||||
|
switch $arg
|
||||||
|
case -h --help
|
||||||
|
echo "$c_head""Usage:$c_reset $c_cmd""config-settings$c_reset $c_flag""[-h]$c_reset"
|
||||||
|
echo
|
||||||
|
echo " Interactive TUI for managing fish config settings."
|
||||||
|
echo " Changes apply immediately — no confirm step required."
|
||||||
|
echo
|
||||||
|
echo "$c_head""Navigation:$c_reset"
|
||||||
|
echo " $c_flag↑ ↓$c_reset or $c_flag""k j$c_reset Move cursor up / down"
|
||||||
|
echo " $c_flag← →$c_reset or $c_flag""h l$c_reset Set value: OFF ← DEFAULT → ON"
|
||||||
|
echo " $c_flag""Tab$c_reset Switch scope (Universal ↔ Session)"
|
||||||
|
echo " $c_flag""Enter$c_reset Edit path (on Dots Path row)"
|
||||||
|
echo " $c_flag""q$c_reset / $c_flag""Esc$c_reset Exit"
|
||||||
|
echo
|
||||||
|
echo "$c_head""Scopes:$c_reset"
|
||||||
|
echo " $c_flag""Universal$c_reset Persistent across all sessions ($c_dim""set -U$c_reset)"
|
||||||
|
echo " $c_flag""Session$c_reset Current session only ($c_dim""set -g$c_reset)"
|
||||||
|
return 0
|
||||||
|
case '*'
|
||||||
|
echo "$c_err""Unknown option: $arg$c_reset" >&2
|
||||||
|
echo "Run $c_cmd""config-settings --help$c_reset for usage." >&2
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# ── Variable list (matches Panel Layout Reference) ────
|
||||||
|
set -l vars \
|
||||||
|
__fish_config_op_aliases \
|
||||||
|
__fish_config_op_autoexec \
|
||||||
|
__fish_config_op_overrides \
|
||||||
|
__fish_config_op_integrations \
|
||||||
|
__fish_config_op_logging \
|
||||||
|
__fish_config_op_greeting \
|
||||||
|
__fish_config_opinionated \
|
||||||
|
__fish_user_dots_path
|
||||||
|
|
||||||
|
set -l cur_row 0 # 0–7
|
||||||
|
set -l cur_scope universal # or "session"
|
||||||
|
set -l panel_h 16 # total panel lines (all width tiers are 16 lines)
|
||||||
|
set -l last_cols $COLUMNS # COLUMNS at the time of the last draw
|
||||||
|
|
||||||
|
# ── Terminal setup ────────────────────────────────────
|
||||||
|
printf '\e[?25l' # hide cursor
|
||||||
|
trap 'printf "\e[?25h"; set -g __config_settings_exit 1' INT
|
||||||
|
|
||||||
|
# ── Initial draw ──────────────────────────────────────
|
||||||
|
__config_settings_draw $cur_row $cur_scope $vars
|
||||||
|
|
||||||
|
# ── Event loop ────────────────────────────────────────
|
||||||
|
# __config_settings_read_key reads a single keypress from /dev/tty in raw
|
||||||
|
# mode and returns a normalized token (up/down/tab/space/escape/quit or a
|
||||||
|
# literal char). It bypasses fish's `read`, whose line editor swallows Tab
|
||||||
|
# and arrow keys and prints a `read> ` prompt — unusable for a TUI.
|
||||||
|
while true
|
||||||
|
# Check for Ctrl-C signal (trap sets this flag during redraw, when the
|
||||||
|
# terminal is briefly back in cooked mode and SIGINT can fire).
|
||||||
|
if set -q __config_settings_exit
|
||||||
|
set -eg __config_settings_exit
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
set -l key (__config_settings_read_key)
|
||||||
|
or break # not a TTY — exit instead of spinning
|
||||||
|
|
||||||
|
set -l did_redraw 0
|
||||||
|
|
||||||
|
switch $key
|
||||||
|
case up k
|
||||||
|
set cur_row (math "max(0, $cur_row - 1)")
|
||||||
|
case down j
|
||||||
|
set cur_row (math "min(7, $cur_row + 1)")
|
||||||
|
case tab # Tab — switch scope
|
||||||
|
if test $cur_scope = universal
|
||||||
|
set cur_scope session
|
||||||
|
else
|
||||||
|
set cur_scope universal
|
||||||
|
end
|
||||||
|
case enter
|
||||||
|
if test $cur_row -eq 7
|
||||||
|
# Erase panel (wrap-aware, same formula as cleanup)
|
||||||
|
set -l prev_max_lw (math --scale=0 "($last_cols + 78) / 2")
|
||||||
|
set -l erase_h (math --scale=0 "$panel_h * max(1, ceil($prev_max_lw / $COLUMNS))")
|
||||||
|
printf '\e[%dA\e[J' $erase_h
|
||||||
|
printf '\e[?25h' # restore cursor
|
||||||
|
|
||||||
|
printf 'User Dots Path (leave blank to reset to default): '
|
||||||
|
read -l new_path
|
||||||
|
|
||||||
|
if test -n "$new_path"
|
||||||
|
set -U __fish_user_dots_path $new_path
|
||||||
|
else
|
||||||
|
set -Ue __fish_user_dots_path
|
||||||
|
end
|
||||||
|
|
||||||
|
printf '\e[?25l' # hide cursor
|
||||||
|
set last_cols $COLUMNS
|
||||||
|
__config_settings_draw $cur_row $cur_scope $vars
|
||||||
|
set did_redraw 1
|
||||||
|
end
|
||||||
|
case right l # → / l — step toward ON (clamped, no wrap)
|
||||||
|
if test $cur_row -eq 7
|
||||||
|
# no-op for path var; use Enter to set
|
||||||
|
else
|
||||||
|
set -l varname $vars[(math $cur_row + 1)]
|
||||||
|
set -l cur_val (__config_settings_get_val $varname $cur_scope)
|
||||||
|
|
||||||
|
set -l next_val on
|
||||||
|
switch $cur_val
|
||||||
|
case off
|
||||||
|
set next_val DEFAULT
|
||||||
|
case on
|
||||||
|
set next_val on
|
||||||
|
case '*'
|
||||||
|
set next_val on
|
||||||
|
end
|
||||||
|
__config_settings_apply $varname $cur_scope $next_val
|
||||||
|
end
|
||||||
|
case left h # ← / h — step toward OFF (clamped, no wrap)
|
||||||
|
if test $cur_row -eq 7
|
||||||
|
# Clear the universal path var (restore default)
|
||||||
|
__config_settings_apply __fish_user_dots_path universal DEFAULT
|
||||||
|
else
|
||||||
|
set -l varname $vars[(math $cur_row + 1)]
|
||||||
|
set -l cur_val (__config_settings_get_val $varname $cur_scope)
|
||||||
|
|
||||||
|
set -l next_val off
|
||||||
|
switch $cur_val
|
||||||
|
case on
|
||||||
|
set next_val DEFAULT
|
||||||
|
case off
|
||||||
|
set next_val off
|
||||||
|
case '*'
|
||||||
|
set next_val off
|
||||||
|
end
|
||||||
|
__config_settings_apply $varname $cur_scope $next_val
|
||||||
|
end
|
||||||
|
case q Q quit escape
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
# Skip redraw entirely when the key reader timed out with no resize
|
||||||
|
if test -z "$key" -a "$COLUMNS" = "$last_cols"
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
|
||||||
|
# Skip redraw if the Enter handler already redrew (e.g. after path edit)
|
||||||
|
if test $did_redraw -eq 1
|
||||||
|
continue
|
||||||
|
end
|
||||||
|
|
||||||
|
# Wrap-aware erase: a panel drawn on a wider terminal has longer lines
|
||||||
|
# (due to center-padding) that wrap into extra physical rows when the
|
||||||
|
# terminal narrows. 78 = widest box (IW=76+2); the formula gives the
|
||||||
|
# worst-case old line width for any tier drawn at last_cols.
|
||||||
|
set -l prev_max_lw (math --scale=0 "($last_cols + 78) / 2")
|
||||||
|
set -l erase_h (math --scale=0 "$panel_h * max(1, ceil($prev_max_lw / $COLUMNS))")
|
||||||
|
printf '\e[%dA\e[J' $erase_h
|
||||||
|
set last_cols $COLUMNS
|
||||||
|
__config_settings_draw $cur_row $cur_scope $vars
|
||||||
|
end
|
||||||
|
|
||||||
|
# ── Cleanup ───────────────────────────────────────────
|
||||||
|
trap - INT # remove the signal handler
|
||||||
|
set -l prev_max_lw (math --scale=0 "($last_cols + 78) / 2")
|
||||||
|
set -l erase_h (math --scale=0 "$panel_h * max(1, ceil($prev_max_lw / $COLUMNS))")
|
||||||
|
printf '\e[%dA\e[J' $erase_h # erase the panel (wrap-aware)
|
||||||
|
printf '\e[?25h' # restore cursor
|
||||||
|
end
|
||||||
@@ -2,167 +2,21 @@
|
|||||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
# config-toggle [-h | --help]
|
# config-toggle [args...]
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
# Opens an interactive full-screen TUI for toggling the six opinionated
|
# Deprecated alias for config-settings. Prints a one-line deprecation
|
||||||
# component categories (C1–C6) and the master disable variable without
|
# notice to stderr, then delegates all arguments to config-settings.
|
||||||
# having to remember variable names. Two scope tabs allow independent
|
|
||||||
# per-scope configuration:
|
|
||||||
#
|
|
||||||
# Universal — persists across all sessions (set -U / set -Ue)
|
|
||||||
# Session — active for the current shell only (set -g / set -eg)
|
|
||||||
#
|
|
||||||
# Values are changed directionally with the arrow keys (or vim-style h/l)
|
|
||||||
# along an OFF ← DEFAULT → ON scale, and apply immediately — no confirm
|
|
||||||
# step. Always available regardless of __fish_config_opinionated state.
|
|
||||||
#
|
#
|
||||||
# ARGUMENTS
|
# ARGUMENTS
|
||||||
# -h, --help Print usage and exit
|
# args Passed through verbatim to config-settings
|
||||||
#
|
#
|
||||||
# RETURNS
|
# RETURNS
|
||||||
# 0 Exited normally (q or Escape pressed)
|
# Same as config-settings
|
||||||
# 1 Unknown flag passed
|
|
||||||
#
|
#
|
||||||
# EXAMPLE
|
# EXAMPLE
|
||||||
# config-toggle
|
# config-toggle # opens config-settings with a deprecation notice
|
||||||
function config-toggle --description 'Interactive TUI for toggling opinionated component settings'
|
function config-toggle --description 'Deprecated alias for config-settings'
|
||||||
set -l c_head (set_color --bold cyan)
|
echo "config-toggle is deprecated, use config-settings instead" >&2
|
||||||
set -l c_cmd (set_color --bold white)
|
config-settings $argv
|
||||||
set -l c_flag (set_color yellow)
|
|
||||||
set -l c_dim (set_color brblack)
|
|
||||||
set -l c_err (set_color red)
|
|
||||||
set -l c_reset (set_color normal)
|
|
||||||
|
|
||||||
# ── Argument parsing ──────────────────────────────────
|
|
||||||
for arg in $argv
|
|
||||||
switch $arg
|
|
||||||
case -h --help
|
|
||||||
echo "$c_head""Usage:$c_reset $c_cmd""config-toggle$c_reset $c_flag""[-h]$c_reset"
|
|
||||||
echo
|
|
||||||
echo " Interactive TUI for toggling opinionated component categories."
|
|
||||||
echo " Changes apply immediately — no confirm step required."
|
|
||||||
echo
|
|
||||||
echo "$c_head""Navigation:$c_reset"
|
|
||||||
echo " $c_flag↑ ↓$c_reset or $c_flag""k j$c_reset Move cursor up / down"
|
|
||||||
echo " $c_flag← →$c_reset or $c_flag""h l$c_reset Set value: OFF ← DEFAULT → ON"
|
|
||||||
echo " $c_flag""Tab$c_reset Switch scope (Universal ↔ Session)"
|
|
||||||
echo " $c_flag""q$c_reset / $c_flag""Esc$c_reset Exit"
|
|
||||||
echo
|
|
||||||
echo "$c_head""Scopes:$c_reset"
|
|
||||||
echo " $c_flag""Universal$c_reset Persistent across all sessions ($c_dim""set -U$c_reset)"
|
|
||||||
echo " $c_flag""Session$c_reset Current session only ($c_dim""set -g$c_reset)"
|
|
||||||
return 0
|
|
||||||
case '*'
|
|
||||||
echo "$c_err""Unknown option: $arg$c_reset" >&2
|
|
||||||
echo "Run $c_cmd""config-toggle --help$c_reset for usage." >&2
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# ── Variable list (matches Panel Layout Reference) ────
|
|
||||||
set -l vars \
|
|
||||||
__fish_config_op_aliases \
|
|
||||||
__fish_config_op_autoexec \
|
|
||||||
__fish_config_op_overrides \
|
|
||||||
__fish_config_op_integrations \
|
|
||||||
__fish_config_op_logging \
|
|
||||||
__fish_config_op_greeting \
|
|
||||||
__fish_config_opinionated
|
|
||||||
|
|
||||||
set -l cur_row 0 # 0–6
|
|
||||||
set -l cur_scope universal # or "session"
|
|
||||||
set -l panel_h 14 # total panel lines (all width tiers are 14 lines)
|
|
||||||
set -l last_cols $COLUMNS # COLUMNS at the time of the last draw
|
|
||||||
|
|
||||||
# ── Terminal setup ────────────────────────────────────
|
|
||||||
printf '\e[?25l' # hide cursor
|
|
||||||
trap 'printf "\e[?25h"; set -g __config_toggle_exit 1' INT
|
|
||||||
|
|
||||||
# ── Initial draw ──────────────────────────────────────
|
|
||||||
__config_toggle_draw $cur_row $cur_scope $vars
|
|
||||||
|
|
||||||
# ── Event loop ────────────────────────────────────────
|
|
||||||
# __config_toggle_read_key reads a single keypress from /dev/tty in raw
|
|
||||||
# mode and returns a normalized token (up/down/tab/space/escape/quit or a
|
|
||||||
# literal char). It bypasses fish's `read`, whose line editor swallows Tab
|
|
||||||
# and arrow keys and prints a `read> ` prompt — unusable for a TUI.
|
|
||||||
while true
|
|
||||||
# Check for Ctrl-C signal (trap sets this flag during redraw, when the
|
|
||||||
# terminal is briefly back in cooked mode and SIGINT can fire).
|
|
||||||
if set -q __config_toggle_exit
|
|
||||||
set -eg __config_toggle_exit
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
set -l key (__config_toggle_read_key)
|
|
||||||
or break # not a TTY — exit instead of spinning
|
|
||||||
|
|
||||||
switch $key
|
|
||||||
case up k
|
|
||||||
set cur_row (math "max(0, $cur_row - 1)")
|
|
||||||
case down j
|
|
||||||
set cur_row (math "min(6, $cur_row + 1)")
|
|
||||||
case tab # Tab — switch scope
|
|
||||||
if test $cur_scope = universal
|
|
||||||
set cur_scope session
|
|
||||||
else
|
|
||||||
set cur_scope universal
|
|
||||||
end
|
|
||||||
case right l # → / l — step toward ON (clamped, no wrap)
|
|
||||||
set -l varname $vars[(math $cur_row + 1)]
|
|
||||||
set -l cur_val (__config_toggle_get_val $varname $cur_scope)
|
|
||||||
|
|
||||||
# Order: OFF ← DEFAULT → ON
|
|
||||||
set -l next_val on
|
|
||||||
switch $cur_val
|
|
||||||
case off
|
|
||||||
set next_val DEFAULT
|
|
||||||
case on
|
|
||||||
set next_val on # already at the right end
|
|
||||||
case '*' # DEFAULT or unrecognised
|
|
||||||
set next_val on
|
|
||||||
end
|
|
||||||
__config_toggle_apply $varname $cur_scope $next_val
|
|
||||||
case left h # ← / h — step toward OFF (clamped, no wrap)
|
|
||||||
set -l varname $vars[(math $cur_row + 1)]
|
|
||||||
set -l cur_val (__config_toggle_get_val $varname $cur_scope)
|
|
||||||
|
|
||||||
# Order: OFF ← DEFAULT → ON
|
|
||||||
set -l next_val off
|
|
||||||
switch $cur_val
|
|
||||||
case on
|
|
||||||
set next_val DEFAULT
|
|
||||||
case off
|
|
||||||
set next_val off # already at the left end
|
|
||||||
case '*' # DEFAULT or unrecognised
|
|
||||||
set next_val off
|
|
||||||
end
|
|
||||||
__config_toggle_apply $varname $cur_scope $next_val
|
|
||||||
case q Q quit escape
|
|
||||||
break
|
|
||||||
end
|
|
||||||
|
|
||||||
# Skip redraw entirely when the key reader timed out with no resize
|
|
||||||
if test -z "$key" -a "$COLUMNS" = "$last_cols"
|
|
||||||
continue
|
|
||||||
end
|
|
||||||
|
|
||||||
# Wrap-aware erase: a panel drawn on a wider terminal has longer lines
|
|
||||||
# (due to center-padding) that wrap into extra physical rows when the
|
|
||||||
# terminal narrows. 78 = widest box (IW=76+2); the formula gives the
|
|
||||||
# worst-case old line width for any tier drawn at last_cols.
|
|
||||||
set -l prev_max_lw (math --scale=0 "($last_cols + 78) / 2")
|
|
||||||
set -l erase_h (math --scale=0 "$panel_h * max(1, ceil($prev_max_lw / $COLUMNS))")
|
|
||||||
printf '\e[%dA\e[J' $erase_h
|
|
||||||
set last_cols $COLUMNS
|
|
||||||
__config_toggle_draw $cur_row $cur_scope $vars
|
|
||||||
end
|
|
||||||
|
|
||||||
# ── Cleanup ───────────────────────────────────────────
|
|
||||||
trap - INT # remove the signal handler
|
|
||||||
set -l prev_max_lw (math --scale=0 "($last_cols + 78) / 2")
|
|
||||||
set -l erase_h (math --scale=0 "$panel_h * max(1, ceil($prev_max_lw / $COLUMNS))")
|
|
||||||
printf '\e[%dA\e[J' $erase_h # erase the panel (wrap-aware)
|
|
||||||
printf '\e[?25h' # restore cursor
|
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user