Merge remote-tracking branch 'origin/main' into refactor/shared-color-palette
# Conflicts: # tests/functional.fish
This commit is contained in:
@@ -28,84 +28,38 @@ function __fish_config_sync_logging --description 'Sync C5 logging state: sentin
|
||||
set config_home "$HOME/.config"
|
||||
end
|
||||
set -l sentinel "$config_home/fish/.logging_disabled"
|
||||
set -l paru_wrapper "$HOME/.local/bin/paru"
|
||||
set -l yay_wrapper "$HOME/.local/bin/yay"
|
||||
set -l wrapper_version 1
|
||||
|
||||
if __fish_config_op_enabled (status current-function)
|
||||
# Logging enabled: remove sentinel and regenerate wrappers if binaries exist
|
||||
# Logging enabled: remove sentinel
|
||||
rm -f $sentinel
|
||||
|
||||
# Restart tmux pipe-pane for the current pane if inside tmux
|
||||
_tmux_pipe_log
|
||||
|
||||
if test -x /usr/bin/paru
|
||||
mkdir -p (dirname $paru_wrapper)
|
||||
printf '%s\n' \
|
||||
'#!/usr/bin/env bash' \
|
||||
"# paru-wrapper-version: $wrapper_version" \
|
||||
'# Auto-generated by conf.d/paru-wrapper.fish — do not edit by hand.' \
|
||||
'# Tees paru output to a timestamped log file and prunes old ones.' \
|
||||
'set -o pipefail' \
|
||||
'' \
|
||||
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
|
||||
'mkdir -p "$log_dir"' \
|
||||
'log_file="$log_dir/paru_$(date +%Y-%m-%d_%H-%M-%S).log"' \
|
||||
'' \
|
||||
'/usr/bin/paru "$@" 2>&1 | tee "$log_file"' \
|
||||
'' \
|
||||
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
|
||||
'mapfile -t logs < <(ls -1t "$log_dir"/paru_*.log 2>/dev/null)' \
|
||||
'excess=$(( ${#logs[@]} - max_files ))' \
|
||||
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
|
||||
' rm -f "${logs[$i]}"' \
|
||||
'done' \
|
||||
>$paru_wrapper
|
||||
chmod +x $paru_wrapper
|
||||
end
|
||||
|
||||
if test -x /usr/bin/yay
|
||||
mkdir -p (dirname $yay_wrapper)
|
||||
printf '%s\n' \
|
||||
'#!/usr/bin/env bash' \
|
||||
"# yay-wrapper-version: $wrapper_version" \
|
||||
'# Auto-generated by conf.d/yay-wrapper.fish — do not edit by hand.' \
|
||||
'# Tees yay output to a timestamped log file and prunes old ones.' \
|
||||
'set -o pipefail' \
|
||||
'' \
|
||||
'log_dir="${SCROLLBACK_HISTORY_DIR:-$HOME/.terminal_history}"' \
|
||||
'mkdir -p "$log_dir"' \
|
||||
'log_file="$log_dir/yay_$(date +%Y-%m-%d_%H-%M-%S).log"' \
|
||||
'' \
|
||||
'/usr/bin/yay "$@" 2>&1 | tee "$log_file"' \
|
||||
'' \
|
||||
'max_files="${SCROLLBACK_HISTORY_MAX_FILES:-100}"' \
|
||||
'mapfile -t logs < <(ls -1t "$log_dir"/yay_*.log 2>/dev/null)' \
|
||||
'excess=$(( ${#logs[@]} - max_files ))' \
|
||||
'for (( i = ${#logs[@]} - 1; i >= ${#logs[@]} - excess && i >= 0; i-- )); do' \
|
||||
' rm -f "${logs[$i]}"' \
|
||||
'done' \
|
||||
>$yay_wrapper
|
||||
chmod +x $yay_wrapper
|
||||
end
|
||||
else
|
||||
# Logging disabled: create sentinel and remove any generated wrappers
|
||||
# Logging disabled: create sentinel
|
||||
mkdir -p (dirname $sentinel)
|
||||
touch $sentinel
|
||||
|
||||
if test -f $paru_wrapper
|
||||
and grep -q "# paru-wrapper-version:" $paru_wrapper 2>/dev/null
|
||||
rm -f $paru_wrapper
|
||||
end
|
||||
|
||||
if test -f $yay_wrapper
|
||||
and grep -q "# yay-wrapper-version:" $yay_wrapper 2>/dev/null
|
||||
rm -f $yay_wrapper
|
||||
end
|
||||
|
||||
# Stop tmux pipe-pane for the current pane if inside tmux
|
||||
if set -q TMUX
|
||||
tmux pipe-pane 2>/dev/null
|
||||
end
|
||||
end
|
||||
|
||||
# Delegate paru/yay wrapper (re)generation and removal to the canonical
|
||||
# generators. They resolve the real binary via __fish_real_command
|
||||
# (never /usr/bin-assumed) and independently gate on their own C2/C5
|
||||
# keys, so sourcing them here covers both the enabled-regenerate and
|
||||
# disabled-remove cases without duplicating that logic. Previously this
|
||||
# function carried its own inferior copy (tee instead of a PTY, no
|
||||
# progress-bar rendering, hard-coded /usr/bin/paru|yay), which fought
|
||||
# the canonical generator for the wrapper file on every version-marker
|
||||
# mismatch. See startup-latency-JOB-BRIEF-FINDINGS.md §2.
|
||||
#
|
||||
# Routed through _fish_source_scoped: both files `return` early on
|
||||
# several guard checks, and a sourced `return` exits the *calling*
|
||||
# function, which would otherwise abort this function and skip
|
||||
# whichever of paru/yay hadn't run yet.
|
||||
_fish_source_scoped "$__fish_config_dir/conf.d/paru-wrapper.fish"
|
||||
_fish_source_scoped "$__fish_config_dir/conf.d/yay-wrapper.fish"
|
||||
end
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
# Copyright (C) 2026 Rootiest
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
# SYNOPSIS
|
||||
# __fish_help_header <name> [args...]
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Prints <name>'s man-page comment header as a help menu on stdout.
|
||||
# Intended as the first statement of a user-facing function's body:
|
||||
#
|
||||
# __fish_help_header (status current-function) $argv; and return 0
|
||||
#
|
||||
# Returns 1 -- printing nothing -- ONLY when args[1] is not a help flag.
|
||||
# Every other outcome, including an unreadable or headerless source
|
||||
# file, prints something and returns 0. That asymmetry is load-bearing:
|
||||
# a return of 1 means "run the real body", and the real body of upgrade
|
||||
# is `paru -Syu --noconfirm`. A parse failure must never return 1.
|
||||
#
|
||||
# Only args[1] is inspected, never the whole list. wake-lock, bkg,
|
||||
# split and spwin take a command to run as their arguments, so
|
||||
# scanning all of $argv would make `wake-lock rsync --help` print
|
||||
# wake-lock's own help instead of running rsync.
|
||||
#
|
||||
# The header is read from the caller's source at call time rather than
|
||||
# from the generated manual, so it cannot go stale between a header
|
||||
# edit and a docs rebuild.
|
||||
#
|
||||
# ARGUMENTS
|
||||
# name The calling function's name, from (status current-function)
|
||||
# args... The caller's $argv, forwarded verbatim
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Help was printed, including the degraded fallback
|
||||
# 1 args[1] is not -h/--help; the caller should carry on
|
||||
#
|
||||
# EXAMPLE
|
||||
# __fish_help_header (status current-function) $argv; and return 0
|
||||
#
|
||||
# NOTES
|
||||
# Section labels are those of the manual SSOT parser in
|
||||
# docs/manualtools.py. CATEGORY, COMPONENT and DEPENDENCIES are build
|
||||
# metadata and are suppressed; SYNOPSIS renders as USAGE and EXAMPLE as
|
||||
# EXAMPLES.
|
||||
function __fish_help_header --argument-names name
|
||||
# First argument only -- see DESCRIPTION.
|
||||
contains -- "$argv[2]" -h --help; or return 1
|
||||
|
||||
set -l c_ttl (set_color --bold)
|
||||
set -l c_sec (set_color --bold brblue)
|
||||
set -l c_rst (set_color normal)
|
||||
set -l miss " No documentation header found. Try: help config $name"
|
||||
|
||||
set -l file (functions -D -- $name 2>/dev/null)
|
||||
if not test -f "$file"
|
||||
# Quoted: set_color yields an EMPTY LIST under TERM=dumb, and an
|
||||
# unquoted empty list in a concatenation annihilates the whole
|
||||
# word -- the title line would silently vanish wherever colour is
|
||||
# off, which is exactly where a test would be reading it.
|
||||
echo "$c_ttl$name$c_rst"
|
||||
echo $miss
|
||||
return 0
|
||||
end
|
||||
|
||||
# Collect the contiguous comment run directly above `function <name>`,
|
||||
# walking backwards. This resolves multi-header files (fish-deps, gi,
|
||||
# y) without reimplementing manualtools._block_identity, and is more
|
||||
# accurate at runtime: in dops.fish it finds the header above
|
||||
# `function docker` rather than attributing it to the file stem.
|
||||
# One blank separator line is tolerated -- sponge_filter_secrets.fish
|
||||
# is the only file that has one, and JOB-BRIEF-FINDINGS.md records it
|
||||
# so this skip is not mistaken for dead code.
|
||||
set -l lines (string split \n -- (command cat $file))
|
||||
set -l pat '^\s*function\s+'(string escape --style=regex -- $name)'(\s|$)'
|
||||
set -l start 0
|
||||
for i in (seq (count $lines))
|
||||
if string match -qr -- $pat $lines[$i]
|
||||
set start $i
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
set -l header
|
||||
if test $start -gt 1
|
||||
set -l j (math $start - 1)
|
||||
if test -z (string trim -- "$lines[$j]")
|
||||
set j (math $j - 1)
|
||||
end
|
||||
while test $j -ge 1; and string match -q '#*' -- $lines[$j]
|
||||
set -p header $lines[$j]
|
||||
set j (math $j - 1)
|
||||
end
|
||||
end
|
||||
|
||||
# Render. Comment lines before the first `# LABEL` -- the copyright
|
||||
# preamble -- carry no label and are dropped, matching
|
||||
# manualtools._header_blocks.
|
||||
set -l skip CATEGORY COMPONENT DEPENDENCIES
|
||||
set -l label ""
|
||||
set -l out
|
||||
for line in $header
|
||||
set -l m (string match -r -- '^#\s+([A-Z][A-Z ]*[A-Z])\s*$' $line)
|
||||
if set -q m[2]
|
||||
set label $m[2]
|
||||
contains -- $label $skip; and continue
|
||||
set -l shown (string replace SYNOPSIS USAGE -- $label)
|
||||
set shown (string replace EXAMPLE EXAMPLES -- $shown)
|
||||
# One blank line before a heading, never two: the header's own
|
||||
# `#` separator has usually already emitted one.
|
||||
if set -q out[1]; and test -n (string trim -- "$out[-1]")
|
||||
set -a out ""
|
||||
end
|
||||
set -a out "$c_sec$shown$c_rst"
|
||||
continue
|
||||
end
|
||||
test -n "$label"; or continue
|
||||
contains -- $label $skip; and continue
|
||||
set -l body (string sub -s 2 -- $line)
|
||||
if string match -q ' *' -- $body
|
||||
set -a out " "(string sub -s 4 -- $body)
|
||||
else
|
||||
set -a out (string trim -- $body)
|
||||
end
|
||||
end
|
||||
|
||||
# Trim the trailing blank separator, mirroring
|
||||
# manualtools._trailing_blanks.
|
||||
while set -q out[-1]; and test -z (string trim -- "$out[-1]")
|
||||
set -e out[-1]
|
||||
end
|
||||
|
||||
echo "$c_ttl$name$c_rst"
|
||||
if test (count $out) -eq 0
|
||||
echo $miss
|
||||
else
|
||||
# out[1] is always a heading -- a body line cannot precede the
|
||||
# first label -- so this blank is never doubled.
|
||||
echo ""
|
||||
printf '%s\n' $out
|
||||
end
|
||||
return 0
|
||||
end
|
||||
@@ -0,0 +1,26 @@
|
||||
# Copyright (C) 2026 Rootiest
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
# SYNOPSIS
|
||||
# _fish_source_scoped <file>
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Sources <file> inside its own function-call boundary. `source` runs
|
||||
# in the caller's own scope, so a bare `return` in a sourced file --
|
||||
# used by several conf.d guards as an early exit -- would otherwise
|
||||
# unwind whatever function called `source` directly, not just the
|
||||
# sourced file. Calling through this helper contains it to here.
|
||||
#
|
||||
# ARGUMENTS
|
||||
# file Path to the fish script to source
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 File does not exist (nothing to do)
|
||||
# Exit status of the sourced file otherwise
|
||||
#
|
||||
# EXAMPLE
|
||||
# _fish_source_scoped $__fish_config_dir/conf.d/paru-wrapper.fish
|
||||
function _fish_source_scoped --argument-names file
|
||||
test -f $file; or return 0
|
||||
source $file
|
||||
end
|
||||
@@ -23,6 +23,8 @@
|
||||
# bd-pull myuser/myproject
|
||||
# bd-pull rootiest/fish-config
|
||||
function bd-pull --description 'Pull new Gitea issues into local Beads and link them'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if not set -q argv[1]; echo "Need repo owner/name"; return 1; end
|
||||
if not set -q GITEA_TOKEN; echo "\$GITEA_TOKEN not set"; return 1; end
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
# EXAMPLE
|
||||
# bkg firefox
|
||||
function bkg --description 'Execute bkg'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Check if a command was provided as an argument.
|
||||
if test -z "$argv[1]"
|
||||
__fish_palette
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
# EXAMPLE
|
||||
# branch feature/new-ui
|
||||
function branch --description 'Switch to or create a git branch'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if not git rev-parse --is-inside-work-tree >/dev/null 2>&1
|
||||
echo "Not a git repo."
|
||||
return 1
|
||||
|
||||
@@ -11,8 +11,13 @@
|
||||
# Backwards-compatibility wrapper that delegates to fish-deps status to
|
||||
# report which fish shell dependencies are installed or missing.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of `fish-deps status`
|
||||
#
|
||||
# EXAMPLE
|
||||
# check_fish_deps
|
||||
function check_fish_deps --description 'Check all fish-related dependencies'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
fish-deps status
|
||||
end
|
||||
|
||||
@@ -12,8 +12,13 @@
|
||||
# README.md, ensuring all features and examples are accurate and pruning
|
||||
# obsolete content.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of the `claude` invocation
|
||||
#
|
||||
# EXAMPLE
|
||||
# claude-docs
|
||||
function claude-docs --description 'Claude-code: Sync README with recent changes'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
claude "Analyze the recent changes and update the README.md to ensure all features, setup instructions, and examples are 100% accurate. Prune any obsolete information."
|
||||
end
|
||||
|
||||
@@ -12,8 +12,13 @@
|
||||
# branch, write a Conventional Commit, run verification, push, and open a
|
||||
# pull request with a manual verification checklist.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of the `claude` invocation
|
||||
#
|
||||
# EXAMPLE
|
||||
# claude-pr
|
||||
function claude-pr --description 'Claude-code: New branch, commit, push, and PR'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
claude "Act as a senior engineer. Execute this sequence: 1. Create a new git branch (kebab-case). 2. Stage changes and write a Conventional Commit message. 3. Self-verify the changes by running relevant build/test commands or linting. 4. Push to remote. 5. Create a PR to 'main' including a summary of changes and a 'Manual Verification' section containing a Markdown checklist (- [ ]) of specific, bite-sized steps required to manually verify the functionality."
|
||||
end
|
||||
|
||||
@@ -11,9 +11,15 @@
|
||||
# Identifies and removes Arch Linux orphan packages using pacman. Logs
|
||||
# package names and versions to ~/.removed_orphans before removal.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 No orphans found, or orphans removed successfully
|
||||
# Nonzero `sudo pacman -Rns` failed
|
||||
#
|
||||
# EXAMPLE
|
||||
# cleanup
|
||||
function cleanup --description 'Log orphans to ~/.removed_orphans and remove them'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
set -l orphans (pacman -Qtdq)
|
||||
if test -n "$orphans"
|
||||
echo "📝 Logging orphans to ~/.removed_orphans..."
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# Copyright (C) 2026 Rootiest
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
# CATEGORY
|
||||
# 12-ai-and-developer-tools
|
||||
#
|
||||
# DEPENDENCIES
|
||||
# dops
|
||||
#
|
||||
# SYNOPSIS
|
||||
# docker [subcommand] [args...]
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Wrapper for docker that intercepts the ps subcommand and redirects it to
|
||||
# the dops function for enhanced container listing. All other subcommands,
|
||||
# and a bare invocation with no subcommand, are passed through to the real
|
||||
# docker binary.
|
||||
#
|
||||
# ARGUMENTS
|
||||
# subcommand Docker subcommand (ps is redirected to dops)
|
||||
# args... Arguments forwarded to docker or dops
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of dops (for ps), or of the real docker binary otherwise
|
||||
#
|
||||
# EXAMPLE
|
||||
# docker ps
|
||||
# docker
|
||||
function docker --description 'Execute docker, redirecting ps to the enhanced dops listing'
|
||||
if test -z "$argv[1]"
|
||||
command docker
|
||||
return
|
||||
end
|
||||
|
||||
switch $argv[1]
|
||||
case ps
|
||||
dops $argv[2..-1]
|
||||
case '*'
|
||||
command docker $argv[1..-1]
|
||||
end
|
||||
end
|
||||
+17
-16
@@ -4,27 +4,28 @@
|
||||
# CATEGORY
|
||||
# 12-ai-and-developer-tools
|
||||
#
|
||||
# DEPENDENCIES
|
||||
# docker
|
||||
#
|
||||
# SYNOPSIS
|
||||
# docker [subcommand] [args...]
|
||||
# dops [args...]
|
||||
#
|
||||
# DESCRIPTION
|
||||
# Wrapper for docker that intercepts the ps subcommand and redirects it to
|
||||
# the dops function for enhanced container listing. All other subcommands are
|
||||
# passed through to the real docker binary.
|
||||
# Enhanced container listing: runs docker ps with a clean custom table
|
||||
# (Names, Image, Status, Ports) instead of docker's noisier default
|
||||
# columns. Extra arguments (e.g. -a) are forwarded to docker ps.
|
||||
#
|
||||
# ARGUMENTS
|
||||
# subcommand Docker subcommand (ps is redirected to dops)
|
||||
# args... Arguments forwarded to docker or dops
|
||||
# args... Arguments forwarded to `docker ps`
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of `docker ps`
|
||||
#
|
||||
# EXAMPLE
|
||||
# docker ps
|
||||
function docker --description 'Execute docker'
|
||||
if test -n "$argv[1]"
|
||||
switch $argv[1]
|
||||
case ps
|
||||
dops $argv[2..-1]
|
||||
case '*'
|
||||
command docker $argv[1..-1]
|
||||
end
|
||||
end
|
||||
# dops
|
||||
# dops -a
|
||||
function dops --description 'Enhanced, formatted docker ps listing'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
command docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}' $argv
|
||||
end
|
||||
|
||||
@@ -33,9 +33,14 @@
|
||||
# Displays a styled message indicating that the fast command is unavailable
|
||||
# and suggests using fast-cli instead.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Always
|
||||
#
|
||||
# EXAMPLE
|
||||
# fast
|
||||
function fast --description 'Placeholder for future fast utility'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# ANSI Escape Codes (Standard 16-color palette)
|
||||
set -l bold "\e[1m"
|
||||
set -l italic "\e[3m"
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
# fc
|
||||
# fc git
|
||||
function fc --description 'Edit and execute the last command (Bash-style fc)'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
set -l tmpfile (mktemp /tmp/fish_fc.XXXXXX).fish
|
||||
|
||||
if count $argv >/dev/null
|
||||
|
||||
@@ -66,6 +66,13 @@ function fish-deps --description 'Manage fish shell dependencies'
|
||||
_fish_deps_status
|
||||
case install
|
||||
_fish_deps_install $flags
|
||||
case -h --help
|
||||
# Reuse the existing menu rather than the header renderer: it
|
||||
# is richer, and it is already the text the unknown-subcommand
|
||||
# path prints. Previously --help fell into `case '*'` and
|
||||
# exited 1 with "Unknown subcommand: --help".
|
||||
__fish_deps_help
|
||||
return 0
|
||||
case update
|
||||
_fish_deps_update
|
||||
case sync
|
||||
|
||||
@@ -11,9 +11,15 @@
|
||||
# Installs or upgrades fzf from git HEAD into ~/.fzf. Pulls the latest
|
||||
# changes if ~/.fzf already exists, or clones the repository if not.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 fzf installed or updated successfully
|
||||
# Nonzero git or the fzf install script failed
|
||||
#
|
||||
# EXAMPLE
|
||||
# fzf-update
|
||||
function fzf-update --description 'Install or upgrade fzf from git HEAD'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if test -d ~/.fzf
|
||||
echo "Updating fzf..."
|
||||
git -C ~/.fzf pull --ff-only
|
||||
|
||||
@@ -11,9 +11,14 @@
|
||||
# Fetches and prints both the public IPv4 and IPv6 addresses using
|
||||
# icanhazip.com. Shows "Not detected" for any address that times out.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Always (network failures print "Not detected" instead of failing)
|
||||
#
|
||||
# EXAMPLE
|
||||
# gip
|
||||
function gip --description 'Show all public IP addresses'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
echo -n "IPv4: "
|
||||
curl -4 -s --max-time 2 https://icanhazip.com || echo "Not detected"
|
||||
echo -n "IPv6: "
|
||||
|
||||
@@ -10,8 +10,13 @@
|
||||
# DESCRIPTION
|
||||
# Fetches and prints the machine's public IPv4 address using icanhazip.com.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of curl
|
||||
#
|
||||
# EXAMPLE
|
||||
# gip4
|
||||
function gip4 --wraps='curl' --description 'Get public IPv4 address'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
curl -4 -s https://icanhazip.com
|
||||
end
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
# EXAMPLE
|
||||
# gip6
|
||||
function gip6 --description 'Get public IPv6 address'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Use -6 to force IPv6 and --fail to catch network errors
|
||||
set -l ip (curl -6 -s --fail https://icanhazip.com 2>/dev/null)
|
||||
|
||||
|
||||
@@ -14,9 +14,15 @@
|
||||
# Searches fish history interactively using fzf, inserts the selected command
|
||||
# into the command line, and copies it to the clipboard via wl-copy.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Command selected and inserted, or fzf was cancelled
|
||||
# 1 Disabled by __fish_config_op_integrations
|
||||
#
|
||||
# EXAMPLE
|
||||
# hist
|
||||
function hist --description 'Search fish history and put it in the prompt'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Opinionated guard (C4): integrations disabled
|
||||
if not __fish_config_op_enabled (status current-function)
|
||||
__fish_palette
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# lD ~/projects
|
||||
function lD --description 'List directories only'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --only-dirs --long --icons --color=auto --hyperlink $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
# EXAMPLE
|
||||
# ld
|
||||
function ld --description 'Run lazydocker on the current Docker context'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if not type -q docker
|
||||
echo "ld: docker is not installed" >&2
|
||||
return 1
|
||||
|
||||
@@ -13,9 +13,14 @@
|
||||
# files tracked by sbctl. Combines the edit and sign steps into a single
|
||||
# command.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Always (individual step failures are not propagated)
|
||||
#
|
||||
# EXAMPLE
|
||||
# limine-edit
|
||||
function limine-edit --description 'Safely edit and re-verify Limine configuration'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# 1. Open the config with sudoedit
|
||||
sudoedit /boot/limine.conf
|
||||
|
||||
|
||||
@@ -10,8 +10,13 @@
|
||||
# DESCRIPTION
|
||||
# Locks the current desktop session using loginctl lock-session.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of `loginctl lock-session`
|
||||
#
|
||||
# EXAMPLE
|
||||
# lock
|
||||
function lock --wraps='loginctl' --description 'alias lock=loginctl'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
loginctl lock-session
|
||||
end
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# lsr ~/projects
|
||||
function lsr --description 'Reversed time-sorted listing'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --oneline --sort=modified --reverse --icons --color=auto --hyperlink $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# lss ~/downloads
|
||||
function lss --description 'Size-sorted listing'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --oneline --long --all --sort=size --icons --color=auto --hyperlink --color-scale=size --color-scale-mode=gradient $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# lstree ~/projects/myapp
|
||||
function lstree --description 'Full recursive tree listing'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --tree --icons --color=auto --hyperlink=auto $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# lt ~/projects
|
||||
function lt --description 'Tree listing, depth 2'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --tree --level=2 --icons --color=auto --hyperlink $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -15,9 +15,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# ltr ~/projects
|
||||
function ltr --description 'Reversed time-sorted listing'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --long --all --sort=modified --icons --hyperlink --color=auto --color-scale=age --color-scale-mode=gradient $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -14,9 +14,14 @@
|
||||
# ARGUMENTS
|
||||
# args... Arguments forwarded to the listing command
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of eza, lsd, or ls, whichever ran
|
||||
#
|
||||
# EXAMPLE
|
||||
# lx ~/projects
|
||||
function lx --description 'Extension-sorted listing'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if which eza >/dev/null 2>&1
|
||||
eza --long --all --sort=extension --icons --color=auto --hyperlink $argv
|
||||
else if which lsd >/dev/null 2>&1
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
# EXAMPLE
|
||||
# parur
|
||||
function parur --description 'Interactively search and remove an installed package using fzf'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
set -l aur ""
|
||||
if type -q paru
|
||||
set aur paru
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
# EXAMPLE
|
||||
# poke ~/projects/new/src/main.fish
|
||||
function poke --description 'touch with automatic parent directory creation'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if test (count $argv) -eq 0
|
||||
echo (set_color red)"poke: no file specified"(set_color normal) >&2
|
||||
return 1
|
||||
|
||||
@@ -11,8 +11,13 @@
|
||||
# Lists all active TCP listeners on the system using lsof, showing
|
||||
# port numbers and addresses without hostname resolution.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of `lsof`
|
||||
#
|
||||
# EXAMPLE
|
||||
# ports
|
||||
function ports --wraps='sudo' --description 'Show active network listeners'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
sudo lsof -iTCP -sTCP:LISTEN -P -n
|
||||
end
|
||||
|
||||
@@ -15,10 +15,15 @@
|
||||
# ARGUMENTS
|
||||
# text... Text to encode; reads from stdin if omitted
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of qrencode, or curl if qrencode is unavailable
|
||||
#
|
||||
# EXAMPLE
|
||||
# qr "https://example.com"
|
||||
# echo "hello" | qr
|
||||
function qr --description 'Generate a QR code from text or pipe'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if type -q qrencode
|
||||
if set -q argv[1]
|
||||
echo $argv | qrencode -t utf8
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
# sbver
|
||||
# sbver --brief
|
||||
function sbver --description 'Verifies Secure Boot status of EFI binaries using sbctl'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if not type -q sbctl
|
||||
echo "Error: 'sbctl' is not installed."
|
||||
return 1
|
||||
|
||||
@@ -11,9 +11,14 @@
|
||||
# Turns off the display after a 1-second delay by invoking the KDE
|
||||
# PowerDevil "Turn Off Screen" global shortcut via busctl.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of `busctl`
|
||||
#
|
||||
# EXAMPLE
|
||||
# screensleep
|
||||
function screensleep --description 'Turn off the display using KDE PowerDevil'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Optional: 1-second delay to ensure no keystrokes wake it immediately
|
||||
sleep 1
|
||||
busctl --user call \
|
||||
|
||||
@@ -29,6 +29,10 @@
|
||||
# split
|
||||
# split -v nvim README.md
|
||||
function split --description 'Run a command in a new terminal split'
|
||||
# -h is --horizontal here (see this function's own ARGUMENTS),
|
||||
# so only the long form may reach the renderer.
|
||||
test "$argv[1]" = --help; and __fish_help_header (status current-function) --help; and return 0
|
||||
|
||||
# Opinionated guard (C4): integrations disabled
|
||||
if not __fish_config_op_enabled (status current-function)
|
||||
__fish_palette
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
# EXAMPLE
|
||||
# # Register with sponge (done automatically by conf.d/sponge_privacy.fish):
|
||||
# set -U -a sponge_filters sponge_filter_secrets
|
||||
|
||||
function sponge_filter_secrets --argument-names command
|
||||
# Find all exported variables with security-sensitive names
|
||||
set -l sensitive_vars (set --names --export | string match --regex -- \
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
# EXAMPLE
|
||||
# spwin
|
||||
function spwin --wraps='~/.config/kitty/spawn-window.sh' --description 'spawn window in kitty or wezterm'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Opinionated guard (C4): integrations disabled
|
||||
if not __fish_config_op_enabled (status current-function)
|
||||
__fish_palette
|
||||
|
||||
@@ -11,9 +11,14 @@
|
||||
# Launches Steam with systemd-inhibit to prevent the system from idling
|
||||
# or sleeping during active downloads.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# Exit status of `steam` (via systemd-inhibit)
|
||||
#
|
||||
# EXAMPLE
|
||||
# steam-dl
|
||||
function steam-dl --description 'Run Steam while inhibiting system sleep'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
echo "Inhibiting sleep while Steam downloads..."
|
||||
systemd-inhibit --why="Active Download" --who="User" --what=idle:sleep steam
|
||||
end
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
# EXAMPLE
|
||||
# sudo-toggle
|
||||
function sudo-toggle --description 'Toggle sudo password requirement on/off'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Check the file size using sudo stat to see if our bypass rule is active
|
||||
set -l file_size (sudo stat -c %s /etc/sudoers.d/nofail-toggle 2>/dev/null)
|
||||
|
||||
|
||||
@@ -12,9 +12,14 @@
|
||||
# zRAM compression ratio, zRAM device details (via zramctl), and
|
||||
# active swap priority (via swapon).
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Always
|
||||
#
|
||||
# EXAMPLE
|
||||
# swapstat
|
||||
function swapstat --description 'View colorized zRAM and swappiness status'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
set -l swappiness (sysctl -n vm.swappiness)
|
||||
set -l zdata (zramctl --bytes --noheadings --output DATA,TOTAL /dev/zram0 2>/dev/null)
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
# EXAMPLE
|
||||
# tab
|
||||
function tab --description 'Spawn a new tab in the current terminal'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Opinionated guard (C4): integrations disabled
|
||||
if not __fish_config_op_enabled (status current-function)
|
||||
__fish_palette
|
||||
|
||||
@@ -11,9 +11,14 @@
|
||||
# Kills all detached (unattached) tmux sessions, leaving any currently
|
||||
# attached sessions running.
|
||||
#
|
||||
# EXIT STATUS
|
||||
# 0 Always
|
||||
#
|
||||
# EXAMPLE
|
||||
# tmux-clean
|
||||
function tmux-clean --description 'Kill all tmux sessions except the current one'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Get a list of all session names that are NOT currently attached
|
||||
set sessions (tmux list-sessions -F '#{session_name} #{session_attached}' | string match -rv ' 1$' | string split -f1 ' ')
|
||||
|
||||
|
||||
@@ -21,6 +21,8 @@
|
||||
# EXAMPLE
|
||||
# upgrade
|
||||
function upgrade --description 'Full system upgrade via paru or yay'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
# Opinionated guard (C4): integrations disabled
|
||||
if not __fish_config_op_enabled (status current-function)
|
||||
__fish_palette
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
# EXAMPLE
|
||||
# wake-lock rsync -avz src/ dest/
|
||||
function wake-lock --description 'Run a command while inhibiting system sleep'
|
||||
__fish_help_header (status current-function) $argv; and return 0
|
||||
|
||||
if test (count $argv) -eq 0
|
||||
__fish_palette
|
||||
echo "$c_head""Usage:$c_reset $c_cmd""wake-lock$c_reset $c_arg""[command] [args...]$c_reset"
|
||||
|
||||
Reference in New Issue
Block a user