summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-25 09:44:55 +0300
committerPaul Buetow <paul@buetow.org>2026-05-25 09:44:55 +0300
commit63a03aac61fa3ab6e4757fe126094b234e9c743f (patch)
tree0856adb8f5e21c464ee6d9efec8110083c1e1e79
parent236582a921e1c302c0562b9154b61dbbc71e09c6 (diff)
fix(fish): prevent file completions and glob expansion in gt.fish
- Add -f (--no-files) flag to all complete entries to block file/path completions for the gt command - Escape ** and * arguments to prevent fish from glob-expanding them into recursive file matches - Add Shell Completions section and completions row to README.md
-rw-r--r--README.md15
-rw-r--r--completions/gt.fish288
2 files changed, 159 insertions, 144 deletions
diff --git a/README.md b/README.md
index 565f396..cffb09d 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,20 @@ gt '100Mbps 1hr *' # rate × time → 3.6e+11 bits
gt # interactive REPL
```
+## Shell Completions
+
+Fish completions are available in [`completions/`](completions/). To install:
+
+```bash
+cp completions/gt.fish ~/.config/fish/completions/
+```
+
+Or system-wide:
+
+```bash
+sudo cp completions/gt.fish /usr/local/share/fish/vendor_completions.d/
+```
+
## Feature Guide
All features are documented in [`docs/`](docs/):
@@ -51,6 +65,7 @@ All features are documented in [`docs/`](docs/):
| Custom metrics | [custom-metrics](docs/custom-metrics.md) |
| REPL mode | [repl-mode](docs/repl-mode.md) |
| Rational number mode | [rational-mode](docs/rational-mode.md) |
+| Fish shell completions | [completions](completions/)
## Building and Testing
diff --git a/completions/gt.fish b/completions/gt.fish
index 4f92d30..2d74471 100644
--- a/completions/gt.fish
+++ b/completions/gt.fish
@@ -31,361 +31,361 @@ end
# no actual files are offered, so only our custom -a entries appear.
complete -c gt -f -a ""
-complete -c gt -n "__fish_gt_needs_top_level" \
+complete -c gt -f -n "__fish_gt_needs_top_level" \
-l log -r -d "Session log file (REPL mode)"
# ── Top-level subcommands ────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_needs_top_level" \
+complete -c gt -f -n "__fish_gt_needs_top_level" \
-a version -d "Show version"
# ── Expression prefixes ──────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "rpn" -d "RPN expression prefix"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "calc" -d "Calculation prefix (alias)"
# ── Arithmetic operators ─────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "+" -d "Addition"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "-" -d "Subtraction"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
- -a "*" -d "Multiplication"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
+ -a "\*" -d "Multiplication"
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "/" -d "Division"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "^" -d "Power"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
- -a "**" -d "Fast integer power"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
+ -a "\*\*" -d "Fast integer power"
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "%" -d "Modulo"
# ── Logarithmic operators ────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "lg" -d "Log base 2"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "log" -d "Log base 10"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "ln" -d "Natural log"
# ── Comparison operators ─────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "gt" -d "Greater than"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "lt" -d "Less than"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "gte" -d "Greater or equal"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "lte" -d "Less or equal"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "eq" -d "Equal"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "==" -d "Equal"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "neq" -d "Not equal"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "!=" -d "Not equal"
# ── Hyper (n-ary) operators ──────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[+]" -d "Hyper add (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[-]" -d "Hyper subtract (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[*]" -d "Hyper multiply (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[/]" -d "Hyper divide (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[^]" -d "Hyper power (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[%]" -d "Hyper modulo (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[lg]" -d "Hyper log2 (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[log]" -d "Hyper log10 (n-ary)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "[ln]" -d "Hyper ln (n-ary)"
# ── Stack operators ──────────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "dup" -d "Duplicate top of stack"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "swap" -d "Swap top two stack values"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "pop" -d "Discard top of stack"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "d" -d "Delete top two stack values"
# ── Assignment / conversion operators ────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a ":=" -d "Assign right-to-left"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "=:" -d "Assign left-to-right"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "convert" -d "Convert metric unit (with @unit)"
# ── Command operators ────────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "show" -d "Show stack"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "showstack" -d "Show stack (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "print" -d "Show stack (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "vars" -d "List variables"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "constants" -d "List constants"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "clear" -d "Clear all variables"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "clearconstants" -d "Reset constants to defaults"
# ── Boolean literals ─────────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "true" -d "Boolean true (coerces to 1)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "false" -d "Boolean false (coerces to 0)"
# ── Constants ────────────────────────────────────────────────────────────────
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "pi" -d "π (3.14159…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "e" -d "Euler's number (2.71828…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "euler" -d "Euler's number (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "phi" -d "Golden ratio (1.61803…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "sqrt2" -d "√2 (1.41421…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "sqrt3" -d "√3 (1.73205…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "sqrt5" -d "√5 (2.23606…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "ln2" -d "ln(2) (0.69314…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "log2" -d "ln(2) (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "ln10" -d "ln(10) (2.30258…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "log10" -d "ln(10) (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "log_e" -d "log₁₀(e) (0.43429…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "log_e10" -d "log₁₀(e) (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "tau" -d "τ = 2π (6.28318…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "inv_pi" -d "1/π (0.31830…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "inv_e" -d "1/e (0.36787…)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "inf" -d "Positive infinity"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "infinity" -d "Positive infinity (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "-inf" -d "Negative infinity"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "-infinity" -d "Negative infinity (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "nan" -d "NaN (Not a Number)"
# ── Metric units ─────────────────────────────────────────────────────────────
# DataRate (base: bps)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "bps" -d "Bits per second"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "Kbps" -d "Kilobits per second"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "Mbps" -d "Megabits per second"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "Gbps" -d "Gigabits per second"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "Tbps" -d "Terabits per second"
# DataSize (base: bits)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "bits" -d "Bits"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "bytes" -d "Bytes"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "KB" -d "Kilobyte (SI / IEC)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "MB" -d "Megabyte (SI / IEC)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "GB" -d "Gigabyte (SI / IEC)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "TB" -d "Terabyte (SI / IEC)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "PB" -d "Petabyte (SI / IEC)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "KiB" -d "Kibibyte (1024 bytes)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "MiB" -d "Mebibyte (1024 KiB)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "GiB" -d "Gibibyte (1024 MiB)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "TiB" -d "Tebibyte (1024 GiB)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "PiB" -d "Pebibyte (1024 TiB)"
# Time (base: seconds)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "ms" -d "Milliseconds"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "s" -d "Seconds"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "sec" -d "Seconds (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "secs" -d "Seconds (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "min" -d "Minutes"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "hr" -d "Hours"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "day" -d "Days"
# Weight (base: kilograms)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "mg" -d "Milligrams"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "g" -d "Grams"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "kg" -d "Kilograms"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "ton" -d "Metric tons"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "lb" -d "Pounds"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "oz" -d "Ounces"
# Speed (base: m/s)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "mps" -d "Meters per second"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "kmh" -d "Kilometers per hour"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "mph" -d "Miles per hour"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "knots" -d "Knots"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "knot" -d "Knots (alias)"
# Distance (base: meters)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "m" -d "Meters"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "km" -d "Kilometers"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "mi" -d "Miles"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "mile" -d "Miles (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "miles" -d "Miles (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "ft" -d "Feet"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "foot" -d "Feet (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "feet" -d "Feet (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "in" -d "Inches"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "nm" -d "Nautical miles"
# DataRate aliases (bit/s notation)
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "bit/s" -d "Bits per second (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "kbit/s" -d "Kilobits per second (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "mbit/s" -d "Megabits per second (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "gbit/s" -d "Gigabits per second (alias)"
-complete -c gt -n "__fish_gt_not_in_metric_or_custom" \
+complete -c gt -f -n "__fish_gt_not_in_metric_or_custom" \
-a "tbit/s" -d "Terabits per second (alias)"
# ── `metric` subcommand ──────────────────────────────────────────────────────
-complete -c gt -n "__fish_seen_subcommand_from metric" \
+complete -c gt -f -n "__fish_seen_subcommand_from metric" \
-a "show" -d "Show metric info for top of stack"
-complete -c gt -n "__fish_seen_subcommand_from metric" \
+complete -c gt -f -n "__fish_seen_subcommand_from metric" \
-a "list" -d "List all metric categories"
-complete -c gt -n "__fish_seen_subcommand_from metric" \
+complete -c gt -f -n "__fish_seen_subcommand_from metric" \
-a "compatible" -d "Check metric compatibility (top 2 values)"
-complete -c gt -n "__fish_seen_subcommand_from metric" \
+complete -c gt -f -n "__fish_seen_subcommand_from metric" \
-a "decimal set" -d "Switch to SI prefix mode (1000-based)"
-complete -c gt -n "__fish_seen_subcommand_from metric" \
+complete -c gt -f -n "__fish_seen_subcommand_from metric" \
-a "binary set" -d "Switch to IEC prefix mode (1024-based)"
# metric <category> — list metrics in a category
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "DataRate" -d "bps, Kbps, Mbps, Gbps, Tbps"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "DataSize" -d "bits, bytes, KB, MB, GB, …"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "Distance" -d "m, km, mi, ft, in, nm"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "Speed" -d "mps, kmh, mph, knots"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "Time" -d "ms, s, min, hr, day"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "Universal" -d "Cool (unitless)"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from metric; and not __fish_seen_subcommand_from show list compatible 'decimal set' 'binary set'" \
-a "Weight" -d "mg, g, kg, ton, lb, oz"
# ── `custom` subcommand ──────────────────────────────────────────────────────
-complete -c gt -n "__fish_seen_subcommand_from custom" \
+complete -c gt -f -n "__fish_seen_subcommand_from custom" \
-a "show" -d "Show custom metric(s)"
-complete -c gt -n "__fish_seen_subcommand_from custom" \
+complete -c gt -f -n "__fish_seen_subcommand_from custom" \
-a "list" -d "List all custom metrics"
-complete -c gt -n "__fish_seen_subcommand_from custom" \
+complete -c gt -f -n "__fish_seen_subcommand_from custom" \
-a "define" -d "Define a new custom metric"
-complete -c gt -n "__fish_seen_subcommand_from custom" \
+complete -c gt -f -n "__fish_seen_subcommand_from custom" \
-a "undefine" -d "Remove a custom metric"
# custom define <name> <factor> <category> — complete categories
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "Custom" -d "Custom (user-defined)"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "DataRate" -d "Data rate category"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "DataSize" -d "Data size category"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "Distance" -d "Distance category"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "Speed" -d "Speed category"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "Time" -d "Time category"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "Universal" -d "Universal (unitless)"
-complete -c gt \
+complete -c gt -f \
-n "__fish_seen_subcommand_from define" \
-a "Weight" -d "Weight category"