pandoc wasn't available when this branch's earlier commit ran build-manual.py --concat; regenerate docs/fish-config.1 from the current docs/fish-config.md now that it is.
5155 lines
163 KiB
Groff
5155 lines
163 KiB
Groff
'\" t
|
|
.\" Automatically generated by Pandoc 3.10.2
|
|
.\"
|
|
.TH "FISH\-CONFIG" "7" "June 2026" "" "Fish Shell Configuration User Manual"
|
|
.SH NAME
|
|
fish\-config \- personal fish shell configuration for Fish 4.x with
|
|
modern CLI tool integration
|
|
.SH SYNOPSIS
|
|
.IP
|
|
.EX
|
|
help config [SECTION]
|
|
.EE
|
|
.PP
|
|
Open this manual in the best available pager.
|
|
Optionally jump to a section by keyword:
|
|
.IP
|
|
.EX
|
|
help config keybindings
|
|
help config pkg
|
|
help config abbreviations
|
|
help config logs
|
|
.EE
|
|
.PP
|
|
The \f[CR]help config\f[R] syntax integrates with fish\(cqs built\-in
|
|
help command.
|
|
The underlying \f[CR]config\-help\f[R] function is also available
|
|
directly.
|
|
.SH DESCRIPTION
|
|
A production\-grade Fish shell configuration targeting Fish 4.x.
|
|
It provides:
|
|
.IP \(bu 2
|
|
Drop\-in replacements for common Unix tools (\f[CR]ls\f[R],
|
|
\f[CR]cat\f[R], \f[CR]rm\f[R], \f[CR]du\f[R], \f[CR]ping\f[R],
|
|
\f[CR]less\f[R])
|
|
.IP \(bu 2
|
|
Deep Kitty and WezTerm terminal integration: tab/window/pane management
|
|
from the command line
|
|
.IP \(bu 2
|
|
Optional session logging: terminal scrollback,
|
|
\f[CR]tmux\f[R]/\f[CR]zellij\f[R] panes, and
|
|
\f[CR]paru\f[R]/\f[CR]yay\f[R] output captured to
|
|
\f[CR]\(ti/.terminal_history\f[R] (off by default; see C5 Logging)
|
|
.IP \(bu 2
|
|
Automatic Python virtualenv activation on directory change
|
|
.IP \(bu 2
|
|
Cross\-platform package management via pkg and \f[CR]fish\-deps\f[R]
|
|
.IP \(bu 2
|
|
AI scaffolding helpers for Claude Code and Antigravity
|
|
.IP \(bu 2
|
|
Catppuccin Mocha color theme throughout
|
|
.PP
|
|
The configuration uses a structured file tree:
|
|
.IP
|
|
.EX
|
|
\(ti/.config/fish/
|
|
├── config.fish Main entry point; sets env vars and PATH
|
|
├── conf.d/
|
|
│ ├── abbr.fish All abbreviations
|
|
│ ├── autopair.fish Auto\-pair brackets and quotes
|
|
│ ├── cheat.fish cheat.sh tab completions
|
|
│ ├── done.fish Desktop notifications for long commands
|
|
│ ├── first_run.fish One\-time init: Fisher bootstrap, theme
|
|
│ ├── key_bindings.fish Custom key bindings and Vi mode
|
|
│ ├── logging\-events.fish C5 event handlers; syncs logging state
|
|
│ ├── kitty\-watcher\-reminder.fish C5 per\-session Kitty watcher reminder
|
|
│ ├── paru\-wrapper.fish Auto\-generates paru logging wrapper
|
|
│ ├── puffer.fish !! / !$ / ./ expansion
|
|
│ ├── tmux\-logging.fish C5 starts tmux pipe\-pane capture
|
|
│ ├── zellij\-logging.fish C5 fish_exit handler for zellij
|
|
│ ├── sponge_privacy.fish Sponge privacy patterns
|
|
│ ├── starship.fish fish_prompt shell\-integration markers
|
|
│ ├── tailscale.fish Tailscale CLI tab completions
|
|
│ ├── theme.fish Catppuccin syntax highlight colors
|
|
│ ├── tricks.fish PATH, bang\-bang helpers, bat man pages
|
|
│ ├── wakatime.fish WakaTime shell hook
|
|
│ ├── yay\-wrapper.fish Auto\-generates yay logging wrapper
|
|
│ └── zoxide.fish Zoxide z/zi integration; overrides cd
|
|
├── functions/ Custom functions, one per file
|
|
├── completions/ Tab completion scripts
|
|
├── integrations/
|
|
│ └── fzf.fish FZF Catppuccin theme and key bindings
|
|
├── scripts/
|
|
│ ├── clean_progress_log.py Strips typescript animations for clean logs
|
|
│ └── agents\-tools/ AGENTS.md scripts and git hooks
|
|
└── docs/ Offline documentation and man page
|
|
├── fish\-config.md Primary source manual
|
|
├── fish\-config.1 Compiled man page (auto\-generated)
|
|
├── fish\-config.index Section index for help config
|
|
├── html/ Chunked HTML docs (auto\-generated)
|
|
└── wiki/ Markdown wiki (auto\-generated)
|
|
.EE
|
|
.PP
|
|
* * * * *
|
|
.SH TABLE OF CONTENTS
|
|
.IP
|
|
.EX
|
|
1. Configuration Variables
|
|
2. PATH Setup
|
|
3. Key Bindings
|
|
4. Abbreviations
|
|
\- Editors
|
|
\- Navigation and Listing
|
|
\- Git
|
|
\- Terminal Windows, Tabs, and Panes
|
|
\- Chezmoi
|
|
\- Docker
|
|
\- Systemctl
|
|
\- AI Assistants
|
|
\- History Expansion
|
|
\- Miscellaneous
|
|
\- Shell Aliases
|
|
5. Functions Reference
|
|
\- File and Directory
|
|
\- Navigation
|
|
\- Editors and Viewers
|
|
\- Git and Version Control
|
|
\- Package Management
|
|
\- Dependency Management
|
|
\- System and Monitoring
|
|
\- Terminal Management
|
|
\- Clipboard
|
|
\- Network
|
|
\- Pager and Logging
|
|
\- AI and Developer Tools
|
|
\- Media and Utilities
|
|
\- Miscellaneous
|
|
6. Dependency Catalog
|
|
7. Customization
|
|
8. Components Reference
|
|
\- C1 \(em Command Shadows
|
|
\- C2 \(em Startup Side\-Effects
|
|
\- C3 \(em Key and Environment Overrides
|
|
\- C4 \(em Terminal and Tool Integration
|
|
\- C5 \(em Logging and Capture
|
|
\- C6 \(em Greeting and First\-Run UI
|
|
9. Fisher Plugins
|
|
10. Installation
|
|
11. Personalization
|
|
12. Troubleshooting
|
|
13. Viewing This Manual
|
|
14. Testing
|
|
15. Contributing
|
|
16. Attribution
|
|
17. License
|
|
.EE
|
|
.PP
|
|
* * * * *
|
|
.SH 1. CONFIGURATION VARIABLES
|
|
These variables are exported from \f[CR]config.fish\f[R] on every
|
|
interactive session.
|
|
Override them in \f[CR]local.fish\f[R] (see Section 10,
|
|
Personalization).
|
|
.SS Environment Directories (XDG)
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]XDG_CONFIG_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]\(ti/.config\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]XDG_CACHE_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]\(ti/.cache\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]XDG_DATA_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]\(ti/.local/share\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]XDG_STATE_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]\(ti/.local/state\f[R]
|
|
T}
|
|
.TE
|
|
.PP
|
|
Tools that respect XDG are directed to these paths rather than polluting
|
|
\f[CR]$HOME\f[R].
|
|
.SS Tool Homes (XDG\-compliant)
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]CARGO_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_DATA_HOME/cargo\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]RUSTUP_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_DATA_HOME/rustup\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]GOPATH\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_DATA_HOME/go\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]BUN_INSTALL\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_DATA_HOME/bun\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]NPM_CONFIG_PREFIX\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_DATA_HOME/npm\-global\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]GNUPGHOME\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_CONFIG_HOME/gnupg\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]WAKATIME_HOME\f[R]
|
|
T}@T{
|
|
\f[CR]$XDG_CONFIG_HOME/wakatime\f[R]
|
|
T}
|
|
.TE
|
|
.SS Editor and Pager
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
lw(35.0n) lw(35.0n).
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value / Notes
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]EDITOR\f[R]
|
|
T}@T{
|
|
\f[CR]nvim\f[R] (falls back to \f[CR]vi\f[R] if \f[CR]nvim\f[R] is
|
|
absent)
|
|
T}
|
|
T{
|
|
\f[CR]VISUAL\f[R]
|
|
T}@T{
|
|
unset by default; set a GUI editor via \f[CR]local.fish\f[R] (the
|
|
\f[CR]edit\f[R] function falls back to a GUI chain when
|
|
\f[CR]VISUAL\f[R] is empty)
|
|
T}
|
|
T{
|
|
\f[CR]SUDO_EDITOR\f[R]
|
|
T}@T{
|
|
same as \f[CR]EDITOR\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]PAGER\f[R]
|
|
T}@T{
|
|
\f[CR]ov\f[R] (falls back to \f[CR]less\f[R])
|
|
T}
|
|
.TE
|
|
.SS Scrollback History
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value / Notes
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]__fish_scrollback_history_dir\f[R]
|
|
T}@T{
|
|
(unset → \f[CR]\(ti/.terminal_history\f[R])
|
|
T}
|
|
T{
|
|
\f[CR]__fish_scrollback_history_max_files\f[R]
|
|
T}@T{
|
|
(unset → \f[CR]100\f[R])
|
|
T}
|
|
T{
|
|
\f[CR]SCROLLBACK_HISTORY_DIR\f[R]
|
|
T}@T{
|
|
\f[CR]\(ti/.terminal_history\f[R] (exported mirror)
|
|
T}
|
|
T{
|
|
\f[CR]SCROLLBACK_HISTORY_MAX_FILES\f[R]
|
|
T}@T{
|
|
\f[CR]100\f[R] (exported mirror)
|
|
T}
|
|
.TE
|
|
.PP
|
|
The \f[CR]__fish_scrollback_history_*\f[R] universal variables are the
|
|
fish\-style source of truth \(em set them via
|
|
\f[CR]config\-settings\f[R] → Paths, or \f[CR]set \-U\f[R] directly.
|
|
\f[CR]config.fish\f[R] exports the \f[CR]SCROLLBACK_HISTORY_*\f[R]
|
|
mirrors from them, because the POSIX wrapper scripts
|
|
(\f[CR]paru\f[R]/\f[CR]yay\f[R]/\f[CR]tmux\f[R]/\f[CR]zellij\f[R]
|
|
logging and \f[CR]_prune_terminal_logs\f[R]) read the exported names
|
|
from the environment.
|
|
When the \f[CR]__fish_\f[R] vars are unset, the documented defaults are
|
|
exported.
|
|
\f[CR]config.fish\f[R] deliberately does not create a global source var,
|
|
which would shadow the universal and stop live edits from taking effect.
|
|
.PP
|
|
Scrollback logs accumulate in \f[CR]SCROLLBACK_HISTORY_DIR\f[R] as
|
|
timestamped files.
|
|
When the count exceeds \f[CR]SCROLLBACK_HISTORY_MAX_FILES\f[R] the
|
|
oldest are pruned automatically on exit.
|
|
Use \f[CR]logs\f[R] to browse them interactively.
|
|
.SS Other
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
lw(23.3n) lw(23.3n) lw(23.3n).
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value
|
|
T}@T{
|
|
Notes
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]GPG_TTY\f[R]
|
|
T}@T{
|
|
\f[CR]$(tty)\f[R]
|
|
T}@T{
|
|
ensures GPG passphrase prompts work
|
|
T}
|
|
T{
|
|
\f[CR]CLAUDE_CODE_NO_FLICKER\f[R]
|
|
T}@T{
|
|
\f[CR]1\f[R]
|
|
T}@T{
|
|
suppress terminal flicker in Claude Code
|
|
T}
|
|
T{
|
|
\f[CR]CDPATH\f[R]
|
|
T}@T{
|
|
\f[CR]. \(ti/projects \(ti\f[R]
|
|
T}@T{
|
|
T}
|
|
.TE
|
|
.PP
|
|
Opinionated defaults (\f[CR]CDPATH\f[R],
|
|
\f[CR]PAGER\f[R]/\f[CR]MANPAGER\f[R], Vi mode, command shadows, terminal
|
|
integrations) can be switched off per category with universal variables
|
|
\(em see Section 7, \(lqOpinionated Components (Minimal Mode)\(rq.
|
|
.SS Pager Hierarchy
|
|
\f[CR]$PAGER\f[R] is set to \f[CR]ov\f[R] when available, falling back
|
|
to \f[CR]less\f[R].
|
|
The \f[CR]less\f[R] wrapper function extends this into a full chain so
|
|
anything that calls \f[CR]less\f[R] directly also benefits:
|
|
.PP
|
|
\f[CR]$PAGER\f[R] → \f[CR]ov\f[R] → \f[CR]less\f[R] → \f[CR]more\f[R] →
|
|
\f[CR]cat\f[R]
|
|
.PP
|
|
When \f[CR]bat\f[R] is installed, man pages are rendered with syntax
|
|
highlighting:
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]MANROFFOPT\f[R]
|
|
T}@T{
|
|
\f[CR]\-c\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]MANPAGER\f[R]
|
|
T}@T{
|
|
\f[CR]sh \-c \(aqcol \-bx \(rs| bat \-l man \-p\(aq\f[R]
|
|
T}
|
|
.TE
|
|
.SS Integrations
|
|
.SS Zoxide
|
|
\f[CR]cd\f[R], \f[CR]z\f[R], and \f[CR]cdi\f[R]/\f[CR]zi\f[R] are all
|
|
mapped to \f[CR]zoxide\f[R]\-backed navigation.
|
|
Tab completions for \f[CR]cd\f[R] and \f[CR]z\f[R] blend standard
|
|
directory entries (CWD and \f[CR]CDPATH\f[R]) with frecency results so
|
|
both familiar and frequently\-visited paths appear in one list.
|
|
.SS DirEnv
|
|
Automatically loads \f[CR].envrc\f[R] files on directory change.
|
|
Takes priority over the auto\-venv logic \(em if a directory is managed
|
|
by \f[CR]direnv\f[R], the auto\-venv activation is skipped entirely.
|
|
.SS Auto Python Venv
|
|
When entering a directory that contains a \f[CR].venv/\f[R], the
|
|
virtualenv is activated automatically and deactivated when you leave the
|
|
project tree.
|
|
.SS WakaTime
|
|
Every shell command is reported to WakaTime for time\-tracking.
|
|
Set \f[CR]FISH_WAKATIME_DISABLED=1\f[R] to disable without removing the
|
|
plugin.
|
|
.SS Tailscale
|
|
Full tab completion for the \f[CR]tailscale\f[R] CLI is provided via
|
|
\f[CR]conf.d/tailscale.fish\f[R].
|
|
.SS Done Notifications
|
|
Desktop notifications fire when a command takes longer than 10 seconds
|
|
and the terminal window is not focused.
|
|
Configured via fish universal variables:
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Variable
|
|
T}@T{
|
|
Value
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]__done_min_cmd_duration\f[R]
|
|
T}@T{
|
|
\f[CR]10000\f[R] ms
|
|
T}
|
|
T{
|
|
\f[CR]__done_notification_urgency_level\f[R]
|
|
T}@T{
|
|
\f[CR]low\f[R]
|
|
T}
|
|
.TE
|
|
.SS Scrollback History
|
|
When running inside Kitty, closing a shell session via \f[CR]exit\f[R]
|
|
saves a timestamped scrollback snapshot to
|
|
\f[CR]SCROLLBACK_HISTORY_DIR\f[R].
|
|
Files are named:
|
|
.PP
|
|
\f[CR]scrollback_YYYY\-MM\-DD_HH\-MM\-SS.log\f[R]
|
|
.PP
|
|
The \f[CR]paru\f[R] and \f[CR]yay\f[R] wrappers (auto\-generated in
|
|
\f[CR]\(ti/.local/bin/\f[R]) run the command inside a PTY via
|
|
\f[CR]script(1)\f[R] so download progress bars are preserved on screen,
|
|
then render the captured terminal animation down to a clean static log
|
|
via \f[CR]scripts/clean_progress_log.py\f[R] (a small terminal\-screen
|
|
emulator that replays cursor movements, collapses repainted progress
|
|
frames to their final state, and preserves ANSI color).
|
|
If \f[CR]python3\f[R] is unavailable the wrapper falls back to dropping
|
|
only the \f[CR]script(1)\f[R] header/footer.
|
|
Output is saved to:
|
|
.IP \(bu 2
|
|
\f[CR]paru_YYYY\-MM\-DD_HH\-MM\-SS.log\f[R]
|
|
.IP \(bu 2
|
|
\f[CR]yay_YYYY\-MM\-DD_HH\-MM\-SS.log\f[R]
|
|
.PP
|
|
Before pruning, \f[CR]_scrollback_prune_junk\f[R] silently removes empty
|
|
files, files with only a single meaningful line (e.g.\ bare
|
|
\f[CR][exited]\f[R] captures), and Kitty tab\-rename prompt captures.
|
|
Use \f[CR]exit \-\-no\-log\f[R] (or \f[CR]exit \-n\f[R]) to skip
|
|
capture.
|
|
.PP
|
|
* * * * *
|
|
.SH 2. PATH SETUP
|
|
Directories prepended to PATH in this order (first wins):
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Directory
|
|
T}@T{
|
|
Purpose
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]\(ti/.local/bin\f[R]
|
|
T}@T{
|
|
Standard user\-local executables
|
|
T}
|
|
T{
|
|
\f[CR]\(ti/Applications\f[R]
|
|
T}@T{
|
|
User\-installed standalone apps
|
|
T}
|
|
T{
|
|
\f[CR]\(ti/scripts\f[R]
|
|
T}@T{
|
|
Personal shell scripts
|
|
T}
|
|
T{
|
|
\f[CR]\(ti/bin\f[R]
|
|
T}@T{
|
|
Cargo binaries (appended \(em lowest priority)
|
|
T}
|
|
T{
|
|
\f[CR]$BUN_INSTALL/bin\f[R]
|
|
T}@T{
|
|
Bun runtime and global packages
|
|
T}
|
|
T{
|
|
\f[CR]$NPM_CONFIG_PREFIX/bin\f[R]
|
|
T}@T{
|
|
Global \f[CR]npm\f[R] packages
|
|
T}
|
|
T{
|
|
\f[CR]\(ti/.lmstudio/bin\f[R]
|
|
T}@T{
|
|
LM Studio CLI
|
|
T}
|
|
T{
|
|
\f[CR]\(ti/.resend/bin\f[R]
|
|
T}@T{
|
|
Resend CLI
|
|
T}
|
|
T{
|
|
\f[CR]\(ti/.fzf/bin\f[R]
|
|
T}@T{
|
|
\f[CR]fzf\f[R] binary (git\-installed)
|
|
T}
|
|
.TE
|
|
.PP
|
|
Cargo binaries are intentionally appended (lowest priority) to avoid
|
|
shadowing system\-installed Rust tools.
|
|
.PP
|
|
NOTE: While these directories are merged with your system\(cqs existing
|
|
\f[CR]$PATH\f[R] values, any executables in the prepended directories
|
|
above will override (shadow) system binaries of the same name.
|
|
.PP
|
|
TIP: This standard PATH setup is gated behind the opinionated component
|
|
overrides toggle.
|
|
If you prefer to manage your PATH completely manually, you can disable
|
|
it by setting \f[CR]__fish_config_op_overrides\f[R] to \f[CR]0\f[R] (or
|
|
toggle it off in the \f[CR]config\-settings\f[R] menu).
|
|
.PP
|
|
* * * * *
|
|
.SH 3. KEY BINDINGS
|
|
The shell uses Vi key bindings (\f[CR]fish_vi_key_bindings\f[R]).
|
|
All custom bindings are active in Insert, Normal, and Visual modes
|
|
unless noted.
|
|
.IP
|
|
.EX
|
|
Binding Action
|
|
─────────────────────────────────────────────────────────────────────
|
|
Ctrl+G Insert the head of the previous command\(aqs last path
|
|
argument. Equivalent to !$:h in Bash.
|
|
Example: previous = \(dqcd /usr/local/bin\(dq
|
|
Ctrl+G inserts \(dq/usr/local\(dq
|
|
|
|
Ctrl+F Interactive history substitution. Type old/new then
|
|
press Ctrl+F to apply s/old/new/ to the previous
|
|
command. Equivalent to !!:s/old/new/ in Bash.
|
|
Example: previous = \(dqecho this is a test\(dq
|
|
type \(dqthis is/that was\(dq, press Ctrl+F
|
|
result = \(dqecho that was a test\(dq
|
|
|
|
Ctrl+Alt+U Strip the first token of the current command line,
|
|
leaving arguments in place with the cursor at the
|
|
start. Useful for quickly retyping the command.
|
|
Example: \(dqmkdir new_folder\(dq \-> \(dq new_folder\(dq
|
|
|
|
Ctrl+Alt+= Evaluate the current command line buffer with
|
|
Qalculate! (qalc) and print the result inline.
|
|
Requires qalc to be installed.
|
|
Example: type \(dq150 * 1.08\(dq, press Ctrl+Alt+=
|
|
prints 162
|
|
|
|
Ctrl+Enter Smart execute: runs commands instantly without
|
|
pressing Enter a second time for certain fast\-path
|
|
commands (speedtest\-fast, etc.).
|
|
|
|
\(at\(at FZF inline picker. Type \(at twice anywhere on the
|
|
command line to open an fzf picker and replace the
|
|
\(at\(at with the selection. The \(at\(at must be typed as its
|
|
own token: \(dqcat \(at\(at\(dq triggers it, but \(dqcat\(at\(at\(dq does
|
|
not.
|
|
|
|
Ctrl+Right Accept autosuggestion one word/directory segment
|
|
at a time. (Restores Fish 3.x behavior by binding
|
|
to nextd\-or\-forward\-word).
|
|
.EE
|
|
.SS FZF Bindings (bundled from PatrickF1/fzf.fish)
|
|
.IP
|
|
.EX
|
|
Ctrl+R Search command history
|
|
Ctrl+Alt+F Search git\-tracked files
|
|
Ctrl+Alt+L Search git log
|
|
Ctrl+Alt+S Search git status
|
|
Ctrl+V Search shell variables
|
|
Ctrl+Alt+P Search running processes
|
|
.EE
|
|
.PP
|
|
* * * * *
|
|
.SH 4. ABBREVIATIONS
|
|
Abbreviations expand when you press Space or Enter.
|
|
They are terminal\-aware: some expand differently in Kitty vs WezTerm vs
|
|
other terminals.
|
|
.SS 4.1 Editors
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
n nvim
|
|
nv nvim
|
|
neovim nvim
|
|
cdnv cd \(ti/.config/nvim
|
|
cdnvn cd \(ti/.config/nvim; nvim
|
|
k kate
|
|
e edit
|
|
se sudoedit
|
|
.EE
|
|
.SS 4.2 Navigation and Listing
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
l ls
|
|
lS lss (sort by size)
|
|
lsR lsr (sort by time, oldest first)
|
|
lX lx (sort by extension)
|
|
lT lt (tree, depth 2)
|
|
lsT lstree (full recursive tree)
|
|
.EE
|
|
.SS 4.3 Git
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
lg lazygit
|
|
g git
|
|
gitig generate .gitignore
|
|
git\-ignore generate .gitignore
|
|
.EE
|
|
.SS 4.4 Terminal Windows, Tabs, and Panes
|
|
These abbreviations control the terminal emulator.
|
|
Each has a Kitty variant and a WezTerm variant; the correct one is
|
|
inserted based on \f[CR]$TERM\f[R] or \f[CR]$TERM_PROGRAM\f[R].
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
editt Open new tab with nvim (terminal\-aware)
|
|
:q Close current pane/window
|
|
:Q Close current tab
|
|
:w New OS window
|
|
:wv Split pane horizontally (new pane below)
|
|
:wh Split pane vertically (new pane to the right)
|
|
:wo Detach current window to its own OS window
|
|
:wot Move current pane to a new tab
|
|
:t New tab
|
|
:tl Set tab title
|
|
:tw Set window title
|
|
:twk Rename workspace (WezTerm only)
|
|
:tp Focus previous tab
|
|
:tn Focus next tab
|
|
:tgk New tab at \(ti/.config/kitty
|
|
:tgn New tab at \(ti/.config/nvim
|
|
:tgf New tab at \(ti/.config/fish
|
|
:tgh New tab at \(ti
|
|
:tgcz New tab at \(ti/.local/share/chezmoi
|
|
:tgcm New tab at \(ti/.config/chezmoi
|
|
:tgp New tab at \(ti/projects
|
|
:tgr New tab at / (root)
|
|
:wgk New OS window at \(ti/.config/kitty
|
|
:wgn New OS window at \(ti/.config/nvim
|
|
:wgf New OS window at \(ti/.config/fish
|
|
:wgh New OS window at \(ti
|
|
:wgzd New OS window at \(ti/.local/share/chezmoi
|
|
:wgcz New OS window at \(ti/.config/chezmoi
|
|
:wgp New OS window at \(ti/projects
|
|
:wgr New OS window at / (root)
|
|
:wvgk Split bottom at \(ti/.config/kitty
|
|
:wvgn Split bottom at \(ti/.config/nvim
|
|
:wvgf Split bottom at \(ti/.config/fish
|
|
:wvgh Split bottom at \(ti
|
|
:wvgcz Split bottom at \(ti/.local/share/chezmoi
|
|
:wvgcm Split bottom at \(ti/.config/chezmoi
|
|
:wvgp Split bottom at \(ti/projects
|
|
:wvgr Split bottom at / (root)
|
|
:whgk Split right at \(ti/.config/kitty
|
|
:whgn Split right at \(ti/.config/nvim
|
|
:whgf Split right at \(ti/.config/fish
|
|
:whgh Split right at \(ti
|
|
:whgcz Split right at \(ti/.local/share/chezmoi
|
|
:whgcm Split right at \(ti/.config/chezmoi
|
|
:whgp Split right at \(ti/projects
|
|
:whgr Split right at / (root)
|
|
:cdk cd \(ti/.config/kitty
|
|
:cdkn cd \(ti/.config/kitty; nvim
|
|
:cdn cd \(ti/.config/nvim
|
|
:cdnn cd \(ti/.config/nvim; nvim
|
|
:cdf cd \(ti/.config/fish
|
|
:cdfn cd \(ti/.config/fish; nvim
|
|
:cdh cd \(ti
|
|
:cdhn cd \(ti; nvim
|
|
:cdcz cd \(ti/.local/share/chezmoi
|
|
:cdczn cd \(ti/.local/share/chezmoi; nvim
|
|
:cdcm cd \(ti/.config/chezmoi
|
|
:cdcmn cd \(ti/.config/chezmoi; nvim
|
|
:cdp cd \(ti/projects/...
|
|
:cdpn cd \(ti/projects; nvim
|
|
:cdw cd \(ti/.config/wezterm
|
|
:cdwn cd \(ti/.config/wezterm; nvim
|
|
:sw spwin (spawn new OS window)
|
|
.EE
|
|
.SS 4.5 Chezmoi
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
cm chezmoi
|
|
cmcd chezmoi cd
|
|
czcd chezmoi cd
|
|
cdcm chezmoi cd
|
|
cdcz chezmoi cd
|
|
cme chezmoi edit
|
|
cze chezmoi edit
|
|
cmad chezmoi add
|
|
czad chezmoi add
|
|
cmap chezmoi apply
|
|
czap chezmoi apply
|
|
cmrm chezmoi forget
|
|
cmf chezmoi forget
|
|
czrm chezmoi forget
|
|
czf chezmoi forget
|
|
cmi chezmoi init
|
|
czi chezmoi init
|
|
.EE
|
|
.SS 4.6 Docker
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
dcl docker context use default
|
|
lzd ld (lazydocker)
|
|
dcls docker context ls
|
|
.EE
|
|
.SS 4.7 Systemctl
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
sc systemctl
|
|
ssc sudo systemctl
|
|
scu systemctl \-\-user
|
|
st systemctl status
|
|
scs systemctl start
|
|
scr systemctl restart
|
|
ssct sudo systemctl status
|
|
sscs sudo systemctl start
|
|
sscr sudo systemctl restart
|
|
.EE
|
|
.SS 4.8 AI Assistants
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
v antigravity\-ide
|
|
s wezterm ssh (WezTerm only)
|
|
ag agy
|
|
ag. agy .
|
|
.EE
|
|
.SS 4.9 History Expansion
|
|
Bash\-style history expansions trigger on Space or Enter.
|
|
Some are implemented as abbreviations (e.g.\ \f[CR]!*\f[R]), while
|
|
others (\f[CR]!!\f[R], \f[CR]!$\f[R], \f[CR]!.\f[R]) are implemented as
|
|
keybindings, but they all serve the same purpose.
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
!\(ha Expand to the first argument of the previous command
|
|
!* Expand to all arguments of the previous command
|
|
\(haold\(hanew\(ha Interactive typo substitution (replace \(aqold\(aq with \(aqnew\(aq in previous command)
|
|
!string Expand to the most recent command starting with \(aqstring\(aq
|
|
!?string? Expand to the most recent command containing \(aqstring\(aq
|
|
!\-n Expand to the nth\-previous command
|
|
!! Expand to the previous command
|
|
!$ Expand to the last argument of the previous command
|
|
!. Expand .. to ../.. and so on
|
|
.EE
|
|
.SS 4.10 Miscellaneous
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
sudu sudo \-s
|
|
kt kitty (Kitty only)
|
|
c cat
|
|
/exit exit
|
|
speedtest\-fast fast\-cli
|
|
bl bd list
|
|
bs bd sync
|
|
bC bd create \-\-title
|
|
bsh bd show
|
|
lb lazybeads
|
|
open\-repo repo\-open
|
|
url\-open open\-url
|
|
.EE
|
|
.SS 4.11 Shell Aliases
|
|
These aliases are defined in \f[CR]conf.d/tricks.fish\f[R] via alias
|
|
(which creates Fish functions).
|
|
They are active in all interactive sessions.
|
|
.IP
|
|
.EX
|
|
Abbreviation Description
|
|
───────────────────────────────────────────────────────────────────
|
|
\&.. cd ..
|
|
\&... cd ../..
|
|
\&.... cd ../../..
|
|
\&..... cd ../../../..
|
|
\&...... cd ../../../../..
|
|
dir dir \-\-color=auto
|
|
vdir vdir \-\-color=auto
|
|
grep grep \-\-color=auto
|
|
fgrep fgrep \-\-color=auto
|
|
egrep egrep \-\-color=auto
|
|
cp cp \-i
|
|
mv mv \-i
|
|
tarnow tar \-acf
|
|
untar tar \-zxvf
|
|
tb nc termbin.com 9999
|
|
jctl journalctl \-p 3 \-xb
|
|
.EE
|
|
.SH 5. FUNCTIONS REFERENCE
|
|
.SS 5.1 File and Directory
|
|
.SS cat
|
|
.IP
|
|
.EX
|
|
Synopsis: cat [args...]
|
|
|
|
Enhanced cat replacement. Wraps bat for files, giving syntax highlighting
|
|
and line numbers; passes directories to ls; falls back to raw cat for
|
|
ANSI\-colored log files, and finally to /usr/bin/cat if bat is not
|
|
installed.
|
|
|
|
Arguments:
|
|
args... Files or directories to display
|
|
|
|
Example:
|
|
cat README.md
|
|
cat \(ti/projects/myapp
|
|
.EE
|
|
.SS copy
|
|
.IP
|
|
.EX
|
|
Synopsis: copy <source> <dest>
|
|
|
|
Wrapper for cp that strips trailing slashes from source directories,
|
|
preventing unwanted nested copies when the destination already exists.
|
|
|
|
Arguments:
|
|
source Source file or directory
|
|
dest Destination path
|
|
|
|
Example:
|
|
copy ./mydir/ \(ti/backup
|
|
copy ./mydir/ \(ti/backup # copies mydir INTO backup, not backup/mydir/
|
|
.EE
|
|
.SS du
|
|
.IP
|
|
.EX
|
|
Synopsis: du [\-\-disk|\-\-dir|\-\-dua] [args...]
|
|
|
|
Smart disk\-usage dispatcher. Without flags, routes to the most appropriate
|
|
tool by context; explicit flags force one. Falls back to system du when the
|
|
preferred tool is not installed.
|
|
|
|
Arguments:
|
|
\-\-disk Force duf (disk\-level free/used overview)
|
|
\-\-dir Force dust (per\-directory tree breakdown)
|
|
\-\-dua Force dua (fast interactive space analyzer)
|
|
args... Files/directories or flags forwarded to the selected tool
|
|
|
|
Example:
|
|
du \(ti/Downloads
|
|
du \-\-disk
|
|
.EE
|
|
.SS dusize
|
|
.IP
|
|
.EX
|
|
Synopsis: dusize [dir]
|
|
|
|
Shows a human\-readable disk usage summary using du \-sh. Defaults to the
|
|
current directory if no argument is given.
|
|
|
|
Arguments:
|
|
dir Directory to summarize (defaults to current directory)
|
|
|
|
Example:
|
|
dusize \(ti/Downloads
|
|
dusize \(ti/Videos
|
|
.EE
|
|
.SS lD
|
|
.IP
|
|
.EX
|
|
Synopsis: lD [args...]
|
|
|
|
Lists only directories in long format with icons and hyperlinks. Uses eza,
|
|
falls back to lsd, then to system ls.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
lD \(ti/projects
|
|
.EE
|
|
.SS ls
|
|
.IP
|
|
.EX
|
|
Synopsis: ls [args...]
|
|
|
|
Lists all files in long format with icons and hyperlinks. Uses eza,
|
|
falls back to lsd, then to system ls.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
ls \(ti/projects
|
|
ls
|
|
ls \-a \(ti/projects
|
|
.EE
|
|
.SS lsr
|
|
.IP
|
|
.EX
|
|
Synopsis: lsr [args...]
|
|
|
|
Lists files sorted by modification time in reverse (oldest first), one
|
|
per line with icons. Uses eza, falls back to lsd, then to system ls.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
lsr \(ti/projects
|
|
.EE
|
|
.SS lss
|
|
.IP
|
|
.EX
|
|
Synopsis: lss [args...]
|
|
|
|
Lists all files sorted by size in long format with gradient color scaling.
|
|
Uses eza, falls back to lsd, then to system ls.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
lss \(ti/downloads
|
|
.EE
|
|
.SS lstree
|
|
.IP
|
|
.EX
|
|
Synopsis: lstree [args...]
|
|
|
|
Displays a full recursive tree of the current directory with icons.
|
|
Uses eza, falls back to lsd, then to system ls \-R.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
lstree \(ti/projects/myapp
|
|
.EE
|
|
.SS lt
|
|
.IP
|
|
.EX
|
|
Synopsis: lt [args...]
|
|
|
|
Displays a directory tree limited to depth 2 with icons. Uses eza,
|
|
falls back to lsd, then to system ls \-R.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
lt \(ti/projects
|
|
.EE
|
|
.SS ltr
|
|
.IP
|
|
.EX
|
|
Synopsis: ltr [args...]
|
|
|
|
Lists all files sorted by modification time in reverse (oldest first) in
|
|
long format with age\-based gradient color scaling. Uses eza, falls back
|
|
to lsd, then to system ls.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
ltr \(ti/projects
|
|
.EE
|
|
.SS lx
|
|
.IP
|
|
.EX
|
|
Synopsis: lx [args...]
|
|
|
|
Lists all files sorted by file extension in long format with icons. Uses
|
|
eza, falls back to lsd, then to system ls \-lX.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the listing command
|
|
|
|
Example:
|
|
lx \(ti/projects
|
|
.EE
|
|
.SS mkcd
|
|
.IP
|
|
.EX
|
|
Synopsis: mkcd [\-s | \-\-silent] <dir>
|
|
|
|
Creates a directory (including any missing parent directories) and
|
|
immediately changes into it. Prints a tree of created directories by
|
|
default, or suppresses output with \-s. Delegates creation to
|
|
_fish_mkdir_p.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show usage help
|
|
\-s, \-\-silent Suppress directory creation output
|
|
<dir> Directory to create and enter
|
|
|
|
Exit Status:
|
|
0 Directory created (or already existed) and entered successfully
|
|
1 Directory creation or cd failed
|
|
|
|
Example:
|
|
mkcd \(ti/projects/myapp
|
|
mkcd \(ti/projects/newapp/src
|
|
.EE
|
|
.SS mkdir
|
|
.IP
|
|
.EX
|
|
Synopsis: mkdir [args...]
|
|
|
|
Interactive wrapper around mkdir that calls _fish_mkdir_p for each
|
|
directory argument to display created path components. Falls back to
|
|
command mkdir \-p when flags (e.g. \-m 755) are present, and to plain
|
|
command mkdir in non\-interactive contexts.
|
|
|
|
Arguments:
|
|
args... Directories to create, or flags passed through to command mkdir
|
|
|
|
Example:
|
|
mkdir \(ti/projects/myapp/src
|
|
.EE
|
|
.SS mv
|
|
.IP
|
|
.EX
|
|
Synopsis: mv [args...]
|
|
|
|
Wraps mv to automatically collapse nested directories of the same name.
|
|
When extracting archives results in redundant structures (e.g.,
|
|
themes/themes/), calling mv themes/themes themes will gracefully
|
|
move the inner contents up one level and remove the empty outer shell.
|
|
|
|
Opinionated component (C1): when disabled via __fish_config_op_aliases,
|
|
behaves exactly like bare command mv.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to standard mv
|
|
|
|
Exit Status:
|
|
0 Operation succeeded
|
|
>0 Standard mv failure, or failed to collapse directory
|
|
|
|
Example:
|
|
mv \(ti/.config/btop/themes/themes \(ti/.config/btop/themes
|
|
.EE
|
|
.SS poke
|
|
.IP
|
|
.EX
|
|
Synopsis: poke <file> [file...]
|
|
|
|
Creates files using touch, automatically creating any missing parent
|
|
directories via _fish_mkdir_p with tree output.
|
|
|
|
Arguments:
|
|
file One or more file paths to create
|
|
|
|
Exit Status:
|
|
0 Files created
|
|
1 No file argument provided
|
|
|
|
Example:
|
|
poke \(ti/projects/new/src/main.fish
|
|
.EE
|
|
.SS rg
|
|
.IP
|
|
.EX
|
|
Synopsis: rg [args...]
|
|
|
|
Wraps ripgrep with \-\-hyperlink\-format=kitty when running inside Kitty
|
|
terminal, enabling clickable file links in search results. Falls back
|
|
to plain rg on other terminals.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to ripgrep
|
|
|
|
Example:
|
|
rg \(dqTODO\(dq src/
|
|
rg \(dqfish_greeting\(dq \(ti/.config/fish/
|
|
rg \-l \(dqTODO\(dq \(ti/projects/myapp
|
|
.EE
|
|
.SS rm
|
|
.IP
|
|
.EX
|
|
Synopsis: rm [\-e [options] | \-S | args...]
|
|
|
|
Enhanced rm that routes deletions through trash when safe. With no
|
|
arguments, lists current trash contents. \-e/\-\-empty empties the trash
|
|
(with optional trash\-empty sub\-arguments). \-S/\-\-secure permanently
|
|
deletes via rm \-rf and triggers fstrim. Plain paths and \-r/\-R are sent
|
|
to trash put; any other flags fall back to system rm.
|
|
|
|
Opinionated component (C1): when disabled via __fish_config_op_aliases
|
|
(or the __fish_config_opinionated master), behaves exactly like bare
|
|
command rm \(em no wrapper, no trash, no trapping.
|
|
|
|
Arguments:
|
|
(none) List current trash contents
|
|
\-e, \-\-empty [opts] Empty the trash; opts forwarded to trash empty
|
|
\-S, \-\-secure Permanently delete targets and run fstrim (irreversible)
|
|
\-r, \-R, \-\-recursive Forwarded to trash put alongside path arguments
|
|
args... Files or paths to trash or remove
|
|
|
|
Exit Status:
|
|
0 Operation succeeded
|
|
1 trash put failed or file not found
|
|
|
|
Notes:
|
|
Falls back to /usr/bin/rm when trash is unavailable.
|
|
|
|
Example:
|
|
rm file.txt
|
|
rm \-e
|
|
rm \-S sensitive_key.pem
|
|
.EE
|
|
.SS scrub
|
|
.IP
|
|
.EX
|
|
Synopsis: scrub [\-a] [\-d] [\-h]
|
|
|
|
Recursively finds and removes OS metadata, editor artifacts, compiler
|
|
garbage, and dev caches from the current directory using fd. Routes
|
|
deletions through the custom rm function, trashy, trash\-cli, or system
|
|
rm \-rf in that priority order. Aggressive mode adds node_modules, logs,
|
|
IDE directories, and AI tool artifacts.
|
|
|
|
Arguments:
|
|
\-a, \-\-aggressive Also purge node_modules, *.log, .cache, .idea, AI artifacts
|
|
\-d, \-\-dry\-run Show targets without deleting
|
|
\-h, \-\-help Show usage help
|
|
|
|
Exit Status:
|
|
0 Sweep completed (or dry run shown)
|
|
1 fd not found, or unknown argument provided
|
|
|
|
Example:
|
|
scrub
|
|
scrub \-a
|
|
scrub \-d
|
|
.EE
|
|
.SS 5.2 Navigation
|
|
.SS cdi
|
|
.IP
|
|
.EX
|
|
Synopsis: cdi [query]
|
|
|
|
Alias for zi \(em opens zoxide\(aqs interactive directory picker for jumping to
|
|
frequently\-visited directories using fzf.
|
|
|
|
Arguments:
|
|
query Optional search term to pre\-filter the directory list
|
|
|
|
Example:
|
|
cdi myproject
|
|
.EE
|
|
.SS clone
|
|
.IP
|
|
.EX
|
|
Synopsis: clone [args...]
|
|
|
|
Alias for clone\-in\-kitty that clones a repository into a new Kitty terminal
|
|
window. Only works inside the Kitty terminal.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to clone\-in\-kitty (typically a repo URL)
|
|
|
|
Exit Status:
|
|
0 Repository cloned
|
|
1 Not running inside Kitty terminal
|
|
|
|
Example:
|
|
clone https://github.com/user/repo.git
|
|
.EE
|
|
.SS clonet
|
|
.IP
|
|
.EX
|
|
Synopsis: clonet [args...]
|
|
|
|
Alias for clone\-in\-kitty \-\-type=tab that clones a repository into a new
|
|
Kitty terminal tab. Only works inside the Kitty terminal.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to clone\-in\-kitty (typically a repo URL)
|
|
|
|
Exit Status:
|
|
0 Repository cloned
|
|
1 Not running inside Kitty terminal
|
|
|
|
Example:
|
|
clonet https://github.com/user/repo.git
|
|
.EE
|
|
.SS 5.3 Editors and Viewers
|
|
.SS edit
|
|
.IP
|
|
.EX
|
|
Synopsis: edit [\-V|\-t] [\-e EDITOR] [\-c] [\-x TEXT] [\-n] [\-v|\-s] [FILE...]
|
|
|
|
Opens files in a text editor, choosing a terminal or GUI editor and
|
|
resolving a rich chain of fallbacks. With no \-\-visual/\-\-terminal flag the
|
|
mode is auto\-detected: interactive terminals get the terminal editor
|
|
($EDITOR), while detached invocations (desktop shortcuts) get the GUI
|
|
editor ($VISUAL). Clipboard contents and literal strings can be opened as
|
|
throwaway temp files. Editor output is suppressed unless \-\-verbose.
|
|
|
|
GUI fallback chain: zed → antigravity\-ide → code → kate → kwrite →
|
|
gnome\-text\-editor → gedit
|
|
Terminal fallback chain: nvim → vim → micro → nano → vi
|
|
|
|
Arguments:
|
|
FILE... Files to open (any number)
|
|
\-V, \-\-visual Force the GUI editor ($VISUAL or fallbacks)
|
|
\-t, \-\-terminal Force the terminal editor ($EDITOR or fallbacks)
|
|
\-e, \-\-editor=X Use a specific editor binary X
|
|
\-c, \-\-clipboard Open the clipboard contents (as a temp file)
|
|
\-x, \-\-text=STR Open STR as the contents of a new temp file
|
|
\-n, \-\-new Force a new window/instance (best\-effort, where supported)
|
|
\-v, \-\-verbose Print the launch command and let editor output through
|
|
\-s, \-\-silent Suppress all output, including the editor\(aqs
|
|
\-h, \-\-help Show this help message
|
|
|
|
Exit Status:
|
|
0 Editor launched successfully
|
|
1 Conflicting flags, no editor found, or clipboard read failed
|
|
|
|
Example:
|
|
edit notes.txt
|
|
edit \-\-visual \(ti/.config/fish/config.fish
|
|
edit \-\-terminal \-\-new todo.md
|
|
edit \-\-editor=code \-\-clipboard
|
|
edit \-\-text=\(dqhello world\(dq
|
|
.EE
|
|
.SS fc
|
|
.IP
|
|
.EX
|
|
Synopsis: fc [command_prefix]
|
|
|
|
Edits the last shell command \-\- or the most recent one matching a
|
|
prefix \-\- in $EDITOR, then executes the result. Bash\-style fc
|
|
behaviour. Falls back to vi when $EDITOR is unset, and aborts without
|
|
executing if the buffer is left empty.
|
|
|
|
Arguments:
|
|
command_prefix Search history for the newest command matching this
|
|
|
|
Exit Status:
|
|
The edited command\(aqs exit status, or a message when history lookup
|
|
found nothing.
|
|
|
|
Example:
|
|
fc
|
|
fc git
|
|
.EE
|
|
.SS less
|
|
.IP
|
|
.EX
|
|
Synopsis: less [args...]
|
|
|
|
Pager wrapper that tries $PAGER, then ov, then less, then more, then cat
|
|
as fallbacks in that order.
|
|
|
|
Arguments:
|
|
args... Files or options forwarded to the pager
|
|
|
|
Example:
|
|
less /var/log/syslog
|
|
.EE
|
|
.SS rawfish
|
|
.IP
|
|
.EX
|
|
Synopsis: rawfish [args...]
|
|
|
|
Launches a Fish shell with NO_TMUX=1 set, bypassing any tmux
|
|
auto\-attach or session management hooks.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to fish
|
|
|
|
Example:
|
|
rawfish
|
|
.EE
|
|
.SS view
|
|
.IP
|
|
.EX
|
|
Synopsis: view [args...]
|
|
|
|
Opens files in nvim read\-only mode (\-R). Falls back to less if nvim
|
|
is not installed.
|
|
|
|
Arguments:
|
|
args... Files or options forwarded to nvim \-R or less
|
|
|
|
Example:
|
|
view /etc/fstab
|
|
.EE
|
|
.SS 5.4 Git and Version Control
|
|
.SS auto\-pull
|
|
.IP
|
|
.EX
|
|
Synopsis: auto\-pull [list]
|
|
auto\-pull add [PATH]
|
|
auto\-pull remove <NAME|PATH>
|
|
auto\-pull status
|
|
|
|
Manages the auto\-pull registry: the list of repositories that are
|
|
background fast\-forwarded when you enter them (see conf.d/auto\-pull.fish
|
|
and _auto_pull_sync). The fish\-config repo is always covered as a baseline
|
|
and does not need to be added. The registry is a plain text file, one
|
|
absolute git\-toplevel path per line, stored machine\-locally at
|
|
$__fish_user_dots_path/auto\-pull.list (defaults to
|
|
\(ti/.config/.user\-dots/fish/auto\-pull.list) and never committed.
|
|
|
|
Registry management works regardless of the C2 auto\-execution guard; only
|
|
the background sync itself is gated by __fish_config_op_autoexec.
|
|
|
|
Arguments:
|
|
list Show registered repos (default when no subcommand given)
|
|
add [PATH] Register PATH\(aqs git root; defaults to the current repo
|
|
remove <NAME|PATH> Unregister by basename or exact path
|
|
status Show enabled/disabled state, repo count, and registry path
|
|
\-h, \-\-help Show this help message
|
|
|
|
Exit Status:
|
|
0 Subcommand succeeded
|
|
1 Bad usage, target is not a git repo, or target not registered
|
|
|
|
Example:
|
|
cd \(ti/src/qmk_firmware; and auto\-pull add
|
|
auto\-pull add \(ti/work/api
|
|
auto\-pull list
|
|
auto\-pull remove qmk_firmware
|
|
.EE
|
|
.SS branch
|
|
.IP
|
|
.EX
|
|
Synopsis: branch <branch_name>
|
|
|
|
Switches to a local git branch, creating it if it does not already
|
|
exist. Extra arguments are forwarded to git checkout.
|
|
|
|
Arguments:
|
|
branch_name Branch to switch to or create
|
|
|
|
Exit Status:
|
|
0 Branch checked out or created
|
|
1 Not inside a git work tree
|
|
|
|
Example:
|
|
branch feature/new\-ui
|
|
.EE
|
|
.SS gi
|
|
.IP
|
|
.EX
|
|
Synopsis: gi [\-h] [\-b] [\-p] [\-s] [\-l] [targets...]
|
|
|
|
Generates .gitignore content by querying the gitignore.io API. Appends
|
|
results to the repository\(aqs .gitignore with MD5\-based deduplication \(em
|
|
patterns already present are not re\-appended \(em or prints to stdout with
|
|
\-s. Supports generic boilerplate and interactive prompt modes.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
\-d, \-\-description Show the function description
|
|
\-l, \-\-list List all supported targets from the API
|
|
\-b, \-\-boilerplate Append boilerplate from $GITIGNORE_BOILERPLATE
|
|
\-p, \-\-prompt Prompt for patterns to append
|
|
\-s, \-\-stdout Print API output to stdout instead of .gitignore
|
|
targets Comma\- or space\-separated list of language/tool names
|
|
|
|
Exit Status:
|
|
0 Patterns appended, or resolved with \-s/\-\-stdout or \-l/\-\-list
|
|
1 Not in a git repository or API fetch failed
|
|
|
|
Returns:
|
|
With \-s/\-\-stdout, the fetched .gitignore pattern text, printed to stdout.
|
|
With \-l/\-\-list, the supported target list, printed to stdout.
|
|
|
|
Example:
|
|
gi python,venv
|
|
gi \-b \-p
|
|
gi \-s node > .gitignore
|
|
.EE
|
|
.SS git\-clean
|
|
.IP
|
|
.EX
|
|
Synopsis: git\-clean [\-h] [\-f]
|
|
|
|
Fetches and prunes the remote, fast\-forwards the current branch, and
|
|
deletes local branches whose tracking remote has been deleted. Switches to
|
|
main/master automatically if the current branch is orphaned.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
\-f, \-\-force Force\-delete unmerged orphaned branches (git branch \-D)
|
|
|
|
Exit Status:
|
|
0 Cleanup complete
|
|
1 Argument parsing failed
|
|
|
|
Example:
|
|
git\-clean \-\-force
|
|
git\-clean
|
|
.EE
|
|
.SS gitui
|
|
.IP
|
|
.EX
|
|
Synopsis: gitui [args...]
|
|
|
|
Launches gitui with the Catppuccin Frappe theme (frappe.ron), passing any
|
|
additional arguments through to the gitui command.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the gitui command
|
|
|
|
Example:
|
|
gitui
|
|
.EE
|
|
.SS gitup
|
|
.IP
|
|
.EX
|
|
Synopsis: gitup [args...]
|
|
|
|
Fetches updates from the remote and shows git status. Extra arguments
|
|
are forwarded to git fetch.
|
|
|
|
Arguments:
|
|
args... Forwarded verbatim to git fetch
|
|
|
|
Exit Status:
|
|
0 Fetch and status succeeded
|
|
1 Not inside a git work tree
|
|
|
|
Example:
|
|
gitup
|
|
gitup \-\-all
|
|
.EE
|
|
.SS hist
|
|
.IP
|
|
.EX
|
|
Synopsis: hist
|
|
|
|
Searches fish history interactively using fzf, inserts the selected command
|
|
into the command line, and copies it to the clipboard via wl\-copy.
|
|
|
|
Example:
|
|
hist
|
|
.EE
|
|
.SS 5.5 Package Management
|
|
.SS cleanup
|
|
.IP
|
|
.EX
|
|
Synopsis: cleanup
|
|
|
|
Identifies and removes Arch Linux orphan packages using pacman. Logs
|
|
package names and versions to \(ti/.removed_orphans before removal.
|
|
|
|
Example:
|
|
cleanup
|
|
.EE
|
|
.SS parur
|
|
.IP
|
|
.EX
|
|
Synopsis: parur
|
|
|
|
Presents an fzf picker of all installed packages (via pacman \-Qqs) with
|
|
pacman \-Qi previews, then removes the selected packages using paru or yay.
|
|
Arch Linux only.
|
|
|
|
Exit Status:
|
|
0 Packages removed or none selected
|
|
1 No AUR helper (paru or yay) found
|
|
|
|
Example:
|
|
parur
|
|
.EE
|
|
.SS pkg
|
|
.IP
|
|
.EX
|
|
Synopsis: pkg [\-h] [\-i|\-u] <package> [package...]
|
|
|
|
Installs or removes packages using the system\(aqs available package manager.
|
|
Supports paru, yay, pacman, apt, dnf, zypper, yum, brew, and pkg.
|
|
In auto mode (no flag), detects whether each package is installed and
|
|
toggles it \(em installing if absent, removing if present.
|
|
|
|
The package\-installed check uses the correct query for each manager:
|
|
|
|
pacman/paru/yay pacman \-Qi
|
|
apt dpkg \-s
|
|
dnf/zypper/yum rpm \-q
|
|
brew brew list
|
|
pkg pkg info
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
\-i, \-\-install Force install mode
|
|
\-u, \-\-uninstall Force uninstall mode
|
|
package One or more package names to install or remove
|
|
|
|
Exit Status:
|
|
0 Operation completed
|
|
1 No supported package manager found, unknown flag, or package operation failed
|
|
|
|
Example:
|
|
pkg firefox
|
|
pkg \-i ripgrep fd\-find
|
|
pkg \-u cowsay
|
|
.EE
|
|
.SS search
|
|
.IP
|
|
.EX
|
|
Synopsis: search [args...]
|
|
|
|
Delegates to paru or yay for interactive AUR package search and
|
|
installation. Falls back to yay if paru is not installed. Arch Linux only.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to paru or yay
|
|
|
|
Exit Status:
|
|
0 AUR helper ran successfully
|
|
1 No AUR helper (paru or yay) found
|
|
|
|
Example:
|
|
search neovim
|
|
.EE
|
|
.SS upgrade
|
|
.IP
|
|
.EX
|
|
Synopsis: upgrade
|
|
|
|
Runs a full system upgrade via paru or yay with \-\-noconfirm. Falls
|
|
back to yay if paru is not installed. Arch Linux only.
|
|
|
|
Exit Status:
|
|
0 Upgrade completed successfully
|
|
1 No AUR helper (paru or yay) found
|
|
|
|
Example:
|
|
upgrade
|
|
.EE
|
|
.SS 5.6 Dependency Management
|
|
.SS check_fish_deps
|
|
.IP
|
|
.EX
|
|
Synopsis: check_fish_deps
|
|
|
|
Backwards\-compatibility wrapper that delegates to fish\-deps status to
|
|
report which fish shell dependencies are installed or missing.
|
|
|
|
Example:
|
|
check_fish_deps
|
|
.EE
|
|
.SS fish\-deps
|
|
.IP
|
|
.EX
|
|
Synopsis: fish\-deps [status|install|update|sync] [\-\-optional] [\-\-terminals] [\-\-all]
|
|
|
|
Unified command for managing all tools this configuration depends on,
|
|
dispatching to subcommand handlers. Defaults to status when no subcommand
|
|
is given.
|
|
|
|
Install method priority (highest to lowest):
|
|
1. git+cargo source build (fish shell itself)
|
|
2. cargo (Rust tools \(em gets latest crate version)
|
|
3. system PM (paru/apt/brew/etc.)
|
|
4. git clone (fzf)
|
|
5. curl installer (starship, fisher, uv)
|
|
|
|
When multiple methods are available you are prompted to choose.
|
|
|
|
Dependencies are grouped into five tiers:
|
|
|
|
Required fish, fzf
|
|
Recommended cargo, starship, uv, zoxide, direnv, paru, yay,
|
|
eza, lsd, bat, ov, ripgrep, trash, python3
|
|
Optional btop, dust, duf, prettyping, go, lazygit,
|
|
lazydocker, docker, yt\-dlp, screen \(em single\-purpose
|
|
wrapper conveniences that only matter if you
|
|
already use that tool; skipped by install/sync
|
|
unless \-\-optional (or \-\-all) is passed
|
|
Terminal Emulators kitty, wezterm \(em only matter if one of them is
|
|
your actual terminal; skipped by install/sync
|
|
unless \-\-terminals (or \-\-all) is passed
|
|
Integrations wakatime, tailscale
|
|
|
|
Arguments:
|
|
status Report installed/missing deps (default)
|
|
install Install missing deps interactively
|
|
update Update all installed deps
|
|
sync Install missing deps, then update all
|
|
\-\-optional With install/sync: also offer Optional\-tier deps
|
|
\-\-terminals With install/sync: also offer Terminal\-Emulator\-tier deps
|
|
\-\-all With install/sync: shorthand for \-\-optional \-\-terminals
|
|
|
|
Exit Status:
|
|
0 Subcommand completed
|
|
1 Unknown subcommand
|
|
|
|
Example:
|
|
fish\-deps sync
|
|
fish\-deps
|
|
fish\-deps install
|
|
fish\-deps install \-\-optional
|
|
fish\-deps install \-\-terminals
|
|
fish\-deps install \-\-all
|
|
fish\-deps update
|
|
.EE
|
|
.SS fzf\-update
|
|
.IP
|
|
.EX
|
|
Synopsis: fzf\-update
|
|
|
|
Installs or upgrades fzf from git HEAD into \(ti/.fzf. Pulls the latest
|
|
changes if \(ti/.fzf already exists, or clones the repository if not.
|
|
|
|
Example:
|
|
fzf\-update
|
|
.EE
|
|
.SS 5.7 System and Monitoring
|
|
.SS limine\-edit
|
|
.IP
|
|
.EX
|
|
Synopsis: limine\-edit
|
|
|
|
Opens /boot/limine.conf in sudoedit, then re\-enrolls the config hash,
|
|
runs CachyOS boot hooks (limine\-mkinitcpio), and re\-signs all Secure Boot
|
|
files tracked by sbctl. Combines the edit and sign steps into a single
|
|
command.
|
|
|
|
Example:
|
|
limine\-edit
|
|
.EE
|
|
.SS lock
|
|
.IP
|
|
.EX
|
|
Synopsis: lock
|
|
|
|
Locks the current desktop session using loginctl lock\-session.
|
|
|
|
Example:
|
|
lock
|
|
.EE
|
|
.SS ports
|
|
.IP
|
|
.EX
|
|
Synopsis: ports
|
|
|
|
Lists all active TCP listeners on the system using lsof, showing
|
|
port numbers and addresses without hostname resolution.
|
|
|
|
Example:
|
|
ports
|
|
.EE
|
|
.SS sbver
|
|
.IP
|
|
.EX
|
|
Synopsis: sbver [\-\-brief]
|
|
|
|
Verifies Secure Boot signatures on all EFI binaries tracked by sbctl,
|
|
filtering out \(dqinvalid PE header\(dq noise. Color\-codes each file as
|
|
verified (green ✓) or unsigned (red ✗) and prints a final summary
|
|
count.
|
|
|
|
Arguments:
|
|
\-\-brief Suppress per\-file output; show only the final summary
|
|
|
|
Exit Status:
|
|
0 All binaries verified (or summary shown)
|
|
1 sbctl is not installed
|
|
|
|
Example:
|
|
sbver
|
|
sbver \-\-brief
|
|
.EE
|
|
.SS screensleep
|
|
.IP
|
|
.EX
|
|
Synopsis: screensleep
|
|
|
|
Turns off the display after a 1\-second delay by invoking the KDE
|
|
PowerDevil \(dqTurn Off Screen\(dq global shortcut via busctl.
|
|
|
|
Example:
|
|
screensleep
|
|
.EE
|
|
.SS sudo\-toggle
|
|
.IP
|
|
.EX
|
|
Synopsis: sudo\-toggle
|
|
|
|
Toggles the sudo NOPASSWD rule on and off via
|
|
/etc/sudoers.d/nofail\-toggle. Useful for automated tasks that would
|
|
otherwise require a password entry. Clears the sudo credential cache
|
|
when re\-enabling, so the lockdown takes effect immediately.
|
|
|
|
Exit Status:
|
|
0 Rule toggled
|
|
|
|
Example:
|
|
sudo\-toggle
|
|
.EE
|
|
.SS swapstat
|
|
.IP
|
|
.EX
|
|
Synopsis: swapstat
|
|
|
|
Displays a colorized memory report showing kernel swappiness,
|
|
zRAM compression ratio, zRAM device details (via zramctl), and
|
|
active swap priority (via swapon).
|
|
|
|
Example:
|
|
swapstat
|
|
.EE
|
|
.SS top
|
|
.IP
|
|
.EX
|
|
Synopsis: top [args...]
|
|
|
|
Wraps btop as a modern replacement for top. Falls back to system top
|
|
if btop is not installed.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to btop or system top
|
|
|
|
Example:
|
|
top
|
|
.EE
|
|
.SS 5.8 Terminal Management
|
|
.SS bkg
|
|
.IP
|
|
.EX
|
|
Synopsis: bkg <command> [args...]
|
|
|
|
Launches a command in the background, fully detached from the terminal
|
|
using nohup. All stdout and stderr output is discarded. Simpler than
|
|
detach; no \-\-version flag.
|
|
|
|
Arguments:
|
|
command The command to run detached
|
|
args... Additional arguments for the command
|
|
|
|
Exit Status:
|
|
0 Command launched successfully
|
|
1 No command provided
|
|
|
|
Example:
|
|
bkg firefox
|
|
.EE
|
|
.SS detach
|
|
.IP
|
|
.EX
|
|
Synopsis: detach [\-h] [\-\-version] <command> [args...]
|
|
|
|
Runs a command in the background using nohup, fully detached from the
|
|
terminal with stdout/stderr discarded. The command survives the current
|
|
session.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
\-\-version Show version information
|
|
command The command to run detached
|
|
args... Additional arguments for the command
|
|
|
|
Exit Status:
|
|
0 Command launched or help/version shown
|
|
1 No command provided or unknown option
|
|
|
|
Example:
|
|
detach rsync \-a ./data remote:/backup/
|
|
.EE
|
|
.SS fish_mode_prompt
|
|
.IP
|
|
.EX
|
|
Synopsis: fish_mode_prompt
|
|
|
|
Empty override. Suppresses fish\(aqs built\-in vi\-mode prefix ([N]/[I]/etc.)
|
|
that would prepend to the prompt line and break the two\-line nim layout.
|
|
Vi\-mode display is handled inside fish_prompt itself.
|
|
|
|
Exit Status:
|
|
0 Always (function body is empty)
|
|
|
|
Example:
|
|
# Rendered automatically by fish; not called directly.
|
|
.EE
|
|
.SS fish_prompt
|
|
.IP
|
|
.EX
|
|
Synopsis: fish_prompt
|
|
|
|
Catppuccin Mocha fallback prompt (nim\-style, two\-line). Active whenever
|
|
the starship prompt is not available \(em either starship is not installed or
|
|
C3 overrides are disabled. Has no external dependencies; uses only fish\-provided functions
|
|
(set_color, fish_git_prompt, prompt_pwd, prompt_hostname).
|
|
|
|
Exit Status:
|
|
0 Always
|
|
|
|
Returns:
|
|
The rendered two\-line prompt, printed to stdout
|
|
|
|
Example:
|
|
# Rendered automatically by fish; not called directly.
|
|
.EE
|
|
.SS fish_right_prompt
|
|
.IP
|
|
.EX
|
|
Synopsis: fish_right_prompt
|
|
|
|
Renders the right\-side prompt. Always shows a dim timestamp. When the last
|
|
command failed, prefixes it with a red ✘ and the exit code. When docker
|
|
and starship are both installed and C3 overrides are enabled, also shows
|
|
the active Docker context (if non\-default).
|
|
|
|
Exit Status:
|
|
0 Always
|
|
|
|
Example:
|
|
# Rendered automatically by fish; not called directly.
|
|
.EE
|
|
.SS jobrunner
|
|
.IP
|
|
.EX
|
|
Synopsis: jobrunner [\-t <tool>] [<subcommand>] [<name>] [<command>...]
|
|
jr [\-t <tool>] [<subcommand>] [<name>] [<command>...]
|
|
|
|
Runs, lists, inspects, re\-attaches to, and terminates named background
|
|
jobs using tmux or GNU screen as the process engine. Unlike bkg and
|
|
detach, which discard output, a jobrunner job keeps a live terminal you
|
|
can return to later \(em it survives closing the shell, and attach
|
|
restores it in any subsequent session.
|
|
Run and manage named background jobs. Jobs are detached from the shell
|
|
and backed by tmux (preferred) or GNU screen.
|
|
|
|
If the job name is omitted when starting a new job (e.g. jobrunner sleep 1),
|
|
a memorable, random name (like sleepy\-badger) will be generated.
|
|
|
|
Exit Status:
|
|
0 Command succeeded, or no jobs are running
|
|
1 Invalid arguments, or the named job does not exist
|
|
127 neither tmux nor screen is installed
|
|
|
|
Notes:
|
|
Detach from an attached job with Ctrl\-A then D; the job keeps running.
|
|
Commands are executed directly rather than through a shell, so pipes and
|
|
redirections must be wrapped explicitly, e.g.
|
|
jobrunner run sync fish \-c \(aqa | b\(aq.
|
|
|
|
Example:
|
|
jobrunner run \-n build make \-j8
|
|
jobrunner sleep 1000
|
|
jobrunner \-t screen run \-n backup rsync \-a ./data remote:/backup/
|
|
jobrunner list
|
|
jobrunner logs build
|
|
jobrunner build
|
|
jobrunner kill build
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]tmux\f[R], \f[CR]screen\f[R],
|
|
\f[CR]__jobrunner_sessions\f[R]
|
|
.PP
|
|
\f[B]Used by:\f[R] \f[CR]jr\f[R]
|
|
.SS jr
|
|
.IP
|
|
.EX
|
|
Synopsis: jr [<subcommand>] [<name>] [<command>...]
|
|
|
|
Shorthand for jobrunner. Accepts the same subcommands, flags, and
|
|
shorthands, and inherits its completions.
|
|
|
|
Arguments:
|
|
See jobrunner \-\-help for the full argument reference.
|
|
|
|
Exit Status:
|
|
Same as jobrunner.
|
|
|
|
Example:
|
|
jr run build make \-j8
|
|
jr list
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]jobrunner\f[R]
|
|
.SS split
|
|
.IP
|
|
.EX
|
|
Synopsis: split [\-h | \-v] [command...]
|
|
|
|
Opens a new pane split in Kitty or WezTerm, optionally running a
|
|
command in it. Defaults to a horizontal (bottom) split. The new pane
|
|
inherits the current working directory.
|
|
|
|
Arguments:
|
|
\-h, \-\-horizontal Open a horizontal split (default)
|
|
\-v, \-\-vertical Open a vertical split
|
|
command... Command to run in the new pane; opens a bare fish
|
|
shell if omitted
|
|
|
|
Exit Status:
|
|
0 Pane opened successfully
|
|
1 Not running inside Kitty or WezTerm
|
|
|
|
Example:
|
|
split
|
|
split \-v nvim README.md
|
|
.EE
|
|
.SS spwin
|
|
.IP
|
|
.EX
|
|
Synopsis: spwin [args...]
|
|
|
|
Spawns a new terminal OS window in Kitty (via spawn\-window.sh if
|
|
present, otherwise kitty \(at launch) or WezTerm (via wezterm cli spawn).
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the spawn command
|
|
|
|
Exit Status:
|
|
0 Window opened successfully
|
|
1 Not running inside Kitty or WezTerm
|
|
|
|
Example:
|
|
spwin
|
|
.EE
|
|
.SS ssh
|
|
.IP
|
|
.EX
|
|
Synopsis: ssh [args...]
|
|
|
|
Wraps ssh with kitten ssh inside Kitty terminal for better terminal
|
|
integration (terminfo forwarding, multiplexing, copy/paste support).
|
|
Falls back to system ssh on
|
|
other terminals.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to kitten ssh or system ssh
|
|
|
|
Example:
|
|
ssh user\(athost
|
|
.EE
|
|
.SS tab
|
|
.IP
|
|
.EX
|
|
Synopsis: tab [args...]
|
|
|
|
Opens a new tab in Kitty, WezTerm, or Konsole using the current
|
|
working directory (or $cdto if set). Arguments are forwarded to the
|
|
terminal\(aqs tab\-open command.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the terminal\(aqs launch command
|
|
|
|
Exit Status:
|
|
0 Tab opened successfully
|
|
1 No supported terminal found
|
|
|
|
Example:
|
|
tab
|
|
.EE
|
|
.SS 5.9 Clipboard
|
|
.SS p
|
|
.IP
|
|
.EX
|
|
Synopsis: p [args...]
|
|
|
|
Outputs clipboard contents to stdout. Uses wl\-paste on Wayland,
|
|
falls back to xclip on X11. Supports \-h/\-\-help for usage info.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show usage help
|
|
args... Arguments forwarded to the clipboard tool
|
|
|
|
Exit Status:
|
|
0 Clipboard contents read successfully
|
|
1 No supported clipboard tool found
|
|
|
|
Returns:
|
|
The clipboard contents, printed to stdout
|
|
|
|
Example:
|
|
p | grep foo
|
|
p > file.txt
|
|
.EE
|
|
.SS paste
|
|
.IP
|
|
.EX
|
|
Synopsis: paste [args...]
|
|
|
|
Outputs clipboard contents to stdout. Uses wl\-paste on Wayland,
|
|
falls back to xclip on X11.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the clipboard tool
|
|
|
|
Exit Status:
|
|
0 Clipboard contents read successfully
|
|
1 No supported clipboard tool found
|
|
|
|
Returns:
|
|
The clipboard contents, printed to stdout
|
|
|
|
Example:
|
|
paste > file.txt
|
|
.EE
|
|
.SS y
|
|
.IP
|
|
.EX
|
|
Synopsis: y [text...]
|
|
|
|
Copies text to the system clipboard using wl\-copy (Wayland) or xclip (X11).
|
|
Reads from stdin when no arguments are given.
|
|
|
|
Arguments:
|
|
text Text to copy; reads from stdin if omitted
|
|
|
|
Exit Status:
|
|
0 Text copied to clipboard
|
|
1 No clipboard provider found
|
|
|
|
Example:
|
|
y \(dqhello world\(dq
|
|
ls | y
|
|
cat file.txt | y
|
|
.EE
|
|
.SS 5.10 Network
|
|
.SS fast
|
|
.IP
|
|
.EX
|
|
Synopsis: fast
|
|
|
|
Displays a styled message indicating that the fast command is unavailable
|
|
and suggests using fast\-cli instead.
|
|
|
|
Example:
|
|
fast
|
|
.EE
|
|
.SS fast\-cli
|
|
.IP
|
|
.EX
|
|
Synopsis: fast\-cli [args...]
|
|
|
|
Runs a network speed test using the fast.com CLI tool.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the fast command
|
|
|
|
Example:
|
|
fast\-cli
|
|
.EE
|
|
.SS gip
|
|
.IP
|
|
.EX
|
|
Synopsis: gip
|
|
|
|
Fetches and prints both the public IPv4 and IPv6 addresses using
|
|
icanhazip.com. Shows \(dqNot detected\(dq for any address that times out.
|
|
|
|
Example:
|
|
gip
|
|
.EE
|
|
.SS gip4
|
|
.IP
|
|
.EX
|
|
Synopsis: gip4
|
|
|
|
Fetches and prints the machine\(aqs public IPv4 address using icanhazip.com.
|
|
|
|
Example:
|
|
gip4
|
|
.EE
|
|
.SS gip6
|
|
.IP
|
|
.EX
|
|
Synopsis: gip6
|
|
|
|
Fetches and prints the machine\(aqs public IPv6 address using icanhazip.com.
|
|
Prints an error message if IPv6 is unavailable on the current network.
|
|
|
|
Exit Status:
|
|
0 IPv6 address resolved
|
|
1 IPv6 unavailable or not supported on this network
|
|
|
|
Returns:
|
|
The machine\(aqs public IPv6 address, printed to stdout
|
|
|
|
Example:
|
|
gip6
|
|
.EE
|
|
.SS ping
|
|
.IP
|
|
.EX
|
|
Synopsis: ping [args...]
|
|
|
|
Wraps prettyping with \-\-nolegend by default for a cleaner display.
|
|
Pass \-\-legend to show the legend. Falls back to system ping if
|
|
prettyping is not installed.
|
|
|
|
Arguments:
|
|
\-\-legend Show the prettyping legend (overrides default \-\-nolegend)
|
|
args... Arguments forwarded to prettyping or system ping
|
|
|
|
Example:
|
|
ping google.com
|
|
ping \-\-legend google.com
|
|
.EE
|
|
.SS qr
|
|
.IP
|
|
.EX
|
|
Synopsis: qr [text...]
|
|
|
|
Generates a UTF\-8 QR code from the given text or from stdin if no
|
|
argument is provided. Uses qrencode locally if available, otherwise
|
|
falls back to the qrenco.de API via curl.
|
|
|
|
Arguments:
|
|
text... Text to encode; reads from stdin if omitted
|
|
|
|
Example:
|
|
qr \(dqhttps://example.com\(dq
|
|
echo \(dqhello\(dq | qr
|
|
.EE
|
|
.SS 5.11 Pager and Logging
|
|
.SS logs
|
|
.IP
|
|
.EX
|
|
Synopsis: logs [\-h] [\-c <category>]
|
|
|
|
Interactively browses terminal log files (scrollback, paru, yay) sorted
|
|
newest\-first using fzf. Supports viewing in $PAGER, editing, and deletion.
|
|
|
|
Keybindings inside the fzf browser:
|
|
Enter Open in $PAGER
|
|
Ctrl+E Open in $EDITOR
|
|
Ctrl+D Delete (with confirmation)
|
|
? Toggle keybind help overlay
|
|
|
|
Paru and yay logs open in ov with syntax highlighting and sticky section
|
|
headers. Scrollback logs open in ov with per\-command sticky prompt headers
|
|
based on OSC 133 markers.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
\-c, \-\-category cat Filter to one category: scrollback, paru, or yay
|
|
|
|
Exit Status:
|
|
0 File viewed or no file selected
|
|
1 No log files found
|
|
|
|
Example:
|
|
logs \-c paru
|
|
logs
|
|
logs \-c scrollback
|
|
.EE
|
|
.SS smart_exit
|
|
.IP
|
|
.EX
|
|
Synopsis: smart_exit [\-h] [\-n]
|
|
|
|
Closes the shell session. In Kitty, captures the terminal scrollback to a
|
|
timestamped log file in $SCROLLBACK_HISTORY_DIR before exiting.
|
|
Automatically prunes junk and the oldest logs when the count exceeds
|
|
$SCROLLBACK_HISTORY_MAX_FILES.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
\-n, \-\-no\-log Exit without saving a scrollback log
|
|
|
|
Exit Status:
|
|
0 Shell session exited
|
|
1 Argument parsing failed
|
|
|
|
Notes:
|
|
The exit builtin is wired to smart_exit for interactive sessions. Typing
|
|
exit or Ctrl+D behaves identically to calling smart_exit directly.
|
|
|
|
Example:
|
|
smart_exit
|
|
smart_exit \-\-no\-log
|
|
.EE
|
|
.SS sponge_filter_secrets
|
|
.IP
|
|
.EX
|
|
Synopsis: sponge_filter_secrets <command> <exit_code> <previously_in_history>
|
|
|
|
Custom sponge filter that prevents commands from being stored in history
|
|
when they contain the literal value of any exported environment variable
|
|
whose name indicates it holds a credential (TOKEN, PASSWORD, SECRET,
|
|
API_KEY, etc.). This catches shell\-expansion leakage where a variable
|
|
value is embedded directly in the command string at execution time \(em a
|
|
case that static regex patterns cannot cover.
|
|
|
|
Any variable whose name matches the sensitive\-name heuristic and whose
|
|
value is longer than 8 characters (excluding bare paths) is checked.
|
|
The value is escaped for literal regex matching before comparison.
|
|
|
|
Arguments:
|
|
command The exact command that was entered
|
|
exit_code Exit code of the command (unused)
|
|
previously_in_history \(dqtrue\(dq/\(dqfalse\(dq flag (unused)
|
|
|
|
Exit Status:
|
|
0 Command contains a secret value \(em filter out of history
|
|
1 No secret value found \(em keep in history
|
|
|
|
Example:
|
|
# Register with sponge (done automatically by conf.d/sponge_privacy.fish):
|
|
set \-U \-a sponge_filters sponge_filter_secrets
|
|
.EE
|
|
.SS 5.12 AI and Developer Tools
|
|
.SS agents\-init
|
|
.IP
|
|
.EX
|
|
Synopsis: agents\-init [\-a | \-\-agents] [\-p | \-\-plugins] [\-v | \-\-verbose]
|
|
[\-q | \-\-quiet] [\-s | \-\-silent] [\-h | \-\-help]
|
|
|
|
Scaffolds an AGENTS/ sub\-repository inside a project directory. Creates
|
|
a self\-contained git repo for agent specifications, moves any existing
|
|
agent\-related files into it, and replaces them with symlinks so the outer
|
|
project never tracks agent files directly.
|
|
|
|
File layout after setup:
|
|
AGENTS/AGENTS.md canonical agent spec (real file)
|
|
AGENTS/CLAUDE.md real file (if CLAUDE.md existed separately)
|
|
or symlink → AGENTS.md (single\-source case)
|
|
<root>/AGENTS.md → AGENTS/AGENTS.md
|
|
<root>/CLAUDE.md → AGENTS/CLAUDE.md
|
|
AGENTS/plans superpowers plans (real dir, .gitkeep)
|
|
AGENTS/specs superpowers specs (real dir, .gitkeep)
|
|
AGENTS/devlogs agent development logs (real dir, .gitkeep)
|
|
AGENTS/.version MAJOR.MINOR.PATCH structure version (seed 1.0.0)
|
|
AGENTS/.agents\-tools/ committed version\-bump script + git hook shims
|
|
docs/superpowers/plans → ../../AGENTS/plans (always)
|
|
docs/superpowers/specs → ../../AGENTS/specs (always)
|
|
docs/plans → ../AGENTS/plans (only if docs/plans existed)
|
|
docs/specs → ../AGENTS/specs (only if docs/specs existed)
|
|
docs/devlogs → ../AGENTS/devlogs (only if docs/devlogs existed)
|
|
|
|
plans/ and specs/ are merged from every legacy location (docs/<tgt>,
|
|
docs/superpowers/<tgt>, and the old AGENTS/plugins/ layout) into the
|
|
canonical AGENTS/<tgt>; the AGENTS/plugins/ layer is removed.
|
|
|
|
Each AGENTS repo carries a self\-contained version bumper wired via
|
|
core.hooksPath: a pre\-commit hook bumps AGENTS/.version on every commit
|
|
(MINOR when the tracked directory set changes, PATCH otherwise; MAJOR is
|
|
manual\-only), and a prepare\-commit\-msg hook appends \(dq(vX.Y.Z)\(dq to the
|
|
commit subject. Each shim then chains (execs) to the global/system
|
|
core.hooksPath hook of the same name, so this local override does not
|
|
shadow global hooks (e.g. ggshield, Git LFS). The script/hooks are
|
|
version\-managed from scripts/agents\-tools/ and refreshed when their marker
|
|
is stale.
|
|
|
|
Downstream tooling can read AGENTS/.version directly \(em a changed MINOR
|
|
field signals a structure change.
|
|
|
|
With no flags, runs both \-\-agents and \-\-plugins setup; \-\-agents re\-runs
|
|
only the AGENTS.md / symlink step and \-\-plugins only the plans/specs/
|
|
devlogs wiring step. Managed paths are added to .gitignore. At the end
|
|
of every invocation any uncommitted changes inside the sub\-repo are
|
|
auto\-committed so agent\-made edits are captured automatically. Fully
|
|
idempotent: a second run produces no output and no new commits.
|
|
|
|
The commit is local only. Nothing here fetches or pushes: the wrappers
|
|
call this synchronously before starting an agent, and a network round
|
|
trip there blocks the launch until an unreachable remote times out and
|
|
can prompt for credentials with nobody watching. A sub\-repo that has an
|
|
upstream is pulled by hand, on the user\(aqs own schedule.
|
|
|
|
Called automatically by the claude and agy wrappers on every invocation.
|
|
|
|
Arguments:
|
|
\-a, \-\-agents Set up AGENTS/ repo + AGENTS.md / CLAUDE.md symlinks only
|
|
\-p, \-\-plugins Set up AGENTS/ repo + plans/specs/devlogs dirs + docs/ symlinks only
|
|
\-v, \-\-verbose Print all per\-step output (default)
|
|
\-q, \-\-quiet Print one summary line only if changes were made
|
|
\-s, \-\-silent Suppress all output; errors only (standard UNIX convention)
|
|
\-h, \-\-help Show this help message and exit
|
|
|
|
Exit Status:
|
|
0 Setup completed successfully
|
|
1 Fatal error (git init failed, move failed, the AGENTS/ commit was
|
|
rejected, or an unresolved rebase blocked it)
|
|
|
|
Example:
|
|
agents\-init
|
|
agents\-init \-\-agents
|
|
agents\-init \-\-plugins
|
|
agents\-init \-\-quiet
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]_agents_repo_install_tools\f[R],
|
|
\f[CR]_agents_repo_sync\f[R], \f[CR]_agents_init_ensure_gitignore\f[R]
|
|
.PP
|
|
\f[B]Used by:\f[R] \f[CR]agy\f[R], \f[CR]claude\f[R]
|
|
.SS agents\-vault
|
|
.IP
|
|
.EX
|
|
Synopsis: agents\-vault [\-\-link] [\-\-push] [\-\-restore] [\-\-status]
|
|
[\-\-adopt=SLUG] [\-\-remote=URL]
|
|
[\-v | \-\-verbose] [\-q | \-\-quiet] [\-s | \-\-silent]
|
|
[\-h | \-\-help]
|
|
|
|
Tracks curated agent memory in a host\-scoped git repository so it
|
|
survives losing a machine. Complements agents\-init, which scaffolds the
|
|
per\-project AGENTS/ repo: that holds the shareable agent specification,
|
|
while this holds the personal memory an agent accumulates.
|
|
|
|
Memory does not live in any project tree. Claude keeps it under
|
|
\(ti/.claude/projects/<mangled\-path>/memory/ and agy keeps its knowledge
|
|
store under \(ti/.gemini/antigravity\-cli/, both outside every repository.
|
|
|
|
Entries are keyed by normalized git remote URL rather than by path, so
|
|
the key survives a machine change or a directory rename. The live
|
|
memory directory becomes a symlink into the vault, which makes backup
|
|
and restore the same operation: on a new machine, clone the vault once
|
|
and the first agents\-vault run in any project relinks its memory
|
|
automatically. No manifest and no batch restore step are involved.
|
|
|
|
Only curated memory is tracked. Session transcripts are excluded (tens
|
|
of megabytes per project, growing per session). Paths are allowlisted,
|
|
never denylisted, so nothing new upstream adds can leak in. The
|
|
allowlist runs all the way down, not just at the top: inside agy\(aqs
|
|
knowledge store only *.md and *.json files are copied, so a credential
|
|
file or a conversation database appearing there is left behind by the
|
|
same rule rather than by being known about in advance. Symlinks found
|
|
inside the store are neither followed nor copied, so the allowlist
|
|
bounds whose files it collects and not merely what kind.
|
|
|
|
Global state that belongs to no project is tracked as well. Claude\(aqs
|
|
global memory directory (\(ti/.claude/memory) is symlinked into the vault
|
|
exactly like per\-project memory, and is only linked when one side or
|
|
the other already holds something, since that path does not exist by
|
|
default. agy\(aqs knowledge store and settings.json are copied rather
|
|
than symlinked: agy partitions by conversation UUID rather than by
|
|
workspace, so it has no per\-project slice, and its store sits beside
|
|
SQLite databases whose WAL sidecars must never be live\-tracked inside
|
|
a git worktree. A failed copy is reported but is not fatal, because an
|
|
incomplete backup still leaves the agent working.
|
|
|
|
Because the slug is derived from the remote, gaining, losing, or
|
|
rewriting a project\(aqs origin changes it. Each run detects this by
|
|
reading the previous slug straight off the live memory symlink\(aqs
|
|
target (no guessing) and migrates that entry to the new slug before
|
|
relinking, so memory accumulated under the old key is never orphaned.
|
|
If both the old and new entries already hold content the migration is
|
|
ambiguous and is refused; resolve it with \-\-adopt=SLUG. An entry that
|
|
is already at the new key but holds no memory \-\- the shape a fresh
|
|
clone always produces, since git cannot track an empty directory \-\- is
|
|
moved aside, not deleted, and its origin log is folded into the
|
|
migrated entry, so a clone\(aqs provenance survives the rename. The
|
|
rename is atomic: a failure at any point leaves the vault exactly as
|
|
it was and reports it.
|
|
|
|
Run with no flags, the command scaffolds the vault, syncs global state,
|
|
links the current project, and commits. The other modes are exclusive
|
|
and each returns as soon as it is done:
|
|
|
|
\-\-status is a report and mutates nothing at all. It is answered before
|
|
the vault is even scaffolded, so asking what the vault looks like never
|
|
creates it, never copies agy state into it, and never claims
|
|
\(ti/.claude/memory. A missing vault is reported rather than built.
|
|
|
|
\-\-restore walks every vault entry and relinks the live memory directory
|
|
of each one whose recorded origin path still exists, naming the rest so
|
|
they can be rebound by hand. It is a convenience: the ordinary per\-
|
|
project run restores a cloned vault\(aqs memory on its own.
|
|
|
|
\-\-adopt=SLUG rebinds the current project\(aqs entry to SLUG, which is how
|
|
a machine\-specific local\-* key or an ambiguous migration is resolved.
|
|
SLUG must match [a\-z0\-9._\-]+ and be neither \(dq.\(dq nor \(dq..\(dq \-\- the charset
|
|
the slug formula itself emits \-\- since it is interpolated into a vault
|
|
path and handed to git mv. The rename and the relink are atomic: if the
|
|
live memory directory cannot be repinned onto the new entry the rename
|
|
is rolled back, so an ordinary run still finds the original entry.
|
|
|
|
\-\-remote=URL points the vault at a remote; \-\-push commits, pulls, and
|
|
then pushes there. The pull happens only on this path. Committing needs
|
|
no remote at all, and both wrappers run this command synchronously
|
|
before starting an agent, so a fetch on the ordinary run would block
|
|
every launch for as long as an unreachable remote takes to time out \-\-
|
|
and would take the local commit down with it, leaving an offline
|
|
machine with no backup at all.
|
|
|
|
Arguments:
|
|
\-\-link Scaffold the vault and link this project\(aqs memory; skip
|
|
the final commit
|
|
\-\-push Commit, pull, then push to the vault remote
|
|
\-\-restore Walk the vault, relink what is possible, report the rest
|
|
\-\-status Show entries, link health, remote state, and orphans
|
|
\-\-adopt=SLUG Bind the current project to an existing vault entry
|
|
\-\-remote=URL Set the vault remote
|
|
\-v, \-\-verbose Print all per\-step output (default)
|
|
\-q, \-\-quiet Print one summary line only if changes were made
|
|
\-s, \-\-silent Suppress all output; errors only
|
|
\-h, \-\-help Show this help message and exit
|
|
|
|
Exit Status:
|
|
0 Completed successfully
|
|
1 Fatal error (vault unavailable, git failure, ambiguous migration,
|
|
invalid \-\-adopt slug, nothing committed, or a push that did not
|
|
reach the remote)
|
|
|
|
Returns:
|
|
\-\-status prints its report on stdout: the vault path, the remote and
|
|
how far ahead of it the vault is, a warning for an unresolved rebase,
|
|
then one line per entry reading \(dqlinked\(dq or \(dqorphan\(dq, the slug, and the
|
|
file count. Every other mode prints only verbosity\-gated progress
|
|
lines, and nothing at all when there was nothing to do.
|
|
|
|
Notes:
|
|
Set __fish_agent_vault_dir to relocate the vault. Set
|
|
__fish_agent_vault_autopush to 1 to also push on wrapper launch; it
|
|
defaults to off because that push is synchronous and so delays every
|
|
launch. With it on, the pull and the push are each capped at 20
|
|
seconds, since git has no connect timeout of its own and an
|
|
unreachable remote otherwise blocks for minutes. An explicit \-\-push
|
|
is left uncapped: it is watched, and it must report what a real
|
|
transfer really did. The cap is timeout(1); on a system that somehow
|
|
lacks it, autopush says so on stderr and does not push at all, since
|
|
an unbounded network call in front of a launch is the one outcome the
|
|
cap exists to prevent. \-\-push still works there.
|
|
|
|
Over ssh the cap is delivered by setting GIT_SSH_COMMAND, which would
|
|
silently outrank the user\(aqs own configuration \-\- so it is not set at
|
|
all when GIT_SSH_COMMAND is already exported or git\(aqs core.sshCommand
|
|
is configured. A vault remote reachable only through a particular
|
|
identity file or ssh wrapper therefore keeps it, uncapped, rather than
|
|
failing to authenticate for the sake of a timeout.
|
|
|
|
\-\-adopt rebinds an entry; it does not pin its name. The slug is
|
|
re\-derived from the project on every run, so the next ordinary run
|
|
migrates the adopted entry straight back to the canonical key, carrying
|
|
the memory and the live link with it. That is the point rather than a
|
|
wart: adopting is how a mismatched or ambiguous binding is repaired, not
|
|
how an entry is given a permanent name of its own.
|
|
|
|
An entry\(aqs origin file records the project path once, when the entry is
|
|
created, and is never refreshed. A project that later moves on disk
|
|
therefore keeps a stale path there and \-\-restore degrades to reporting
|
|
it as unplaceable rather than relinking the wrong directory. Rebind
|
|
such an entry from the project itself with \-\-adopt=SLUG.
|
|
|
|
The agy knowledge copy is merge\-only. Files are copied into the vault
|
|
but are never removed from it, so a fact deleted upstream from agy\(aqs
|
|
knowledge store persists in the vault indefinitely, and a restore or a
|
|
fresh clone brings it back. Prune such an entry from the vault by hand
|
|
if it must really be gone.
|
|
|
|
Three further variables exist only so the test suite can run against
|
|
throwaway directories instead of the real home, and are not meant for
|
|
everyday use. __fish_agent_vault_claude_root overrides Claude\(aqs
|
|
per\-project directory (\(ti/.claude/projects), which is where the
|
|
per\-project memory directories live. __fish_agent_vault_claude_home
|
|
overrides Claude\(aqs home directory (\(ti/.claude), whose memory
|
|
subdirectory holds the global memory. Those two name different paths
|
|
and setting one has no effect on the other.
|
|
__fish_agent_vault_agy_root overrides agy\(aqs state directory
|
|
(\(ti/.gemini/antigravity\-cli), which is only ever read from.
|
|
|
|
The last two are not optional niceties. Without them, a test run on a
|
|
machine that has a real global memory directory would move it into a
|
|
throwaway directory and leave a dangling symlink behind, which is
|
|
strictly worse than having had no backup at all.
|
|
|
|
Example:
|
|
agents\-vault
|
|
agents\-vault \-\-status
|
|
agents\-vault \-\-remote=https://git.rootiest.dev/rootiest/agent\-vault.git
|
|
agents\-vault \-\-push
|
|
agents\-vault \-\-adopt=git.rootiest.dev\-rootiest\-fish\-config
|
|
agents\-vault \-\-restore
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]_agents_vault_dir\f[R],
|
|
\f[CR]_agents_repo_slug\f[R], \f[CR]_agents_repo_local_slug\f[R],
|
|
\f[CR]_agents_repo_ensure_symlink\f[R], \f[CR]_agents_repo_sync\f[R],
|
|
\f[CR]_agents_repo_install_tools\f[R], \f[CR]git\f[R],
|
|
\f[CR]hostname\f[R]
|
|
.PP
|
|
\f[B]Used by:\f[R] \f[CR]agy\f[R], \f[CR]claude\f[R]
|
|
.SS agy
|
|
.IP
|
|
.EX
|
|
Synopsis: agy [ARGS...]
|
|
|
|
Wrapper for the agy Antigravity AI CLI that ensures the AGENTS/
|
|
sub\-repository is initialized and any agent\-made changes are committed
|
|
before launch. Delegates all scaffold and commit logic to agents\-init
|
|
\-\-quiet (full setup), which ensures AGENTS/ is scaffolded and CLAUDE.md
|
|
is symlinked to AGENTS/AGENTS.md in the current project.
|
|
|
|
Also syncs the host\-scoped agent memory vault (agents\-vault). agy has
|
|
no session\-end hook, so its memory is captured on the next launch
|
|
rather than at session end.
|
|
|
|
Arguments are forwarded verbatim to the real agy binary, except for
|
|
\-r/\-\-resume which are translated to \-c/\-\-continue.
|
|
|
|
Opinionated component (C1): when disabled via __fish_config_op_aliases
|
|
(or the __fish_config_opinionated master), the command is passed through
|
|
to the real agy binary unchanged.
|
|
|
|
Arguments:
|
|
ARGS Arguments forwarded to the underlying agy binary (\-r translates to \-c)
|
|
|
|
Exit Status:
|
|
Exit status of the underlying agy binary
|
|
|
|
Example:
|
|
agy
|
|
agy \-\-resume
|
|
agy \-i \(dqinitial prompt\(dq
|
|
agy models
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]agents\-init\f[R],
|
|
\f[CR]agents\-vault\f[R]
|
|
.SS antigravity\-ide
|
|
.IP
|
|
.EX
|
|
Synopsis: antigravity\-ide [args...]
|
|
|
|
Wrapper for the antigravity\-ide command that filters a known noisy warning
|
|
about an unrecognized \(aqapp\(aq option from stderr.
|
|
|
|
Arguments:
|
|
args... Arguments passed through to the antigravity\-ide command
|
|
|
|
Example:
|
|
antigravity\-ide
|
|
.EE
|
|
.SS claude
|
|
.IP
|
|
.EX
|
|
Synopsis: claude [ARGS...]
|
|
|
|
Wrapper for the claude CLI that ensures the AGENTS/ sub\-repository is
|
|
initialized and any agent\-made changes are committed before launch.
|
|
Delegates all scaffold and commit logic to agents\-init \-\-quiet (full
|
|
setup), which ensures AGENTS/ is scaffolded and CLAUDE.md is symlinked
|
|
to AGENTS/AGENTS.md in the current project.
|
|
|
|
Also syncs the host\-scoped agent memory vault (agents\-vault), which
|
|
tracks curated memory living outside the project tree. The vault
|
|
commits on launch but does not push; pushing happens from the Claude
|
|
Code SessionEnd hook or an explicit agents\-vault \-\-push.
|
|
|
|
All arguments are forwarded verbatim to the real claude binary.
|
|
|
|
Opinionated component (C1): when disabled via __fish_config_op_aliases
|
|
(or the __fish_config_opinionated master), the command is passed through
|
|
to the real claude binary unchanged.
|
|
|
|
Arguments:
|
|
ARGS Any arguments forwarded verbatim to the underlying claude binary
|
|
|
|
Exit Status:
|
|
Exit status of the underlying claude binary
|
|
|
|
Example:
|
|
claude
|
|
claude \-\-resume
|
|
claude \(dqExplain the recent changes\(dq
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]agents\-init\f[R],
|
|
\f[CR]agents\-vault\f[R]
|
|
.SS claude\-docs
|
|
.IP
|
|
.EX
|
|
Synopsis: claude\-docs
|
|
|
|
Invokes Claude Code to analyze recent repository changes and update
|
|
README.md, ensuring all features and examples are accurate and pruning
|
|
obsolete content.
|
|
|
|
Example:
|
|
claude\-docs
|
|
.EE
|
|
.SS claude\-pr
|
|
.IP
|
|
.EX
|
|
Synopsis: claude\-pr
|
|
|
|
Invokes Claude Code to perform a full PR workflow: create a kebab\-case
|
|
branch, write a Conventional Commit, run verification, push, and open a
|
|
pull request with a manual verification checklist.
|
|
|
|
Example:
|
|
claude\-pr
|
|
.EE
|
|
.SS dops
|
|
.IP
|
|
.EX
|
|
Synopsis: docker [subcommand] [args...]
|
|
|
|
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.
|
|
|
|
Arguments:
|
|
subcommand Docker subcommand (ps is redirected to dops)
|
|
args... Arguments forwarded to docker or dops
|
|
|
|
Example:
|
|
docker ps
|
|
.EE
|
|
.SS qc
|
|
.IP
|
|
.EX
|
|
Synopsis: qc [prompt...]
|
|
|
|
Quick\-chat wrapper around the aichat LLM CLI that defaults to the \(dqcli\(dq
|
|
role \(em a system prompt tuned for concise, terminal\-friendly output.
|
|
Resolves the aichat config directory (honoring $XDG_CONFIG_HOME), creates
|
|
it if missing, and on first use installs the bundled role by symlinking
|
|
scripts/cli\-agent.md to $XDG_CONFIG_HOME/aichat/roles/cli.md. Inherits
|
|
every aichat flag and tab completion (\-\-wraps aichat); passing \-\-role/\-r
|
|
overrides the default role, so qc forwards to aichat unchanged. The
|
|
function is only defined when aichat is installed. Run qc \-\-help for
|
|
aichat\(aqs full flag reference with the command name rewritten to qc.
|
|
|
|
Arguments:
|
|
prompt... Prompt forwarded to aichat
|
|
\-h, \-\-help Show usage help
|
|
|
|
Exit Status:
|
|
aichat\(aqs exit status.
|
|
|
|
Example:
|
|
qc \(dqhow do I list open ports on linux?\(dq
|
|
qc \-m ollama:llama3 \(dqexplain this error\(dq
|
|
qc \-\-role coder \(dqrefactor this function\(dq
|
|
.EE
|
|
.SS superpowers
|
|
.IP
|
|
.EX
|
|
Synopsis: superpowers [on|off] [\-g]
|
|
|
|
Enables or disables the superpowers plugin for both antigravity\-cli
|
|
(workspace scope) and Claude (project scope). Use \-g/\-\-global to apply
|
|
at the user scope instead of workspace/project.
|
|
|
|
Arguments:
|
|
on Enable superpowers for both tools
|
|
off Disable superpowers for both tools
|
|
\-g, \-\-global Apply at user/global scope instead of workspace/project
|
|
\-h, \-\-help Show usage help
|
|
|
|
Exit Status:
|
|
0 Mode applied successfully
|
|
1 No on/off mode specified
|
|
|
|
Example:
|
|
superpowers on
|
|
superpowers off \-g
|
|
.EE
|
|
.SS 5.13 Media and Utilities
|
|
.SS dng2avif
|
|
.IP
|
|
.EX
|
|
Synopsis: dng2avif [\-h] [\-i <file>] [\-o <file>] [\-q <n>] [\-s <n>] [input.dng]
|
|
|
|
Converts a DNG raw image to a 10\-bit HDR AVIF using a three\-step pipeline:
|
|
develop with ImageMagick, encode with ffmpeg+avifenc, sync metadata with
|
|
exiftool. Requires magick, ffmpeg, avifenc, and exiftool.
|
|
|
|
Arguments:
|
|
\-i, \-\-input FILE Input DNG file
|
|
\-o, \-\-output FILE Output AVIF file (defaults to input basename)
|
|
\-q, \-\-quality N Encoding quality 0\-100 (default: 92)
|
|
\-s, \-\-speed N Encoder speed 0\-10 (default: 3, 0 = slowest)
|
|
\-h, \-\-help Show help message
|
|
|
|
Exit Status:
|
|
0 Conversion complete
|
|
1 File not found, missing dependency, or encode step failed
|
|
|
|
Example:
|
|
dng2avif photo.dng
|
|
dng2avif \-q 85 \-s 5 \-i shot.dng \-o out.avif
|
|
.EE
|
|
.SS play\-media
|
|
.IP
|
|
.EX
|
|
Synopsis: play\-media [\-p|\-\-player <cmd>]
|
|
play\-media \-\-help
|
|
|
|
Opens an fzf picker (with thumbnail/metadata preview via
|
|
_fzf_preview_media) listing audio and video files under the current
|
|
directory, and plays the selection(s) in the best available media
|
|
player. Supports multi\-select (Tab) to queue several files at once.
|
|
|
|
Player resolution order:
|
|
1. \-p/\-\-player <cmd> (explicit override, validated as a command)
|
|
2. $play_media_player (explicit override, validated as a command)
|
|
3. xdg\-mime default handler for the first selected file\(aqs mimetype
|
|
4. First known player binary found in a built\-in list (mpv, vlc)
|
|
|
|
The player is launched backgrounded and detached, mirroring open\-url,
|
|
so the shell is never blocked.
|
|
|
|
Arguments:
|
|
\-p, \-\-player <cmd> Force a specific player command
|
|
\-h, \-\-help Print usage and exit
|
|
|
|
Exit Status:
|
|
0 Player launched (or the picker was cancelled)
|
|
1 No media files found, invalid \-\-player/$play_media_player, or no
|
|
player found
|
|
|
|
Example:
|
|
play\-media
|
|
play\-media \-\-player mpv
|
|
.EE
|
|
.SS spark
|
|
.IP
|
|
.EX
|
|
Synopsis: spark [\-\-min=<n>] [\-\-max=<n>] [numbers...]
|
|
|
|
Renders a Unicode sparkline bar chart for a sequence of numbers.
|
|
Reads numbers from arguments or from stdin if none are provided.
|
|
Optional \-\-min and \-\-max clamp the scale range.
|
|
|
|
Arguments:
|
|
\-\-min=<n> Minimum value for scale (default: list minimum)
|
|
\-\-max=<n> Maximum value for scale (default: list maximum)
|
|
numbers... Space\-separated numbers to chart; reads stdin if omitted
|
|
\-v, \-\-version Print version
|
|
\-h, \-\-help Show usage help
|
|
|
|
Example:
|
|
spark 1 1 2 5 14 42
|
|
seq 64 | sort \-\-random\-sort | spark
|
|
echo \(dq3 7 2 9 1\(dq | spark
|
|
.EE
|
|
.SS steam\-dl
|
|
.IP
|
|
.EX
|
|
Synopsis: steam\-dl
|
|
|
|
Launches Steam with systemd\-inhibit to prevent the system from idling
|
|
or sleeping during active downloads.
|
|
|
|
Example:
|
|
steam\-dl
|
|
.EE
|
|
.SS yt\-dlp
|
|
.IP
|
|
.EX
|
|
Synopsis: yt\-dlp [args...] URL [URL...]
|
|
|
|
Wraps yt\-dlp, injecting sane embedding + SponsorBlock defaults
|
|
(\-\-sponsorblock\-remove all, \-\-embed\-subs, \-\-embed\-metadata,
|
|
\-\-embed\-thumbnail). Each default is suppressed if the user already
|
|
passes that flag, its alias, or its negation (e.g. \-\-no\-embed\-thumbnail
|
|
drops our \-\-embed\-thumbnail; \-\-no\-sponsorblock or your own
|
|
\-\-sponsorblock\-remove drops ours). All other arguments pass through
|
|
untouched. \-\-help and friends fall through to real yt\-dlp.
|
|
|
|
Opinionated component (C1): when disabled via __fish_config_op_aliases
|
|
(or the __fish_config_opinionated master), passes straight through to
|
|
the system yt\-dlp with no defaults injected.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to yt\-dlp (defaults prepended)
|
|
\-\-no\-embed\-thumbnail Skip thumbnail embedding for this run
|
|
|
|
Example:
|
|
yt\-dlp dQw4w9WgXcQ
|
|
yt\-dlp \-\-no\-embed\-thumbnail dQw4w9WgXcQ # drops our thumbnail default
|
|
.EE
|
|
.SS 5.14 Miscellaneous
|
|
.SS bash
|
|
.IP
|
|
.EX
|
|
Synopsis: bash [args...]
|
|
|
|
Switches the current shell session to bash, loading config from the XDG
|
|
config directory. Resets $SHELL back to fish on exit.
|
|
|
|
Arguments:
|
|
args... Arguments passed through to the bash command
|
|
|
|
Example:
|
|
bash
|
|
.EE
|
|
.SS bd\-pull
|
|
.IP
|
|
.EX
|
|
Synopsis: bd\-pull <owner/repo>
|
|
|
|
Fetches unlinked issues from a Gitea repository, creates corresponding local
|
|
Beads entries, and updates the Gitea issue titles to include the new Bead IDs.
|
|
Requires $GITEA_TOKEN and $GITEA_URL to be set.
|
|
|
|
Arguments:
|
|
owner/repo The repository path in owner/name format
|
|
|
|
Exit Status:
|
|
0 Issues linked and synced (or no unlinked issues found)
|
|
1 Missing required argument or environment variables
|
|
|
|
Example:
|
|
bd\-pull myuser/myproject
|
|
bd\-pull rootiest/fish\-config
|
|
.EE
|
|
.SS cffetch
|
|
.IP
|
|
.EX
|
|
Synopsis: cffetch [args...]
|
|
|
|
Clears the screen and displays system information using fastfetch with a
|
|
custom config if available. Falls back to neofetch if fastfetch is not installed.
|
|
|
|
Arguments:
|
|
args... Additional arguments forwarded to fastfetch or neofetch
|
|
|
|
Example:
|
|
cffetch
|
|
.EE
|
|
.SS cheat
|
|
.IP
|
|
.EX
|
|
Synopsis: cheat <topic> [args...]
|
|
|
|
Displays colorized cheatsheets using cheat \-c. Falls back to tldr, then
|
|
man, if cheat is not installed.
|
|
|
|
Arguments:
|
|
topic The command or topic to look up
|
|
args... Additional arguments forwarded to cheat, tldr, or man
|
|
|
|
Example:
|
|
cheat tar
|
|
cheat git
|
|
.EE
|
|
.SS config\-help
|
|
.IP
|
|
.EX
|
|
Synopsis: config\-help [section]
|
|
config\-help \-\-html
|
|
config\-help [section] \-\-man
|
|
config\-help \-\-help
|
|
|
|
Opens the offline fish shell configuration manual in the best available
|
|
pager. Falls back through ov \-> bat \-> man \-> less \-> cat.
|
|
If a section keyword is provided, the pager opens at the first heading
|
|
that matches the keyword. Lookup order: docs/fish\-config.index (exact
|
|
keyword aliases), then a normalized heading scan as fallback.
|
|
When opened with ov a sticky navigation hint is shown at the top of the
|
|
screen. Section matching is case\-insensitive. Pass \-\-html / \-w to open
|
|
the published documentation website (https://fish.rootiest.fyi/)
|
|
in the default browser via xdg\-open \(em deep links to a section aren\(aqt
|
|
supported there, so if a keyword is given a note points you to the site\(aqs
|
|
search box instead. Pass \-\-man / \-m to open the compiled man page
|
|
(docs/fish\-config.1) via man \-l; if a section keyword is given, the
|
|
pager opens at the nearest match. Pass \-\-help or \-h for usage and the
|
|
navigation key reference.
|
|
|
|
Arguments:
|
|
section Optional keyword to jump to a matching section heading
|
|
\-w, \-\-html Open the published documentation website in the default browser
|
|
\-m, \-\-man Open the compiled man page via man \-l
|
|
\-h, \-\-help Print usage and navigation reference, then exit
|
|
|
|
Exit Status:
|
|
0 Manual displayed
|
|
1 Documentation file not found, or required tool not available
|
|
|
|
Returns:
|
|
With \-h/\-\-help, the usage and navigation reference, printed to stdout.
|
|
Otherwise, the manual is shown via the resolved pager (not captured stdout).
|
|
|
|
Notes:
|
|
The preferred invocation is help config [...] \(em this function is
|
|
registered as a handler in the help wrapper so that syntax works
|
|
transparently. Direct config\-help calls are also valid.
|
|
|
|
Example:
|
|
config\-help
|
|
config\-help keybindings
|
|
config\-help pkg
|
|
config\-help fish\-deps
|
|
config\-help \-\-html
|
|
config\-help \-\-man
|
|
config\-help keys \-\-man
|
|
config\-help \-\-help
|
|
config\-help pkg \-\-man
|
|
.EE
|
|
.SS config\-settings
|
|
.IP
|
|
.EX
|
|
Synopsis: config\-settings [\-h | \-\-help]
|
|
|
|
Opens an interactive full\-screen TUI for managing fish config settings
|
|
across four pages, without having to type or remember variable names:
|
|
|
|
Universal \(em opinionated\-category toggles (C1\(enC6) + master, persistent (set \-U)
|
|
Session \(em the same toggles, current shell only (set \-g)
|
|
Sponge \(em sponge history\-scrubbing settings: delay, successful exit
|
|
codes, purge\-only\-on\-exit, allow\-previously\-successful, and
|
|
extra sensitive variable\-name tokens
|
|
Paths \(em scrollback log directory, scrollback max files, the user\-dots
|
|
path, and the user\-dots convenience symlink toggle (Dots link)
|
|
|
|
Toggle rows use ← / → (or h / l) to step OFF ← DEFAULT → ON; DEFAULT erases
|
|
the variable so the master switch / built\-in default applies. On the
|
|
Universal/Session pages, Enter on a category row (C1\(enC6) opens that
|
|
category\(aqs sub\-category drill\-down page for finer\-grained toggles;
|
|
Escape backs out to the category list. Value rows
|
|
(Sponge, Paths) use Enter to edit inline; ← / h clears to default. List rows
|
|
(e.g. Extra secret, OK codes) accept values separated by commas and/or
|
|
whitespace \(em \(dqA, B\(dq, \(dqA,B\(dq and \(dqA B\(dq all yield the same two entries.
|
|
Tab / Shift\-Tab cycle forward / backward through pages.
|
|
Changes apply immediately \(em no confirm step. Always available regardless of
|
|
__fish_config_opinionated state.
|
|
|
|
The Sponge and Paths pages always write universal variables \(em these are
|
|
persistent, set\-and\-forget settings with no per\-session scope. Editing a
|
|
scrollback row updates both the __fish_scrollback_history_* source\-of\-truth
|
|
variables and the exported SCROLLBACK_HISTORY_* mirrors, so the AUR/tmux/
|
|
zellij log wrappers (which read the exported names) see the change in the
|
|
running session.
|
|
|
|
The panel adapts to the terminal width automatically, selecting from four
|
|
layout tiers (with a 6\-column buffer on each side before stepping up to the
|
|
next tier) and horizontally centering the box. The panel redraws within
|
|
\(ti0.3 s of a terminal resize with no keypress required.
|
|
|
|
COLUMNS >= 90 → 78\-wide panel (most detail)
|
|
COLUMNS >= 86 → 74\-wide panel
|
|
COLUMNS >= 82 → 70\-wide panel
|
|
COLUMNS < 82 → 52\-wide panel (default)
|
|
|
|
Navigation:
|
|
↑ ↓ / k j Move cursor
|
|
← → / h l Toggle rows: OFF ← DEFAULT → ON
|
|
← / h Value rows: clear to default
|
|
Enter Category rows (Universal/Session): open sub\-category
|
|
drill\-down page. Value rows: edit inline (Sponge /
|
|
Paths pages)
|
|
Escape Sub\-category page: back out to the category list
|
|
Tab / S\-Tab Next / previous page
|
|
q / Escape Exit
|
|
|
|
Arguments:
|
|
\-h, \-\-help Print usage and exit
|
|
|
|
Exit Status:
|
|
0 Exited normally (q or Escape pressed)
|
|
1 Unknown flag passed
|
|
|
|
Example:
|
|
config\-settings
|
|
.EE
|
|
.PP
|
|
\f[B]Used by:\f[R] \f[CR]config\-toggle\f[R]
|
|
.SS config\-toggle
|
|
.IP
|
|
.EX
|
|
Synopsis: config\-toggle [args...]
|
|
|
|
Deprecated alias for config\-settings. Prints a one\-line deprecation
|
|
notice to stderr, then delegates all arguments to config\-settings.
|
|
|
|
Arguments:
|
|
args Passed through verbatim to config\-settings
|
|
|
|
Exit Status:
|
|
Same as config\-settings
|
|
|
|
Example:
|
|
config\-toggle # opens config\-settings with a deprecation notice
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]config\-settings\f[R]
|
|
.SS config\-update
|
|
.IP
|
|
.EX
|
|
Synopsis: config\-update [\-h | \-\-help] [\-f | \-\-force] [\-n | \-\-dry\-run]
|
|
|
|
Pulls the latest fish shell configuration from the upstream repository
|
|
into \(ti/.config/fish. Git output is suppressed; status is reported
|
|
through colored messages. After a successful pull the function prints a
|
|
short summary of changed files; run exec fish to reload the shell.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show this help message and exit
|
|
\-f, \-\-force Stash local changes before pulling, then pop the stash
|
|
\-n, \-\-dry\-run Check for upstream changes without applying them
|
|
|
|
Exit Status:
|
|
0 Config updated (or already up to date)
|
|
1 Update failed (network error, merge conflict, or not a git repo)
|
|
|
|
Example:
|
|
config\-update
|
|
config\-update \-\-dry\-run
|
|
config\-update \-\-force
|
|
.EE
|
|
.SS dockup
|
|
.IP
|
|
.EX
|
|
Synopsis: dockup [\-h] [directory]
|
|
|
|
Pulls the latest Docker images and restarts all services in a Docker Compose
|
|
project, then prunes dangling images. Accepts an optional target directory.
|
|
|
|
Arguments:
|
|
\-h, \-\-help Show help message
|
|
directory Path to the compose project (defaults to current directory)
|
|
|
|
Exit Status:
|
|
0 Services updated and running
|
|
1 Directory not found or no docker\-compose.yml present
|
|
|
|
Example:
|
|
dockup \(ti/myapp
|
|
.EE
|
|
.SS ffetch
|
|
.IP
|
|
.EX
|
|
Synopsis: ffetch [args...]
|
|
|
|
Alias for fastfetch that loads a custom config from \(ti/.fastfetch.jsonc when
|
|
present. Falls back to neofetch if fastfetch is not installed.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to fastfetch or neofetch
|
|
|
|
Example:
|
|
ffetch
|
|
.EE
|
|
.SS fzf_configure_bindings
|
|
.IP
|
|
.EX
|
|
Synopsis: fzf_configure_bindings [\-\-directory=<key>] [\-\-git_log=<key>] [\-\-git_status=<key>]
|
|
[\-\-history=<key>] [\-\-processes=<key>] [\-\-variables=<key>] [\-h]
|
|
|
|
Installs key bindings for fzf.fish in both insert and default vi modes.
|
|
Each binding can be overridden with a custom key or disabled by passing an
|
|
empty string. Only runs in interactive mode.
|
|
|
|
Arguments:
|
|
\-\-directory=key Override the directory search binding (default: Ctrl\-Alt\-F)
|
|
\-\-git_log=key Override the git log search binding (default: Ctrl\-Alt\-L)
|
|
\-\-git_status=key Override the git status binding (default: Ctrl\-Alt\-S)
|
|
\-\-history=key Override the history search binding (default: Ctrl\-R)
|
|
\-\-processes=key Override the processes search binding (default: Ctrl\-Alt\-P)
|
|
\-\-variables=key Override the variables search binding (default: Ctrl\-V)
|
|
\-h, \-\-help Show help message
|
|
|
|
Exit Status:
|
|
0 Bindings installed or help shown
|
|
22 Invalid option or positional argument provided
|
|
|
|
Example:
|
|
fzf_configure_bindings \-\-history=ctrl\-h
|
|
.EE
|
|
.SS joplin
|
|
.IP
|
|
.EX
|
|
Synopsis: joplin [args...]
|
|
|
|
Runs the Joplin CLI with Node deprecation warnings suppressed via
|
|
NODE_OPTIONS=\-\-no\-deprecation.
|
|
|
|
Arguments:
|
|
args... Arguments forwarded to the joplin command
|
|
|
|
Exit Status:
|
|
0 Joplin ran successfully
|
|
1 joplin binary not found in PATH
|
|
|
|
Example:
|
|
joplin ls
|
|
.EE
|
|
.SS kitty\-logging
|
|
.IP
|
|
.EX
|
|
Synopsis: kitty\-logging [install | uninstall | status | dismiss] [\-h]
|
|
|
|
Manages the fish\-config Kitty scrollback watcher that powers C5 logging.
|
|
install symlinks the canonical watcher into the Kitty config dir (so it
|
|
always tracks the source) and wires it into kitty.conf via a
|
|
sentinel\-marked managed block, commenting out any conflicting active
|
|
watcher line to avoid double\-capture. uninstall reverses it. status
|
|
reports wiring, installed watcher version, and C5 logging state. dismiss
|
|
silences the per\-session setup reminder.
|
|
|
|
Runtime capture stays governed by the C5 .logging_disabled sentinel, so
|
|
disabling __fish_config_op_logging makes the watcher inert without
|
|
uninstalling. Install affects new Kitty windows only.
|
|
|
|
Arguments:
|
|
install Symlink the watcher and add the managed block to kitty.conf
|
|
uninstall Remove the managed block and the watcher symlink
|
|
status Report wiring, watcher version, and C5 logging state
|
|
dismiss Stop the per\-session reminder
|
|
\-h, \-\-help Show this help
|
|
|
|
Exit Status:
|
|
0 Success
|
|
1 Unknown subcommand/flag, kitty missing, or a write failure
|
|
|
|
Example:
|
|
kitty\-logging install
|
|
kitty\-logging status
|
|
.EE
|
|
.SS ld
|
|
.IP
|
|
.EX
|
|
Synopsis: ld
|
|
|
|
Launches lazydocker targeting the currently active Docker context by
|
|
resolving the host endpoint from docker context inspect.
|
|
|
|
Exit Status:
|
|
1 docker or lazydocker is not installed
|
|
|
|
Example:
|
|
ld
|
|
.EE
|
|
.SS open\-url
|
|
.IP
|
|
.EX
|
|
Synopsis: open\-url [\-s|\-\-silent] [\-v|\-\-verbose] <url>
|
|
open\-url \-\-help
|
|
|
|
Opens a URL (or file:// URI) in the best available graphical web browser,
|
|
backgrounded so it never blocks the terminal. Resolves a real browser
|
|
binary rather than deferring to xdg\-open, whose MIME dispatch can hand
|
|
local text/html files to non\-browser apps (e.g. ebook readers).
|
|
|
|
Silent by default: prints nothing on success (errors always go to stderr);
|
|
\-\-silent / \-s is accepted for explicitness.
|
|
|
|
Resolution order:
|
|
1. $fish_help_browser (explicit override)
|
|
2. $BROWSER (validated; errors if not a command)
|
|
3. xdg\-mime default handler for x\-scheme\-handler/https
|
|
4. First known browser binary found in a built\-in list
|
|
5. xdg\-open (last resort)
|
|
|
|
Arguments:
|
|
url The URL or file:// URI to open (required)
|
|
\-s, \-\-silent Suppress success output (the default)
|
|
\-v, \-\-verbose Print which browser is being launched
|
|
\-h, \-\-help Print usage and exit
|
|
|
|
Exit Status:
|
|
0 Browser launched
|
|
1 No URL given, invalid $BROWSER, or no browser found
|
|
|
|
Notes:
|
|
Typo abbreviation: url\-open (expands to open\-url on space/enter).
|
|
|
|
Example:
|
|
open\-url https://git.rootiest.dev/rootiest/fish\-config
|
|
open\-url \-v https://fish.rootiest.fyi/
|
|
.EE
|
|
.PP
|
|
\f[B]Used by:\f[R] \f[CR]repo\-open\f[R]
|
|
.SS rand_string
|
|
.IP
|
|
.EX
|
|
Synopsis: rand_string [COMPONENTS/MODIFIERS]...
|
|
|
|
Generates a random, memorable string using a sequence of specified word
|
|
categories and formatting modifiers. Words are pulled from curated
|
|
plain\-text databases bundled in data/words/.
|
|
|
|
Modifiers like \-\-separator and \-\-case are evaluated sequentially and
|
|
apply only to the components that follow them.
|
|
|
|
Supported Components:
|
|
<category> A bundled word list (e.g. adjective, animal, color, name, noun, verb)
|
|
digits=<N> N random digits (e.g. digits=3 \-> 842)
|
|
literal=<text> A static string component (e.g. literal=TEST)
|
|
|
|
Arguments:
|
|
\-s, \-\-separator=<sep> Delimiter for subsequent words (dash, underscore, dot, none, or literal chars)
|
|
\-c, \-\-case=<casing> Casing for subsequent words (lower, upper, title)
|
|
\-h, \-\-help Show usage help
|
|
|
|
Exit Status:
|
|
0 String generated successfully
|
|
1 Unknown category or missing word list file
|
|
|
|
Notes:
|
|
Falls back to random choice if GNU shuf is missing, but shuf is
|
|
much faster for files with >1000 lines.
|
|
|
|
Example:
|
|
rand_string adjective animal
|
|
rand_string \-\-case=title color animal \-\-separator=dot digits=4
|
|
rand_string literal=TEST \-\-separator=underscore verb noun
|
|
.EE
|
|
.SS replay
|
|
.IP
|
|
.EX
|
|
Synopsis: replay <commands>
|
|
|
|
Runs the given commands in Bash and replays any resulting environment
|
|
variable, alias, and directory changes back into the current Fish
|
|
session. Useful for sourcing Bash\-only scripts.
|
|
|
|
Arguments:
|
|
commands Bash command string to execute and replay
|
|
|
|
Exit Status:
|
|
0 Commands ran successfully and changes were replayed
|
|
1 Bash command exited with a non\-zero status
|
|
|
|
Example:
|
|
replay \(dqsource \(ti/.bashrc\(dq
|
|
replay \(dqexport FOO=bar\(dq
|
|
.EE
|
|
.SS repo\-open
|
|
.IP
|
|
.EX
|
|
Synopsis: repo\-open [\-p|\-\-print] [\-r|\-\-root]
|
|
repo\-open \-\-help
|
|
|
|
Opens the web page for the current repository\(aqs origin remote in a
|
|
browser (via open\-url). Deep\-links to the current branch when it exists
|
|
on the remote, falling back to the remote\(aqs default branch (main/master)
|
|
otherwise, and to the current sub\-directory when invoked below the repo
|
|
root.
|
|
|
|
The remote URL is normalized from both HTTPS and SSH/scp forms
|
|
(git\(athost:owner/repo.git, ssh://\&..., https://\&...). The web path layout is
|
|
provider\-specific; the provider is resolved in this order:
|
|
|
|
1. git config browse.provider (per\-repo or \-\-global override)
|
|
2. Hostname heuristic (github / gitlab / gitea / bitbucket;
|
|
codeberg → gitea)
|
|
3. Default: github\-style layout
|
|
|
|
For a self\-hosted host the heuristic can\(aqt classify (e.g. a Gitea or
|
|
GitLab instance on a custom domain), set the provider once:
|
|
|
|
git config browse.provider gitea
|
|
|
|
Arguments:
|
|
\-p, \-\-print Print the resolved URL instead of opening it
|
|
\-r, \-\-root Ignore the current sub\-directory; link to the repo root
|
|
\-h, \-\-help Print usage and exit
|
|
|
|
Exit Status:
|
|
0 URL opened, or resolved with \-p/\-\-print
|
|
1 Not a git repo, no origin remote, or browser launch failed
|
|
|
|
Returns:
|
|
With \-p/\-\-print, the resolved repository URL, printed to stdout
|
|
|
|
Notes:
|
|
Typo abbreviation: open\-repo (expands to repo\-open on space/enter).
|
|
|
|
Example:
|
|
repo\-open # open current branch (+ subdir) in browser
|
|
repo\-open \-\-print # just print the URL
|
|
repo\-open \-\-root # repo home page for the current branch
|
|
.EE
|
|
.PP
|
|
\f[B]Dependencies:\f[R] \f[CR]open\-url\f[R]
|
|
.SS tmux\-clean
|
|
.IP
|
|
.EX
|
|
Synopsis: tmux\-clean
|
|
|
|
Kills all detached (unattached) tmux sessions, leaving any currently
|
|
attached sessions running.
|
|
|
|
Example:
|
|
tmux\-clean
|
|
.EE
|
|
.SS wake\-lock
|
|
.IP
|
|
.EX
|
|
Synopsis: wake\-lock <command> [args...]
|
|
|
|
Runs a command under systemd\-inhibit to prevent the system from idling
|
|
or sleeping for the duration of the command.
|
|
|
|
Arguments:
|
|
command Command to run with sleep inhibition active
|
|
args... Arguments forwarded to the command
|
|
|
|
Exit Status:
|
|
0 Command ran and completed
|
|
1 No command provided
|
|
|
|
Example:
|
|
wake\-lock rsync \-avz src/ dest/
|
|
.EE
|
|
.SH 6. DEPENDENCY CATALOG
|
|
\f[CR]fish\-deps\f[R] manages these tools.
|
|
Run \f[CR]fish\-deps\f[R] to check status, \f[CR]fish\-deps install\f[R]
|
|
to install missing Required/Recommended ones, or add
|
|
\f[CR]\-\-optional\f[R], \f[CR]\-\-terminals\f[R], or \f[CR]\-\-all\f[R]
|
|
to also include the Optional and/or Terminal Emulators tiers.
|
|
.SS Required
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Tool
|
|
T}@T{
|
|
Description
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]fish\f[R]
|
|
T}@T{
|
|
Fish shell >= 4.0
|
|
T}
|
|
T{
|
|
\f[CR]fzf\f[R]
|
|
T}@T{
|
|
Fuzzy finder
|
|
T}
|
|
.TE
|
|
.SS Recommended
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
lw(35.0n) lw(35.0n).
|
|
T{
|
|
Tool
|
|
T}@T{
|
|
Description
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]cargo\f[R]
|
|
T}@T{
|
|
Rust toolchain (via rustup); used by \f[CR]fish\-deps\f[R] to install
|
|
Rust\-based tools and to build fish from source.
|
|
All paths are gated on \f[CR]type \-q cargo\f[R] and degrade gracefully.
|
|
T}
|
|
T{
|
|
\f[CR]starship\f[R]
|
|
T}@T{
|
|
Cross\-shell prompt; loaded via \f[CR]type \-q starship\f[R] guard.
|
|
Without it the Catppuccin nim\-style fallback prompt activates.
|
|
T}
|
|
T{
|
|
\f[CR]uv\f[R]
|
|
T}@T{
|
|
Python package and project manager (Astral); used by the
|
|
fish\-from\-source build path in \f[CR]fish\-deps\f[R].
|
|
All consumers degrade gracefully without it.
|
|
T}
|
|
T{
|
|
\f[CR]direnv\f[R]
|
|
T}@T{
|
|
Per\-directory environment loading; integration is fully guarded with
|
|
\f[CR]type \-q direnv\f[R].
|
|
Without it the \f[CR]direnv\f[R] hook is simply not loaded and
|
|
auto\-venv activates normally.
|
|
T}
|
|
T{
|
|
\f[CR]paru\f[R]
|
|
T}@T{
|
|
AUR helper (Arch only; preferred); guarded throughout \(em non\-Arch
|
|
systems silently skip AUR\-specific paths.
|
|
T}
|
|
T{
|
|
\f[CR]yay\f[R]
|
|
T}@T{
|
|
AUR helper (Arch only; fallback to \f[CR]paru\f[R]); same guards apply.
|
|
T}
|
|
T{
|
|
\f[CR]eza\f[R]
|
|
T}@T{
|
|
Modern \f[CR]ls\f[R] replacement
|
|
T}
|
|
T{
|
|
\f[CR]zoxide\f[R]
|
|
T}@T{
|
|
Smart cd with frecency
|
|
T}
|
|
T{
|
|
\f[CR]lsd\f[R]
|
|
T}@T{
|
|
\f[CR]ls\f[R] replacement (fallback to \f[CR]eza\f[R])
|
|
T}
|
|
T{
|
|
\f[CR]bat\f[R]
|
|
T}@T{
|
|
Syntax\-highlighted \f[CR]cat\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]ov\f[R]
|
|
T}@T{
|
|
Modern pager (replaces \f[CR]less\f[R]); also backs the \f[CR]logs\f[R]
|
|
viewer.
|
|
Not a Rust crate, despite the name collision with an unrelated
|
|
\f[CR]ov\f[R] crate on crates.io.
|
|
Prefers \f[CR]go install github.com/noborus/ov\(atlatest\f[R] when
|
|
\f[CR]go\f[R] is available (always gets the latest release, and covers
|
|
distros like Debian/Ubuntu that don\(cqt package \f[CR]ov\f[R] in their
|
|
base repos); falls back to the system PM (AUR on Arch) otherwise.
|
|
T}
|
|
T{
|
|
\f[CR]ripgrep\f[R]
|
|
T}@T{
|
|
Fast line search
|
|
T}
|
|
T{
|
|
\f[CR]trash\f[R]
|
|
T}@T{
|
|
Safe delete (\f[CR]trash\-cli\f[R]); backs the \f[CR]rm\f[R] and
|
|
\f[CR]scrub\f[R] wrappers.
|
|
T}
|
|
T{
|
|
\f[CR]python3\f[R]
|
|
T}@T{
|
|
Standalone interpreter \(em used by the \f[CR]paru\f[R]/\f[CR]yay\f[R]
|
|
log cleaner.
|
|
Note: \f[CR]uv\f[R] does not provide \f[CR]python3\f[R] on PATH, and
|
|
Arch\(cqs base does not include it, so it is listed separately.
|
|
All consumers degrade gracefully without it.
|
|
T}
|
|
.TE
|
|
.SS Optional
|
|
Single\-purpose tools that back one wrapper function (or less) and only
|
|
matter if you already use that specific tool.
|
|
Skipped by \f[CR]fish\-deps install\f[R]/\f[CR]sync\f[R] unless you pass
|
|
\f[CR]\-\-optional\f[R].
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
lw(35.0n) lw(35.0n).
|
|
T{
|
|
Tool
|
|
T}@T{
|
|
Description
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]btop\f[R]
|
|
T}@T{
|
|
Modern resource monitor; backs the \f[CR]top\f[R] wrapper (falls back to
|
|
system \f[CR]top\f[R]).
|
|
T}
|
|
T{
|
|
\f[CR]dust\f[R]
|
|
T}@T{
|
|
Disk usage tree (Rust); one of two backends for the \f[CR]du\f[R]
|
|
wrapper (falls back to system \f[CR]du\f[R]).
|
|
T}
|
|
T{
|
|
\f[CR]duf\f[R]
|
|
T}@T{
|
|
Disk usage/free overview; the other backend for the \f[CR]du\f[R]
|
|
wrapper (falls back to system \f[CR]du\f[R]).
|
|
T}
|
|
T{
|
|
\f[CR]prettyping\f[R]
|
|
T}@T{
|
|
Colorized \f[CR]ping\f[R] wrapper; backs the \f[CR]ping\f[R] wrapper
|
|
(falls back to system \f[CR]ping\f[R]).
|
|
T}
|
|
T{
|
|
\f[CR]go\f[R]
|
|
T}@T{
|
|
Go toolchain; only used to install \f[CR]ov\f[R] via
|
|
\f[CR]go install\f[R] (see below), which gets the latest release and
|
|
doesn\(cqt depend on your distro packaging \f[CR]ov\f[R].
|
|
Package name varies by distro (\f[CR]go\f[R] on Arch/Homebrew,
|
|
\f[CR]golang\f[R]/\f[CR]golang\-go\f[R] on Debian/Fedora) \(em install
|
|
manually if the listed package name doesn\(cqt resolve on your system.
|
|
T}
|
|
T{
|
|
\f[CR]lazygit\f[R]
|
|
T}@T{
|
|
Terminal git UI; only referenced by the \f[CR]lg\f[R] abbreviation.
|
|
T}
|
|
T{
|
|
\f[CR]lazydocker\f[R]
|
|
T}@T{
|
|
Terminal docker UI; backs the \f[CR]ld\f[R] wrapper.
|
|
T}
|
|
T{
|
|
\f[CR]docker\f[R]
|
|
T}@T{
|
|
Container runtime; gates the Docker context indicator in the right
|
|
prompt and backs the \f[CR]ld\f[R] wrapper.
|
|
Both consumers are guarded with \f[CR]type \-q docker\f[R] and degrade
|
|
gracefully without it.
|
|
Installing the daemon package does not enable/start the service \(em do
|
|
that yourself if you want it running.
|
|
T}
|
|
T{
|
|
\f[CR]yt\-dlp\f[R]
|
|
T}@T{
|
|
Video/media downloader; backs the \f[CR]yt\-dlp\f[R] wrapper function.
|
|
The wrapper falls back to the system \f[CR]yt\-dlp\f[R] and the rest of
|
|
the config works without it.
|
|
T}
|
|
T{
|
|
\f[CR]screen\f[R]
|
|
T}@T{
|
|
GNU screen; fallback backend for \f[CR]jobrunner\f[R] when
|
|
\f[CR]tmux\f[R] is unavailable.
|
|
T}
|
|
.TE
|
|
.SS Terminal Emulators
|
|
GPU\-accelerated terminal emulators.
|
|
Only one is ever relevant to a given user \(em the one matching
|
|
\f[CR]$TERM\f[R] \(em so neither is installed by default.
|
|
Skipped by \f[CR]fish\-deps install\f[R]/\f[CR]sync\f[R] unless you pass
|
|
\f[CR]\-\-terminals\f[R] (or \f[CR]\-\-all\f[R]).
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
lw(35.0n) lw(35.0n).
|
|
T{
|
|
Tool
|
|
T}@T{
|
|
Description
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]kitty\f[R]
|
|
T}@T{
|
|
GPU\-accelerated terminal; unlocks kitty\-specific abbreviations and
|
|
\f[CR]\-\-hyperlink\-format=kitty\f[R] in the \f[CR]rg\f[R] wrapper when
|
|
\f[CR]$TERM = xterm\-kitty\f[R].
|
|
T}
|
|
T{
|
|
\f[CR]wezterm\f[R]
|
|
T}@T{
|
|
GPU\-accelerated terminal; unlocks WezTerm\-specific abbreviations when
|
|
it\(cqs the active terminal.
|
|
T}
|
|
.TE
|
|
.SS Integrations
|
|
Opt\-in third\-party services that require their own account/setup.
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
l l.
|
|
T{
|
|
Tool
|
|
T}@T{
|
|
Description
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]wakatime\f[R]
|
|
T}@T{
|
|
Developer time tracking
|
|
T}
|
|
T{
|
|
\f[CR]tailscale\f[R]
|
|
T}@T{
|
|
Mesh VPN client
|
|
T}
|
|
.TE
|
|
.SS Install Methods
|
|
The install priority for each tool:
|
|
.PP
|
|
.TS
|
|
tab(@);
|
|
lw(35.0n) lw(35.0n).
|
|
T{
|
|
Method
|
|
T}@T{
|
|
Packages
|
|
T}
|
|
_
|
|
T{
|
|
\f[CR]cargo\f[R]
|
|
T}@T{
|
|
Rust tools (\f[CR]eza\f[R], \f[CR]lsd\f[R], \f[CR]bat\f[R],
|
|
\f[CR]dust\f[R], \f[CR]ripgrep\f[R], \f[CR]trashy\f[R],
|
|
\f[CR]zoxide\f[R], \f[CR]starship\f[R]) \(em always gets the latest
|
|
crate version
|
|
T}
|
|
T{
|
|
\f[CR]go install\f[R]
|
|
T}@T{
|
|
\f[CR]ov\f[R] \(em preferred over the system PM when \f[CR]go\f[R] is
|
|
available; always gets the latest release
|
|
T}
|
|
T{
|
|
system PM
|
|
T}@T{
|
|
\f[CR]paru\f[R] / \f[CR]apt\f[R] / \f[CR]brew\f[R] / \f[CR]dnf\f[R] /
|
|
etc.
|
|
\(em for tools without a crate or \f[CR]go install\f[R] path
|
|
T}
|
|
T{
|
|
\f[CR]git clone\f[R]
|
|
T}@T{
|
|
\f[CR]fzf\f[R] \(em installed from GitHub to \f[CR]\(ti/.fzf/\f[R]
|
|
T}
|
|
T{
|
|
\f[CR]curl\f[R]
|
|
T}@T{
|
|
\f[CR]starship\f[R] installer, \f[CR]fisher\f[R] bootstrap,
|
|
\f[CR]uv\f[R] installer
|
|
T}
|
|
.TE
|
|
.PP
|
|
* * * * *
|
|
.SH 7. CUSTOMIZATION
|
|
This section explains how to adapt the configuration to your specific
|
|
workflow, including local machine overrides and opinionated component
|
|
toggles.
|
|
.SS Machine\-local Configuration
|
|
Place machine\-specific settings that should not be committed to git in:
|
|
.IP
|
|
.EX
|
|
$__fish_user_dots_path/local.fish
|
|
.EE
|
|
.PP
|
|
\f[CR]__fish_user_dots_path\f[R] defaults to
|
|
\f[CR]\(ti/.config/.user\-dots/fish\f[R].
|
|
Set a custom location with:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_user_dots_path /path/to/your/dots/fish
|
|
.EE
|
|
.PP
|
|
Typical uses: additional PATH entries, local aliases, hostname\-specific
|
|
env vars, work\-specific tool configs.
|
|
.PP
|
|
For convenience, a git\-ignored \f[CR]user\-dots\f[R] symlink in the
|
|
fish config directory tracks \f[CR]$__fish_user_dots_path\f[R] so the
|
|
overlay can be browsed from \f[CR]\(ti/.config/fish/\f[R].
|
|
It is created if missing and repointed if the path changes.
|
|
Opt out by setting \f[CR]__fish_user_dots_symlink\f[R] to a falsy value,
|
|
or toggling \(lqDots link\(rq off on the \f[CR]config\-settings\f[R]
|
|
Paths page \(em this stops generation and removes any existing link.
|
|
It only ever manages a symlink and never clobbers a real file or
|
|
directory at that path.
|
|
.SS Secrets and API Keys
|
|
.IP
|
|
.EX
|
|
$__fish_user_dots_path/secrets.fish
|
|
.EE
|
|
.PP
|
|
Store API tokens, GPG keys, private credentials here.
|
|
This file is never committed.
|
|
It is sourced by \f[CR]local.fish\f[R] directly, not by
|
|
\f[CR]config.fish\f[R].
|
|
.PP
|
|
\f[CR]local.fish\f[R] is sourced at the end of \f[CR]config.fish\f[R] on
|
|
every interactive session, so it and its companion
|
|
\f[CR]secrets.fish\f[R] can override anything set earlier.
|
|
.SS Overriding Configuration Variables
|
|
Any variable set in \f[CR]local.fish\f[R] after the main config loads
|
|
takes effect.
|
|
Example: to increase the scrollback history limit:
|
|
.IP
|
|
.EX
|
|
# in local.fish
|
|
set \-gx SCROLLBACK_HISTORY_MAX_FILES 200
|
|
.EE
|
|
.SS Fish Universal Variables
|
|
Some settings (\f[CR]fzf\f[R] colors, theme) are stored in
|
|
\f[CR]fish_variables\f[R] via \f[CR]set \-U\f[R].
|
|
These are machine\-local and git\-ignored.
|
|
Do not commit \f[CR]fish_variables\f[R].
|
|
.SS Opinionated Components (Minimal Mode)
|
|
Every opinionated piece of this config is active by default but can be
|
|
switched off through six category opt\-out variables, each evaluated via
|
|
\f[CR]__fish_variable_check\f[R].
|
|
Set a variable to any falsy value (0, false, no, off, n) to disable its
|
|
category; erase it or set a truthy value (1, true, yes, on, y) to
|
|
re\-enable.
|
|
Unset means enabled \(em except for C5 logging, which is opt\-in (see
|
|
below).
|
|
.PP
|
|
An explicit per\-category truthy value takes precedence over the master
|
|
switch: setting \f[CR]__fish_config_opinionated\f[R]=0 disables all
|
|
unset categories, but a category with an explicit truthy value remains
|
|
enabled regardless.
|
|
.PP
|
|
C5 (logging) is the one exception to \(lqunset means enabled\(rq.
|
|
Because it writes terminal output to disk, it is opt\-in: unset means
|
|
disabled, and the master switch cannot enable it.
|
|
Only an explicit truthy value turns logging on.
|
|
.IP
|
|
.EX
|
|
Variable Disables
|
|
────────────────────────────────────────
|
|
__fish_config_op_aliases Command shadows and flag injection:
|
|
ls\->eza, cat\->bat, cd\->zoxide,
|
|
rm\->trash, less\->ov, top\->btop,
|
|
ping\->prettyping, ssh\->kitten,
|
|
du\->duf/dust, mkdir/bash wrappers,
|
|
history timestamps, grep/cp/mv/wget
|
|
flag injection, help intercept, claude
|
|
AGENTS.md auto\-link
|
|
__fish_config_op_autoexec Startup side\-effects: Fisher
|
|
bootstrap, theme apply, paru/yay
|
|
wrapper generation, auto venv
|
|
activation, WakaTime hook
|
|
__fish_config_op_overrides Key and env overrides: Vi mode,
|
|
exit\->smart_exit, PAGER/MANPAGER,
|
|
CDPATH, bang\-bang system, autopair,
|
|
puffer, starship prompt, theme
|
|
colors, FZF_DEFAULT_OPTS, right
|
|
prompt
|
|
__fish_config_op_integrations Terminal/tool coupling: Kitty/
|
|
WezTerm window abbreviations, done
|
|
notifications, spwin/tab/split,
|
|
hist, logs, upgrade, WakaTime
|
|
__fish_config_op_logging Logging & capture (OPT\-IN \(em this one
|
|
is off unless explicitly enabled):
|
|
scrollback capture on exit, paru/yay
|
|
AUR log wrappers, Kitty watcher
|
|
capture; sentinel file coordinates
|
|
cross\-process state
|
|
__fish_config_op_greeting Greeting & first\-run UI: per\-session
|
|
fish_greeting override (defines empty
|
|
function late in config.fish to
|
|
suppress distro greetings such as
|
|
CachyOS fastfetch); first\-run welcome
|
|
banner in conf.d/first_run.fish
|
|
.EE
|
|
.PP
|
|
Examples:
|
|
.IP
|
|
.EX
|
|
# Disable command shadows only (rm becomes plain rm again):
|
|
set \-U __fish_config_op_aliases off
|
|
|
|
# Turn session logging on (opt\-in; off until you do this):
|
|
set \-U __fish_config_op_logging on
|
|
|
|
# Full minimal mode \(em disable all six categories at once:
|
|
set \-U __fish_config_opinionated 0
|
|
|
|
# Re\-enable everything (except C5 logging, which stays opt\-in):
|
|
set \-Ue __fish_config_opinionated
|
|
|
|
# Minimal mode but keep the greeting:
|
|
set \-U __fish_config_opinionated 0
|
|
set \-U __fish_config_op_greeting 1
|
|
# (erase both to go back to full\-flavor defaults)
|
|
.EE
|
|
.PP
|
|
For an interactive alternative to setting these variables by hand, run
|
|
\f[CR]config\-settings\f[R] \(em a full\-screen TUI that flips any
|
|
category (including C5 logging) on or off, per session or universally.
|
|
See its entry in Section 5.
|
|
.PP
|
|
NOTE: \- Command shadows (rm, cat, ls, \&...)
|
|
react immediately; conf.d\-level components (bindings, prompt,
|
|
abbreviations, hooks) take effect in new shells.
|
|
\- With aliases disabled, rm falls back to bare \f[CR]command rm\f[R]
|
|
\(em files are deleted permanently, not trashed.
|
|
\- Disabled integration commands (\f[CR]spwin\f[R], \f[CR]tab\f[R],
|
|
\f[CR]split\f[R], \f[CR]hist\f[R], \f[CR]logs\f[R], \f[CR]upgrade\f[R])
|
|
print an error naming the variable that disabled them.
|
|
\- On CachyOS, the distro fish config\(cqs own aliases, history
|
|
override, and bang\-bang bindings are stripped per category as well.
|
|
.SS Sub\-categories
|
|
Each of the six categories further sub\-divides into two to six
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_<category>_<subcategory>\f[R] variable
|
|
(e.g.\ \f[CR]__fish_config_op_aliases_filesystem\f[R]).
|
|
These follow the exact same truthy/falsy/unset cascade one level deeper:
|
|
an explicit sub\-category value overrides the master switch and the
|
|
parent category\(cqs setting, and an unset sub\-category inherits from
|
|
its parent category (which in turn inherits from
|
|
\f[CR]__fish_config_opinionated\f[R]).
|
|
Run \f[CR]config\-settings\f[R] and press Enter on a category row to
|
|
browse and toggle its sub\-categories interactively.
|
|
See Components Reference for the full sub\-category breakdown of every
|
|
category.
|
|
.SS Agent Memory Vault
|
|
.IP
|
|
.EX
|
|
__fish_agent_vault_dir
|
|
|
|
Overrides the agent memory vault location. Defaults to
|
|
$XDG_DATA_HOME/agent\-vault (or \(ti/.local/share/agent\-vault).
|
|
|
|
__fish_agent_vault_autopush
|
|
|
|
When set to 1, agents\-vault also pushes on wrapper launch. Defaults to
|
|
off: the vault commits locally on every launch and pushes from the
|
|
Claude Code SessionEnd hook or an explicit agents\-vault \-\-push. That
|
|
push is synchronous, so with autopush on the pull and the push are
|
|
each capped at 20 seconds; an explicit \-\-push is left uncapped.
|
|
.EE
|
|
.PP
|
|
NOTE: With autopush off and no SessionEnd hook installed, backups
|
|
accumulate locally and never reach the remote.
|
|
Run \f[CR]agents\-vault \-\-status\f[R] to check how far ahead the vault
|
|
is.
|
|
.SS Prompt and Theme
|
|
.SS Starship
|
|
The primary prompt is Starship, initialized by
|
|
\f[CR]conf.d/starship.fish\f[R].
|
|
Configure it via \f[CR]\(ti/.config/starship.toml\f[R].
|
|
.PP
|
|
\f[CR]conf.d/starship.fish\f[R] defines a \f[CR]fish_prompt\f[R] wrapper
|
|
that only activates when \f[CR]starship\f[R] is in PATH and C3 overrides
|
|
are enabled (see Opinionated Components above).
|
|
It emits OSC 133;A (prompt start) immediately before Starship renders
|
|
and OSC 133;B (input start) immediately after, placing both markers on
|
|
the prompt line itself.
|
|
This allows ov to use them as sticky section headers when browsing
|
|
scrollback logs.
|
|
It also prints a blank line before the prompt, skipped in private mode
|
|
or on a freshly cleared screen.
|
|
Without Starship, fish\(cqs built\-in prompt handles these markers
|
|
automatically.
|
|
.SS Catppuccin Fallback Prompt
|
|
When Starship is absent or C3 overrides are disabled, a built\-in
|
|
nim\-style two\-line prompt activates from
|
|
\f[CR]functions/fish_prompt.fish\f[R].
|
|
No external dependencies \(em fish builtins only.
|
|
.PP
|
|
Layout (a dim job line appears between the two rows for each running
|
|
background job):
|
|
.IP
|
|
.EX
|
|
┬─[user\(athost:\(ti/path] (main)
|
|
│ nvim notes.md
|
|
╰─>$
|
|
.EE
|
|
.PP
|
|
Elements:
|
|
.IP
|
|
.EX
|
|
Segment Meaning
|
|
────────────────────────────────────────────────────────────────
|
|
user Yellow (Catppuccin Yellow); red if root
|
|
\(athost Blue (local) or Teal (SSH)
|
|
\(ti/path prompt_pwd abbreviation (Catppuccin Text)
|
|
─[N/I/R/V/O] Vi\-mode indicator (Normal/Insert/Replace/Visual/Operator);
|
|
shown only when vi or hybrid key bindings are active
|
|
─[V:name] Active Python venv basename; omitted when none
|
|
(main) Current git branch in Catppuccin Pink, with ↑/↓
|
|
upstream\-tracking arrows when applicable;
|
|
omitted outside repos
|
|
┬─ / ╰─> Connector lines: Catppuccin Green on success,
|
|
Red on failure
|
|
.EE
|
|
.PP
|
|
The right prompt (\f[CR]fish_right_prompt.fish\f[R]) always renders,
|
|
independently of which left prompt is active:
|
|
.IP
|
|
.EX
|
|
Segment Shown when
|
|
────────────────────────────────────────────────────────────────
|
|
✘ <code> The previous command exited non\-zero (red)
|
|
<context> docker and starship are both installed, C3
|
|
overrides are enabled, and the active Docker
|
|
context is set and non\-default
|
|
<timestamp> Always (dim, Catppuccin Overlay0)
|
|
.EE
|
|
.PP
|
|
The exit\-status and Docker segments are independent \(em for example,
|
|
right after a failing command with a non\-default Docker context active:
|
|
.IP
|
|
.EX
|
|
✘ 1 myctx Fri Jun 12 00:51:21 2026
|
|
.EE
|
|
.PP
|
|
A successful command with the same Docker context shows the segment too:
|
|
.IP
|
|
.EX
|
|
myctx Fri Jun 12 00:51:21 2026
|
|
.EE
|
|
.PP
|
|
And without Starship (or with C3 disabled, or Docker not installed),
|
|
only the exit\-status prefix and timestamp ever appear:
|
|
.IP
|
|
.EX
|
|
✘ 1 Fri Jun 12 00:51:21 2026
|
|
.EE
|
|
.SS FZF
|
|
FZF is themed to Catppuccin Mocha via \f[CR]FZF_DEFAULT_OPTS\f[R], set
|
|
in \f[CR]conf.d/theme.fish\f[R] (opinionated; disabled by
|
|
\f[CR]__fish_config_op_overrides\f[R], see Opinionated Components
|
|
above).
|
|
The colors applied:
|
|
.IP
|
|
.EX
|
|
Hex Role Catppuccin name
|
|
────────────────────────────────────────────────────────
|
|
#1E1E2E Background Base
|
|
#313244 Highlighted background Surface0
|
|
#45475A Selected background Surface1
|
|
#CDD6F4 Foreground Text
|
|
#F38BA8 Highlight / header Red
|
|
#CBA6F7 Info / prompt Mauve
|
|
#B4BEFE Marker Lavender
|
|
#F5E0DC Spinner / pointer Rosewater
|
|
#6C7086 Border Overlay0
|
|
.EE
|
|
.PP
|
|
To customize, override \f[CR]FZF_DEFAULT_OPTS\f[R] in
|
|
\f[CR]local.fish\f[R] \(em it is sourced after
|
|
\f[CR]conf.d/theme.fish\f[R] on every session, so a
|
|
\f[CR]set \-Ux FZF_DEFAULT_OPTS ...\f[R] there always wins.
|
|
.SS Catppuccin Mocha Syntax Highlighting
|
|
The Catppuccin Mocha theme ships with this config in themes/ and is
|
|
applied automatically on first run via \f[CR]conf.d/first_run.fish\f[R]
|
|
(gated by \f[CR]__fish_config_op_autoexec\f[R]; see Opinionated
|
|
Components above).
|
|
Colors are stored in \f[CR]fish_variables\f[R] (universal).
|
|
Three other bundled variants are available in themes/ \(em Latte,
|
|
Frappé, and Macchiato.
|
|
To switch:
|
|
.IP
|
|
.EX
|
|
fish_config theme choose \(dqCatppuccin Latte\(dq
|
|
.EE
|
|
.PP
|
|
* * * * *
|
|
.SH 8. COMPONENTS REFERENCE
|
|
The following tables detail every component in each category.
|
|
Use this reference to understand exactly which behaviors change when you
|
|
toggle a category variable.
|
|
.IP
|
|
.EX
|
|
Category Description
|
|
──────────────────────────────────────────────────────────────────────────
|
|
C1 Command Shadows \(em Wraps destructive commands (rm, cp) to be safe by default
|
|
C2 Startup Side\-Effects \(em Bootstraps Fisher, generates wrappers, auto\-activates venvs
|
|
C3 Overrides \(em Overrides cd, sets Vi mode, binds <CR> to smart_enter
|
|
C4 Integrations \(em Kitty/Wezterm integrations, starship hooks, fzf theme
|
|
C5 Logging and Capture \(em Session logs, command duration
|
|
C6 Greeting & First\-Run UI \(em Custom startup banner
|
|
.EE
|
|
.PP
|
|
Each category further sub\-divides into two to six sub\-categories (25
|
|
in total) with their own
|
|
\f[CR]__fish_config_op_<category>_<subcategory>\f[R] toggles \(en see
|
|
that category\(cqs page for its sub\-category list.
|
|
.SS Per\-function overrides: \f[CR]C0\f[R]/\f[CR]always\f[R]
|
|
Every guarded function or file can also carry a reserved
|
|
\f[CR]always/on\f[R] or \f[CR]always/off\f[R] tag in its
|
|
\f[CR]# COMPONENT\f[R] header, independent of every C1\-C6 category and
|
|
sub\-category toggle and invisible to \f[CR]config\-settings\f[R].
|
|
An \f[CR]always/off\f[R] tag disables that function unconditionally; an
|
|
\f[CR]always/on\f[R] tag enables it unconditionally, ignoring the state
|
|
of every other tagged sub\-category.
|
|
This is a per\-function escape hatch for cases too granular or too
|
|
idiosyncratic to justify a taxonomy entry \(en edit the header directly
|
|
and run \f[CR]__fish_config_op_registry_rebuild\f[R] to apply the
|
|
change.
|
|
.SS C1 \(em Command Shadows
|
|
Disabling \f[CR]__fish_config_op_aliases\f[R] restores standard system
|
|
behavior for all of these commands.
|
|
.IP
|
|
.EX
|
|
Command / Alias Active behavior Disabled fallback
|
|
───────────────────────────────────────────────────────────────────────────
|
|
ls eza \-l \-a \-\-icons \-\-hyperlink system ls
|
|
cat bat syntax\-highlighted; dirs → ls /usr/bin/cat
|
|
cd zoxide frecency\-based navigation fish builtin cd
|
|
rm moves files to trash (recoverable) command rm (permanent)
|
|
less $PAGER → ov → less → more → cat system less
|
|
du duf (disk overview) or dust (dir tree) system du
|
|
top btop resource monitor system top
|
|
ping prettyping \-\-nolegend animation system ping
|
|
ssh kitten ssh in Kitty terminal system ssh
|
|
rg rg \-\-hyperlink\-format=kitty system rg
|
|
mkdir verbose path\-tree display on creation mkdir \-p silently
|
|
bash XDG bashrc + $SHELL reset on exit system bash
|
|
history timestamps prepended to every entry fish builtin history
|
|
cp / mv forced \-i confirmation prompt cp / mv unmodified
|
|
wget forced \-\-continue (resume downloads) system wget
|
|
grep/fgrep/egrep forced \-\-color=auto system grep variants
|
|
dir / vdir forced \-\-color=auto system dir / vdir
|
|
help config intercepts \(dqhelp config\(dq → config\-help fish builtin help
|
|
claude auto\-links AGENTS.md as CLAUDE.md before launch command claude
|
|
edit multi\-editor launcher (GUI/term + fallbacks) $EDITOR/nvim/nano/vi
|
|
.EE
|
|
.PP
|
|
When C1 is disabled, \f[CR]rm\f[R] uses bare \f[CR]command rm\f[R] with
|
|
no wrapper \(em files are permanently deleted, not trashed.
|
|
There is no intermediate safety net.
|
|
.SS Sub\-categories
|
|
\f[CR]__fish_config_op_aliases\f[R] sub\-divides into six
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_aliases_<slug>\f[R] toggle:
|
|
.SS filesystem
|
|
\f[CR]ls\f[R], \f[CR]cat\f[R], \f[CR]cd\f[R], \f[CR]du\f[R],
|
|
\f[CR]mkdir\f[R], \f[CR]rm\f[R], \f[CR]mv\f[R], and \f[CR]cd\f[R]/zoxide
|
|
navigation \(en the everyday filesystem\-inspection and \-modification
|
|
shadows.
|
|
.SS search
|
|
\f[CR]rg\f[R], with its Kitty hyperlink formatting.
|
|
.SS network
|
|
\f[CR]ping\f[R], \f[CR]ssh\f[R], and \f[CR]yt\-dlp\f[R] \(en shadows
|
|
that talk to the network.
|
|
.SS monitor
|
|
\f[CR]top\f[R] \-> \f[CR]btop\f[R].
|
|
.SS shell\-tools
|
|
\f[CR]bash\f[R] (XDG bashrc + \f[CR]$SHELL\f[R] reset), \f[CR]less\f[R]
|
|
(\f[CR]$PAGER\f[R] fallback chain), and the \f[CR]help config\f[R]
|
|
interception.
|
|
.SS dev\-tools
|
|
\f[CR]claude\f[R] (\f[CR]AGENTS.md/CLAUDE.md\f[R] auto\-linking) and
|
|
\f[CR]edit\f[R] (multi\-editor launcher), plus \f[CR]agy\f[R].
|
|
.SS C2 \(em Startup Side\-Effects
|
|
These run automatically without any user action.
|
|
Disabling \f[CR]__fish_config_op_autoexec\f[R] prevents all of them.
|
|
.IP
|
|
.EX
|
|
Component Trigger What it does
|
|
───────────────────────────────────────────────────────────────────────────
|
|
Fisher bootstrap First shell only Downloads and installs fisher
|
|
Fisher update After bootstrap Installs all fish_plugins entries
|
|
Catppuccin Mocha theme First shell only Applies theme via fish_config
|
|
paru wrapper Every startup Writes \(ti/.local/bin/paru wrapper
|
|
yay wrapper Every startup Writes \(ti/.local/bin/yay wrapper
|
|
Python venv activation On every cd Sources .venv/bin/activate.fish
|
|
WakaTime command hook On every command Reports to WakaTime API
|
|
Auto\-pull fast\-forward On entering a repo Background ff\-only git pull
|
|
user\-dots symlink Every startup Links $__fish_config_dir/user\-dots
|
|
to $__fish_user_dots_path
|
|
.EE
|
|
.PP
|
|
When C2 is disabled: no Fisher install, no theme application, no
|
|
\f[CR]paru\f[R]/\f[CR]yay\f[R] wrapper generation, no automatic venv
|
|
activation, no WakaTime reporting, no \f[CR]auto\-pull\f[R] (the PWD
|
|
handler is never registered), and the user\-dots convenience symlink is
|
|
not created.
|
|
The symlink is git\-ignored and only ever managed as a symlink \(em a
|
|
real file or directory at that path is left untouched.
|
|
The symlink has its own opt\-out independent of C2: set
|
|
\f[CR]__fish_user_dots_symlink\f[R] to a falsy value (or toggle \(lqDots
|
|
link\(rq off on the \f[CR]config\-settings\f[R] Paths page) to stop
|
|
generating it and remove any existing link \(em honoured even when C2 is
|
|
enabled.
|
|
Managed by the \f[CR]__fish_user_dots_link\f[R] helper.
|
|
The first\-run completion marker
|
|
(\f[CR]__fish_config_first_run_complete\f[R]) is still set so the init
|
|
does not re\-run on subsequent shells.
|
|
.PP
|
|
Python venv activation fires on every directory change.
|
|
If a directory uses \f[CR]direnv\f[R] (\f[CR].envrc\f[R] present),
|
|
\f[CR]direnv\f[R] takes priority and auto\-venv is skipped for that
|
|
directory.
|
|
.PP
|
|
Auto\-pull fast\-forwards opted\-in repositories in the background when
|
|
you cd into them.
|
|
The fish\-config repo is always covered; other repos are added with the
|
|
\f[CR]auto\-pull\f[R] command (see its entry in the functions
|
|
reference).
|
|
It only ever fast\-forwards a clean repo whose branch has an upstream
|
|
\(em never rebases, merges, or overwrites work \(em so it is a no\-op on
|
|
dirty trees, divergent branches, or repos without a remote.
|
|
The handler fires once per repo entry (not on every sub\-directory
|
|
\f[CR]cd\f[R]).
|
|
The registry is machine\-local at
|
|
\f[CR]$__fish_user_dots_path/auto\-pull.list\f[R] (defaults to
|
|
\f[CR]\(ti/.config/.user\-dots/fish/auto\-pull.list\f[R]) and is never
|
|
committed.
|
|
.SS Sub\-categories
|
|
\f[CR]__fish_config_op_autoexec\f[R] sub\-divides into five
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_autoexec_<slug>\f[R] toggle:
|
|
.SS plugin\-management
|
|
Fisher bootstrap on first run.
|
|
.SS pkg\-wrappers
|
|
\f[CR]paru\f[R]/\f[CR]yay\f[R] wrapper generation.
|
|
.SS venv
|
|
Automatic Python virtualenv activation.
|
|
.SS telemetry
|
|
The WakaTime hook\(cqs startup bootstrap.
|
|
.SS sync
|
|
Auto\-pull background fast\-forward, and the user\-dots convenience
|
|
symlink.
|
|
.SS C3 \(em Key and Environment Overrides
|
|
These change fundamental shell behavior: how keys work, which pager
|
|
opens, and what the prompt looks like.
|
|
Disabling \f[CR]__fish_config_op_overrides\f[R] removes all of them.
|
|
.IP
|
|
.EX
|
|
Override What it replaces or sets
|
|
───────────────────────────────────────────────────────────────────────────
|
|
Vi mode fish_vi_key_bindings replaces default Emacs mode
|
|
PATH setup Prepends custom bin directories to the PATH
|
|
exit → smart_exit exit wrapper that captures scrollback before closing
|
|
PAGER=ov ov used by git, man, and all $PAGER\-aware tools
|
|
EDITOR=nvim nvim fallback to vi for git commit, etc.
|
|
GPG_TTY Sets GPG_TTY to current terminal tty
|
|
MANPAGER=bat pipeline man pages rendered with syntax highlighting
|
|
CDPATH=. \(ti/projects \(ti bare dir names resolve against \(ti/projects and \(ti
|
|
Bang\-bang system ! and $ keys expand history; !\(ha, !*, !\-N, !?str?,
|
|
\(haold\(hanew abbreviations; six expand_bang_* helpers
|
|
Autopair ( [ { \(dq \(aq auto\-close to (), [], {}, \(dq\(dq, \(aq\(aq
|
|
Puffer key intercepts . ! $ * keys intercepted for smart expansion
|
|
Starship prompt fish_prompt replaced by Starship + OSC 133 markers
|
|
Catppuccin colors 30+ fish_color_* variables set to Mocha palette
|
|
FZF_DEFAULT_OPTS FZF themed to Catppuccin Mocha colors
|
|
Right prompt fish_right_prompt: exit code (on failure) + dim timestamp; always rendered; Docker context added when starship+C3 active
|
|
DO_NOT_TRACK=1 Universal telemetry opt\-out for tools and AI agents
|
|
DISABLE_TELEMETRY=1 Telemetry opt\-out for telemetry\-aware CLIs
|
|
.EE
|
|
.PP
|
|
The bang\-bang system spans \f[CR]key_bindings.fish\f[R],
|
|
\f[CR]abbr.fish\f[R], \f[CR]puffer.fish\f[R], and six
|
|
\f[CR]expand_bang_*.fish\f[R] functions.
|
|
All are gated together \(em disabling C3 removes the entire
|
|
bang\-expansion system at once.
|
|
.PP
|
|
When C3 is disabled, \f[CR]exit\f[R] falls back to
|
|
\f[CR]builtin exit\f[R] with no scrollback capture, no Kitty IPC, and no
|
|
file I/O on exit.
|
|
The scrollback capture block is independently controlled by C5 (see
|
|
below).
|
|
.SS Sub\-categories
|
|
\f[CR]__fish_config_op_overrides\f[R] sub\-divides into four
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_overrides_<slug>\f[R] toggle:
|
|
.SS key\-bindings
|
|
Vi mode, autopair, puffer key intercepts, bang\-bang history expansion,
|
|
and \f[CR]smart_exit\f[R]\(cqs plain\-exit path.
|
|
.SS environment
|
|
\f[CR]$PATH\f[R],
|
|
\f[CR]$PAGER\f[R]/\f[CR]$EDITOR\f[R]/\f[CR]$GPG_TTY\f[R], and
|
|
\f[CR]$CDPATH\f[R].
|
|
.SS prompt
|
|
Starship, the right prompt, Catppuccin syntax/prompt colors, and FZF
|
|
theming (\f[CR]$FZF_DEFAULT_OPTS\f[R]) \(en all driven by the same guard
|
|
as a single unit, not independently toggleable from each other.
|
|
.SS privacy
|
|
\f[CR]$DO_NOT_TRACK\f[R] and \f[CR]$DISABLE_TELEMETRY\f[R] environment
|
|
variables for telemetry opt\-out across CLI tools, runtimes, and AI
|
|
agents.
|
|
.SS C4 \(em Terminal and Tool Integration
|
|
These features couple the shell to specific external tools.
|
|
Disabling \f[CR]__fish_config_op_integrations\f[R] disables all of them.
|
|
.IP
|
|
.EX
|
|
Component Requires
|
|
───────────────────────────────────────────────────────────────────────────
|
|
≈ 60 Kitty/WezTerm abbrs Active Kitty or WezTerm session
|
|
(:w, :wv, :wh, :t, etc.)
|
|
Done desktop notifications Graphical desktop with a notification daemon
|
|
spwin Kitty or WezTerm
|
|
tab Kitty, WezTerm, or Konsole
|
|
split Kitty or WezTerm
|
|
hist fzf + wl\-copy (Wayland clipboard)
|
|
logs fzf + ov; reads from \(ti/.terminal_history/
|
|
upgrade paru or yay (Arch Linux only)
|
|
WakaTime hook wakatime CLI and a configured API key
|
|
.EE
|
|
.PP
|
|
Disabled integration commands (\f[CR]spwin\f[R], \f[CR]tab\f[R],
|
|
\f[CR]split\f[R], \f[CR]hist\f[R], \f[CR]logs\f[R], \f[CR]upgrade\f[R])
|
|
print a colored error to stderr naming the variable that disabled them
|
|
rather than silently failing.
|
|
.SS Sub\-categories
|
|
\f[CR]__fish_config_op_integrations\f[R] sub\-divides into five
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_integrations_<slug>\f[R] toggle:
|
|
.SS terminal\-abbrs
|
|
The Kitty/WezTerm abbreviation set.
|
|
.SS window\-mgmt
|
|
\f[CR]spwin\f[R], \f[CR]tab\f[R], \f[CR]split\f[R].
|
|
.SS notifications
|
|
\f[CR]done\f[R]\(cqs completion notifications, and the WakaTime activity
|
|
hook.
|
|
.SS history\-logs
|
|
\f[CR]hist\f[R], \f[CR]logs\f[R].
|
|
.SS pkg\-upgrade
|
|
\f[CR]upgrade\f[R].
|
|
.SS C5 \(em Logging and Capture
|
|
Five components capture shell output to disk.
|
|
Unlike every other category, C5 is opt\-in: it stays off until
|
|
\f[CR]__fish_config_op_logging\f[R] is set to an explicit truthy value,
|
|
and a truthy master switch does not enable it.
|
|
While it is off, all capture is skipped and the logging wrappers are
|
|
removed.
|
|
.PP
|
|
CAUTION: This configuration is capable of silently recording terminal
|
|
output and secrets directly to disk.
|
|
See below for details on how this capture mechanism works, where files
|
|
are stored, and how to manage its state.
|
|
.IP
|
|
.EX
|
|
# Turn it on (persistently, in every shell):
|
|
set \-U __fish_config_op_logging on
|
|
|
|
# Turn it back off:
|
|
set \-U __fish_config_op_logging off # or: set \-Ue __fish_config_op_logging
|
|
|
|
Component What it captures
|
|
───────────────────────────────────────────────────────────────────────────
|
|
Scrollback capture Terminal session output saved to:
|
|
\(ti/.terminal_history/scrollback_YYYY\-MM\-DD_HH\-MM\-SS.log
|
|
tmux pane capture Continuous pane stream via pipe\-pane, saved to:
|
|
\(ti/.terminal_history/tmux_<session>\-w<win>\-p<pane>_YYYY\-MM\-DD_HH\-MM\-SS.log
|
|
zellij pane capture Pane scrollback snapshot on shell exit, saved to:
|
|
\(ti/.terminal_history/zellij_<session>\-p<pane>_YYYY\-MM\-DD_HH\-MM\-SS.log
|
|
paru wrapper All paru/AUR output captured to:
|
|
\(ti/.terminal_history/paru_YYYY\-MM\-DD_HH\-MM\-SS.log
|
|
yay wrapper All yay/AUR output captured to:
|
|
\(ti/.terminal_history/yay_YYYY\-MM\-DD_HH\-MM\-SS.log
|
|
Kitty watcher watcher.py captures scrollback when Kitty closes
|
|
.EE
|
|
.PP
|
|
NOTE: \f[B]Turning off logging does not delete any existing logs.\f[R]
|
|
.PD 0
|
|
.P
|
|
.PD
|
|
They remain in \f[CR]$SCROLLBACK_HISTORY_DIR\f[R] (defaults to:
|
|
\f[CR]\(ti/.terminal_history/\f[R]) until you remove them manually.
|
|
.PP
|
|
The \f[CR]tmux\f[R] capture starts automatically when fish launches
|
|
inside any \f[CR]tmux\f[R] pane (\f[CR]$TMUX\f[R] is set).
|
|
It uses \f[CR]tmux\f[R]\(cqs native pipe\-pane to stream all pane output
|
|
directly to disk without an intermediate process.
|
|
Each fish shell session gets its own log file; a new log is created on
|
|
each shell start (including exec fish and new splits).
|
|
Before each new log, the oldest \f[CR]tmux_*.log\f[R] files are pruned
|
|
(by modification time) to keep the total within
|
|
\f[CR]SCROLLBACK_HISTORY_MAX_FILES\f[R], matching the
|
|
\f[CR]paru\f[R]/\f[CR]yay\f[R] wrapper behaviour.
|
|
.PP
|
|
The \f[CR]zellij\f[R] capture works differently: Zellij has no live
|
|
output\-streaming facility like pipe\-pane, so the log is taken as a
|
|
one\-shot snapshot when the shell exits, via
|
|
\f[CR]zellij action dump\-screen \-\-full \-\-ansi\f[R] (the
|
|
\f[CR]\-\-ansi\f[R] flag preserves color).
|
|
The dump is captured on the fish process\(cqs stdout and written to the
|
|
log file by fish itself (not via \f[CR]\-\-path\f[R], which would make
|
|
the \f[CR]zellij\f[R] server write the file).
|
|
A \f[CR]fish_exit\f[R] handler (registered whenever \f[CR]$ZELLIJ\f[R]
|
|
is set) writes the pane\(cqs full scrollback and then prunes old
|
|
\f[CR]zellij_*.log\f[R] files the same way.
|
|
Because the capture happens at exit, toggling
|
|
\f[CR]__fish_config_op_logging\f[R] takes effect on the next exit with
|
|
no restart or sentinel coordination needed \(em the C5 guard is
|
|
re\-checked when the handler fires.
|
|
.PP
|
|
LIMITATION \(em \f[CR]zellij\f[R] capture only fires on a clean shell
|
|
exit (typing \f[CR]exit\f[R], \f[CR]Ctrl\-D\f[R], or a logout), because
|
|
that is when the \f[CR]fish_exit\f[R] handler runs.
|
|
It does NOT capture when you close a pane or quit \f[CR]zellij\f[R]
|
|
through \f[CR]zellij\f[R] itself:
|
|
.IP \(bu 2
|
|
Closing a pane signals the shell and tears the pane down concurrently,
|
|
so even if the handler runs, dump\-screen may find the pane buffer
|
|
already gone.
|
|
.IP \(bu 2
|
|
Quitting \f[CR]zellij\f[R] kills the \f[CR]zellij\f[R] server, and
|
|
\f[CR]dump\-screen\f[R] needs a live server to read from \(em there is
|
|
nothing left to snapshot.
|
|
.PP
|
|
This is a structural difference from \f[CR]tmux\f[R], NOT a bug.
|
|
\f[CR]tmux\f[R] streams pane output to disk continuously via pipe\-pane,
|
|
so whatever was printed is already saved no matter how the pane dies.
|
|
Zellij can only snapshot, and the only reliable snapshot point from the
|
|
shell is a clean exit.
|
|
To guarantee a \f[CR]zellij\f[R] pane is logged, end the session with
|
|
\f[CR]exit\f[R] or \f[CR]Ctrl\-D\f[R] rather than \f[CR]zellij\f[R]\(cqs
|
|
close\-pane or quit actions.
|
|
.PP
|
|
The Kitty watcher is managed by the \f[CR]kitty\-logging\f[R] command:
|
|
it symlinks the watcher (\f[CR]fish\-config\-watcher.py\f[R]) into the
|
|
Kitty config directory and wires it into \f[CR]kitty.conf\f[R] via a
|
|
managed block.
|
|
Inside Kitty, a non\-blocking per\-session reminder points first\-time
|
|
users at \f[CR]kitty\-logging install\f[R] until they install or run
|
|
\f[CR]kitty\-logging dismiss\f[R]; the reminder is itself gated on C5,
|
|
so it stays silent until you enable logging.
|
|
Install affects new Kitty windows only; runtime disable is still handled
|
|
by the \f[CR].logging_disabled\f[R] sentinel.
|
|
.PP
|
|
Logging coordination via sentinel file
|
|
.PP
|
|
C5 uses a sentinel file to synchronize state between the shell and
|
|
out\-of\-process components (the Kitty watcher and all running shells):
|
|
.IP
|
|
.EX
|
|
\(ti/.config/fish/.logging_disabled
|
|
.EE
|
|
.PP
|
|
Because C5 is off by default, the sentinel is present on a fresh install
|
|
\(em the startup sync in \f[CR]conf.d/logging\-events.fish\f[R]
|
|
reconciles it on every shell start, so it appears without any action on
|
|
your part.
|
|
.PP
|
|
Disabling \f[CR]__fish_config_op_logging\f[R] (or leaving it unset): 1.
|
|
Creates the sentinel immediately in every open shell.
|
|
2.
|
|
Removes \f[CR]\(ti/.local/bin/paru\f[R] and
|
|
\f[CR]\(ti/.local/bin/yay\f[R] logging wrappers; bare /usr/bin/paru and
|
|
/usr/bin/yay are used instead.
|
|
3.
|
|
Kitty\(cqs \f[CR]watcher.py\f[R] reads the sentinel on each save attempt
|
|
and skips capture \(em no Kitty restart required.
|
|
4.
|
|
\f[CR]smart_exit\f[R] stops saving scrollback logs.
|
|
5.
|
|
Stops \f[CR]tmux pipe\-pane\f[R] capture in every open fish shell inside
|
|
\f[CR]tmux\f[R].
|
|
.PP
|
|
Enabling \f[CR]__fish_config_op_logging\f[R]: 1.
|
|
Removes the sentinel in every open shell.
|
|
2.
|
|
Regenerates \f[CR]paru\f[R]/\f[CR]yay\f[R] logging wrappers in
|
|
\f[CR]\(ti/.local/bin/\f[R].
|
|
3.
|
|
Kitty watcher resumes capture on the next session exit.
|
|
4.
|
|
Restarts \f[CR]tmux\f[R] pipe\-pane capture in every open fish shell
|
|
inside \f[CR]tmux\f[R].
|
|
.PP
|
|
Changes propagate to all running shells through an event handler that
|
|
fires whenever \f[CR]__fish_config_op_logging\f[R] changes \(em no shell
|
|
restart needed.
|
|
.PP
|
|
Note: C3 and C5 compose independently.
|
|
C3 controls whether the \f[CR]smart_exit\f[R] wrapper is active at all;
|
|
C5 controls only the scrollback\-capture block inside it.
|
|
With C3 disabled, exit is plain builtin exit regardless of C5.
|
|
.SS Sub\-categories
|
|
\f[CR]__fish_config_op_logging\f[R] sub\-divides into three
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_logging_<slug>\f[R] toggle (all still opt\-in by
|
|
default, inherited from C5\(cqs own opt\-in behavior \(en see §3 of the
|
|
design spec):
|
|
.SS terminal\-capture
|
|
Kitty watcher scrollback capture, and \f[CR]smart_exit\f[R]\(cqs
|
|
logging\-guard path.
|
|
.SS multiplexer\-capture
|
|
\f[CR]tmux\f[R] \f[CR]pipe\-pane\f[R] and \f[CR]zellij\f[R]
|
|
\f[CR]dump\-screen\f[R] capture.
|
|
.SS pkg\-logs
|
|
\f[CR]paru\f[R]/\f[CR]yay\f[R] AUR log wrappers.
|
|
.SS C6 \(em Greeting and First\-Run UI
|
|
.IP
|
|
.EX
|
|
Component What it shows
|
|
───────────────────────────────────────────────────────────────────────────
|
|
First\-run welcome banner One\-time message on first interactive session
|
|
fish_greeting override Empty function defined late in config.fish to
|
|
suppress distro greetings (e.g. CachyOS sets
|
|
fish_greeting to fastfetch by default)
|
|
.EE
|
|
.PP
|
|
When C6 is disabled, no greeting is printed by this config.
|
|
Any greeting set by the distro or other configs runs normally \(em this
|
|
config simply does not override it.
|
|
.SS Sub\-categories
|
|
\f[CR]__fish_config_op_greeting\f[R] sub\-divides into two
|
|
sub\-categories, each with its own
|
|
\f[CR]__fish_config_op_greeting_<slug>\f[R] toggle:
|
|
.SS first\-run
|
|
The first\-run welcome banner.
|
|
.SS greeting\-message
|
|
The per\-session \f[CR]fish_greeting\f[R] override.
|
|
.SH 9. FISHER PLUGINS
|
|
Fisher is bootstrapped automatically on the \f[B]first interactive
|
|
session\f[R] via \f[CR]conf.d/first_run.fish\f[R].
|
|
This also applies the Catppuccin Mocha theme and prints a one\-time
|
|
welcome message (gated by \f[CR]__fish_config_op_greeting\f[R]; set it
|
|
to 0 to suppress).
|
|
Subsequent sessions skip all first\-run logic with zero overhead.
|
|
.PP
|
|
To re\-trigger first\-run initialization (e.g., after a fresh install or
|
|
for testing), run:
|
|
.IP
|
|
.EX
|
|
set \-Ue __fish_config_first_run_complete
|
|
.EE
|
|
.PP
|
|
Then open a new shell.
|
|
.SS Fisher\-Managed Plugins
|
|
The following plugins are fully managed by Fisher.
|
|
Their files are installed into the repo directory by Fisher and are
|
|
listed in \f[CR].gitignore\f[R] \(em do not commit them.
|
|
Fisher installs and updates them automatically.
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/jorgebucaran/fisher
|
|
\f[CR]jorgebucaran/fisher\f[R]
|
|
.UE \c
|
|
\ \(em Plugin manager itself
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/meaningful-ooo/sponge
|
|
\f[CR]meaningful\-ooo/sponge\f[R]
|
|
.UE \c
|
|
\ \(em Remove failed commands from history
|
|
.SS Sponge History Filtering
|
|
Sponge removes failed commands from history and, via
|
|
\f[CR]conf.d/sponge_privacy.fish\f[R], also filters privacy\-sensitive
|
|
commands through three layers.
|
|
Detection is heuristic \(em pattern\- and variable\-name\-based \(em so
|
|
this reduces the risk of a credential landing in persistent history; it
|
|
is not a guarantee that no secret can ever reach it, and it is not a
|
|
substitute for rotating a credential that gets typed in plaintext.
|
|
Treat it as a safety net, not a vault.
|
|
.PP
|
|
Layer 1 \(em Static patterns (universal, persistent across sessions):
|
|
Commands matching any of these structural signatures are never recorded:
|
|
.IP \(bu 2
|
|
\f[CR]\-\-password\f[R] / \f[CR]\-\-token\f[R] /
|
|
\f[CR]\-\-passphrase\f[R] / \f[CR]\-\-api\-key\f[R] flags with values
|
|
.IP \(bu 2
|
|
Inline env assignments: \f[CR]GITHUB_TOKEN=xxx\f[R],
|
|
\f[CR]MY_API_KEY=abc\f[R]
|
|
.IP \(bu 2
|
|
Fish set with sensitive names: \f[CR]set \-gx GITHUB_TOKEN xxx\f[R]
|
|
.IP \(bu 2
|
|
URLs with embedded credentials: \f[CR]https://user:pass\(athost\f[R]
|
|
.IP \(bu 2
|
|
HTTP Authorization headers:
|
|
\f[CR]curl \-H \(dqAuthorization: ...\(dq\f[R]
|
|
.IP \(bu 2
|
|
Basic auth flags: \f[CR]curl \-u user:pass\f[R]
|
|
.IP \(bu 2
|
|
\f[CR]sshpass\f[R], \f[CR]docker login \-p\f[R],
|
|
\f[CR]openssl \-passin/\-passout\f[R]
|
|
.PP
|
|
Layer 2 \(em Dynamic secret values (session globals, refreshed each
|
|
login): On the first prompt, after \f[CR]secrets.fish\f[R] has loaded,
|
|
the literal values of all exported variables whose names suggest
|
|
credentials (TOKEN, PASSWORD, SECRET, \f[CR]API_KEY\f[R], etc.)
|
|
are collected, regex\-escaped, and added as a session\-scoped overlay.
|
|
Because globals shadow universals in Fish, the combined list is what
|
|
sponge sees.
|
|
Rotating a token takes effect on the next login automatically.
|
|
.PP
|
|
Layer 3 \(em Per\-command filter (\f[CR]sponge_filter_secrets\f[R]):
|
|
Catches credentials in variables exported after login, such as tokens
|
|
sourced from a project .env file mid\-session.
|
|
.PP
|
|
A match is actively deleted from history, not stored and redacted.
|
|
Sponge queues a matched command on \f[CR]fish_postexec\f[R] and purges
|
|
anything past \f[CR]sponge_delay\f[R] entries on the very next
|
|
\f[CR]fish_prompt\f[R], immediately forcing a \f[CR]history save\f[R].
|
|
With this config\(cqs (upstream) defaults, that means a matched command
|
|
is gone from disk within about one prompt cycle \(em it is not left
|
|
sitting in persistent history for the rest of the session.
|
|
.PP
|
|
This timing depends on \f[CR]sponge_purge_only_on_exit\f[R] staying
|
|
\f[CR]false\f[R], which is sponge\(cqs own default and is not overridden
|
|
here.
|
|
Turning it on defers all purging to the \f[CR]fish_exit\f[R] event
|
|
instead of the next prompt \(em and because \f[CR]fish_exit\f[R] does
|
|
not fire on a killed or crashed session, a matched command purged only
|
|
on exit can survive indefinitely if the shell never exits cleanly.
|
|
Leave this setting off.
|
|
.PP
|
|
To add your own persistent patterns:
|
|
.IP
|
|
.EX
|
|
set \-U \-a sponge_regex_patterns \(aqyour\-regex\-here\(aq
|
|
.EE
|
|
.PP
|
|
To mark additional variable NAMES as credential\-bearing (so Layer 2
|
|
scrubs their values), add name tokens \(em via
|
|
\f[CR]config\-settings\f[R] → Sponge, or directly:
|
|
.IP
|
|
.EX
|
|
set \-U \-a __fish_sponge_extra_sensitive ACME_API VAULT_PW
|
|
.EE
|
|
.PP
|
|
Tokens are folded into the Layer 2 name match case\-insensitively as
|
|
substrings, so \f[CR]ACME_API\f[R] also covers \f[CR]ACME_API_KEY\f[R].
|
|
(The match uses \f[CR]\-\-entire\f[R] to return the full variable name,
|
|
so partial\-name tokens dereference the right value.)
|
|
.PP
|
|
The \f[CR]config\-settings\f[R] Sponge page also surfaces sponge\(cqs
|
|
own tuning variables \(em \f[CR]sponge_delay\f[R],
|
|
\f[CR]sponge_successful_exit_codes\f[R],
|
|
\f[CR]sponge_purge_only_on_exit\f[R], and
|
|
\f[CR]sponge_allow_previously_successful\f[R] \(em so they can be
|
|
changed without typing variable names.
|
|
.SS Bundled Plugin Functionality
|
|
The remaining plugin functionality is bundled directly with this config
|
|
rather than managed through Fisher.
|
|
The bundled versions include customizations for Fish 4.x compatibility
|
|
and improved behavior that differ from their upstream releases.
|
|
Installing them through Fisher would overwrite these customizations.
|
|
.PP
|
|
Bundled components and their upstream origins:
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/catppuccin/fish
|
|
\f[CR]catppuccin/fish\f[R]
|
|
.UE \c
|
|
\ → \f[CR]themes/\f[R] + \f[CR]conf.d/theme.fish\f[R]
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/PatrickF1/fzf.fish
|
|
\f[CR]PatrickF1/fzf.fish\f[R]
|
|
.UE \c
|
|
\ → \f[CR]functions/_fzf_*.fish\f[R] + \f[CR]conf.d/fzf.fish\f[R]
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/franciscolourenco/done
|
|
\f[CR]franciscolourenco/done\f[R]
|
|
.UE \c
|
|
\ → \f[CR]conf.d/done.fish\f[R]
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/jorgebucaran/autopair.fish
|
|
\f[CR]jorgebucaran/autopair.fish\f[R]
|
|
.UE \c
|
|
\ → \f[CR]functions/_autopair_*.fish\f[R] +
|
|
\f[CR]conf.d/autopair.fish\f[R]
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/nickeb96/puffer-fish
|
|
\f[CR]nickeb96/puffer\-fish\f[R]
|
|
.UE \c
|
|
\ → \f[CR]functions/_puffer_fish_*.fish\f[R] +
|
|
\f[CR]conf.d/puffer.fish\f[R]
|
|
.PP
|
|
Do not run \f[CR]fisher install\f[R] for these \(em it will overwrite
|
|
the customized versions.
|
|
To update their behavior, edit the relevant bundled files directly.
|
|
.SS fish_plugins Manifest
|
|
The \f[CR]fish_plugins\f[R] file at the config root:
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/jorgebucaran/fisher
|
|
\f[CR]jorgebucaran/fisher\f[R]
|
|
.UE \c
|
|
\ \(em Plugin manager itself
|
|
.IP \(bu 2
|
|
\c
|
|
.UR https://github.com/meaningful-ooo/sponge
|
|
\f[CR]meaningful\-ooo/sponge\f[R]
|
|
.UE \c
|
|
\ \(em Remove failed commands from history
|
|
.PP
|
|
To update all Fisher\-managed plugins, run \f[CR]fisher update\f[R] or
|
|
\f[CR]fish\-deps update\f[R] which calls it as its first step.
|
|
.PP
|
|
* * * * *
|
|
.SH 10. INSTALLATION
|
|
This configuration is managed as a git repository.
|
|
To deploy on a new machine:
|
|
.IP
|
|
.EX
|
|
mv \(ti/.config/fish \(ti/.config/fish.bak # back up any existing config
|
|
git clone https://git.rootiest.dev/rootiest/fish\-config.git \(ti/.config/fish
|
|
.EE
|
|
.PP
|
|
Then open a new Fish shell.
|
|
Fisher installs automatically on first launch and the Catppuccin Mocha
|
|
theme is applied.
|
|
All other plugin functionality is bundled directly with this config and
|
|
requires no additional installation.
|
|
.SS Return Sentinel
|
|
\f[CR]config.fish\f[R] ends with a return sentinel guard.
|
|
Any lines appended after it by a tool\(cqs setup command
|
|
(\f[CR]starship init fish | source\f[R],
|
|
\f[CR]zoxide init fish | source\f[R], etc.)
|
|
will have no effect.
|
|
All integrations are managed via \f[CR]conf.d/\f[R] files.
|
|
.PP
|
|
If a new tool\(cqs shell integration appears to do nothing, check
|
|
whether its setup command appended an init line below the sentinel and
|
|
create a dedicated \f[CR]conf.d/<tool>.fish\f[R] instead.
|
|
.SS Updating
|
|
Pull the latest changes from the upstream repository without needing a
|
|
configured git remote:
|
|
.IP \(bu 2
|
|
\f[CR]config\-update\f[R] \(em Fetch and apply the latest commits from
|
|
upstream
|
|
.IP \(bu 2
|
|
\f[CR]config\-update \-\-dry\-run\f[R] \(em Preview available changes
|
|
without applying them
|
|
.IP \(bu 2
|
|
\f[CR]config\-update \-\-force\f[R] \(em Stash local changes, pull, then
|
|
restore the stash
|
|
.PP
|
|
All git output is suppressed.
|
|
Run \f[CR]exec fish\f[R] after a successful update to reload.
|
|
.PP
|
|
* * * * *
|
|
.SH 11. PERSONALIZATION
|
|
Sensitive credentials and machine\-specific settings are kept out of
|
|
version control in a private directory.
|
|
The path defaults to \f[CR]\(ti/.config/.user\-dots/fish/\f[R] but can
|
|
be overridden:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_user_dots_path /path/to/your/dots/fish
|
|
.EE
|
|
.PP
|
|
Or use the interactive TUI \(em run \f[CR]config\-settings\f[R] and
|
|
navigate to the \(lqDots Path\(rq row (last row).
|
|
Press Enter to type a new path, or ← / h to reset to the default.
|
|
.PP
|
|
\f[CR]config.fish\f[R] sources \f[CR]local.fish\f[R] from that directory
|
|
on every interactive session.
|
|
\f[CR]local.fish\f[R] is responsible for sourcing its own
|
|
\f[CR]secrets.fish\f[R]:
|
|
.IP
|
|
.EX
|
|
$__fish_user_dots_path/
|
|
├── secrets.fish API keys, tokens, passwords, personal identifiers
|
|
└── local.fish Machine\-specific paths, env vars, and sourcing secrets
|
|
.EE
|
|
.PP
|
|
\f[CR]fish_variables\f[R] (auto\-managed by fish) is excluded from this
|
|
repo via .gitignore.
|
|
Do not commit it.
|
|
.SS secrets.fish
|
|
Store anything you would not commit to a public repo: API keys, auth
|
|
tokens, passwords, and personal identifiers.
|
|
.IP
|
|
.EX
|
|
# secrets.fish
|
|
set \-gx MY_NAME \(dqYour Name\(dq
|
|
set \-gx MY_EMAIL \(dqyou\(atexample.com\(dq
|
|
set \-gx GPG_RECIPIENT \(dqyou\(atexample.com\(dq
|
|
set \-gx GITHUB_TOKEN ghp_yourTokenHere
|
|
set \-gx OPENAI_API_KEY sk\-proj\-yourKeyHere
|
|
set \-gx GITEA_TOKEN yourGiteaTokenHere
|
|
set \-gx GITEA_CHOSEN_LOGIN your.gitea.instance
|
|
set \-gx KOPIA_PASSWORD yourKopiaPassword
|
|
.EE
|
|
.SS local.fish
|
|
Store paths and variables specific to one machine \(em things that would
|
|
be wrong on any other system.
|
|
.IP
|
|
.EX
|
|
# CDPATH \(em directories searched by cd
|
|
set \-gx CDPATH . /home/youruser/projects /home/youruser
|
|
|
|
# Path to your shared .gitignore boilerplate
|
|
set \-gx GITIGNORE_BOILERPLATE \(ti/.config/git/gitignore_boilerplate
|
|
|
|
# SSH shortcuts
|
|
abbr \-a sshr \(aqssh you\(atyour\-server.local\(aq
|
|
abbr \-a sshw \(aqssh you\(atwork\-server.example.com\(aq
|
|
|
|
# Docker context shortcuts
|
|
abbr \-a dcr \(aqdocker context use my\-remote\-server\(aq
|
|
abbr \-a dcw \(aqdocker context use work\-server\(aq
|
|
.EE
|
|
.PP
|
|
\f[CR]local.fish\f[R] is sourced at the end of \f[CR]config.fish\f[R]
|
|
with an existence check so the public config works cleanly on any
|
|
machine without the private repo.
|
|
\f[CR]local.fish\f[R] in turn sources \f[CR]secrets.fish\f[R] when it
|
|
exists.
|
|
.PP
|
|
* * * * *
|
|
.SH 12. TROUBLESHOOTING
|
|
This section covers common issues, their solutions, and how to safely
|
|
revert changes or uninstall the configuration entirely.
|
|
.SS Uninstalling and Reverting to Backup
|
|
The installation step backs up any existing config to
|
|
\f[CR]\(ti/.config/fish.bak\f[R].
|
|
To revert:
|
|
.IP
|
|
.EX
|
|
rm \-rf \(ti/.config/fish
|
|
mv \(ti/.config/fish.bak \(ti/.config/fish
|
|
.EE
|
|
.PP
|
|
If no backup exists, remove the directory and let Fish regenerate a
|
|
default config on next launch:
|
|
.IP
|
|
.EX
|
|
rm \-rf \(ti/.config/fish
|
|
fish \-c \(aqfish_config theme choose \(dqFish default\(dq\(aq
|
|
.EE
|
|
.PP
|
|
Clean up files generated outside the config directory:
|
|
.IP
|
|
.EX
|
|
rm \-f \(ti/.local/bin/paru \(ti/.local/bin/yay # AUR log wrappers
|
|
rm \-f \(ti/.local/share/man/man1/fish\-config.1 # man page symlink
|
|
rm \-f \(ti/.config/fish/.logging_disabled # C5 sentinel
|
|
.EE
|
|
.PP
|
|
Erase universal variables set by this config:
|
|
.IP
|
|
.EX
|
|
for v in (set \-Un | string match \(aq__fish_config*\(aq)
|
|
set \-Ue $v
|
|
end
|
|
for v in __done_min_cmd_duration __done_notification_urgency_level
|
|
set \-Ue $v
|
|
end
|
|
for v in (set \-Un | string match \(aqsponge_*\(aq)
|
|
set \-Ue $v
|
|
end
|
|
.EE
|
|
.PP
|
|
The \f[CR]\(ti/.terminal_history/\f[R] log directory contains your
|
|
session logs.
|
|
Remove it only if you do not want to keep them.
|
|
.SS Fish Version Requirement
|
|
This config requires Fish 4.x or newer.
|
|
Check your version:
|
|
.IP
|
|
.EX
|
|
fish \-\-version
|
|
.EE
|
|
.PP
|
|
Run \f[CR]fish\-deps\f[R] to see a status report \(em an outdated Fish
|
|
shows ⚠ with an upgrade message.
|
|
.PP
|
|
Upgrading Fish by distribution:
|
|
.IP
|
|
.EX
|
|
# Arch / AUR
|
|
pacman \-S fish # or paru \-S fish
|
|
|
|
# Ubuntu / Debian (PPA)
|
|
sudo apt\-add\-repository ppa:fish\-shell/release\-4
|
|
sudo apt update && sudo apt install fish
|
|
|
|
# Fedora
|
|
sudo dnf install fish
|
|
|
|
# macOS
|
|
brew install fish
|
|
.EE
|
|
.PP
|
|
For other systems or building from source, see https://fishshell.com.
|
|
.SS Enable or Disable Session Logging
|
|
Session logging is opt\-in: it is off until you turn it on.
|
|
To enable all logging and capture (scrollback,
|
|
\f[CR]tmux\f[R]/\f[CR]zellij\f[R] pane logs, AUR helper wrappers, Kitty
|
|
watcher):
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_op_logging on
|
|
.EE
|
|
.PP
|
|
Or toggle it interactively: run \f[CR]config\-settings\f[R] and flip the
|
|
Logging row.
|
|
.PP
|
|
Disable it again \(em either an explicit falsy value or erasing the
|
|
variable returns you to the default off state:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_op_logging off
|
|
set \-Ue __fish_config_op_logging
|
|
.EE
|
|
.PP
|
|
This takes effect immediately in all running shells \(em no restart
|
|
needed.
|
|
The sentinel file, wrapper removal, and pipe\-pane teardown happen
|
|
automatically.
|
|
.PP
|
|
See C5 \(em Logging and Capture for the full component breakdown.
|
|
.SS Change or Disable the Greeting
|
|
This config suppresses the distro greeting (e.g.\ CachyOS
|
|
\f[CR]fastfetch\f[R]) by default.
|
|
To let the distro greeting through:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_op_greeting off
|
|
.EE
|
|
.PP
|
|
To set a custom greeting, define \f[CR]fish_greeting\f[R] in your
|
|
\f[CR]local.fish\f[R]:
|
|
.IP
|
|
.EX
|
|
# in $__fish_user_dots_path/local.fish
|
|
function fish_greeting
|
|
echo \(dqHello, world!\(dq
|
|
end
|
|
.EE
|
|
.PP
|
|
The first\-run welcome banner runs exactly once.
|
|
To re\-trigger it (e.g.\ for testing):
|
|
.IP
|
|
.EX
|
|
set \-Ue __fish_config_first_run_complete
|
|
.EE
|
|
.PP
|
|
See C6 \(em Greeting and First\-Run UI for details.
|
|
.SS Secrets and Machine\-Local Configuration
|
|
Machine\-specific config goes in
|
|
\f[CR]$__fish_user_dots_path/local.fish\f[R] (defaults to
|
|
\f[CR]\(ti/.config/.user\-dots/fish/local.fish\f[R]).
|
|
Secrets go in \f[CR]secrets.fish\f[R] in the same directory.
|
|
.PP
|
|
If \f[CR]local.fish\f[R] is not loading, verify the path:
|
|
.IP
|
|
.EX
|
|
echo $__fish_user_dots_path
|
|
test \-f \(dq$__fish_user_dots_path/local.fish\(dq; and echo exists; or echo missing
|
|
.EE
|
|
.PP
|
|
Change the path via variable or TUI:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_user_dots_path /new/path/to/dots/fish
|
|
.EE
|
|
.PP
|
|
Or run \f[CR]config\-settings\f[R], navigate to the Paths page, and edit
|
|
\(lqDots path\(rq.
|
|
.PP
|
|
The \f[CR]user\-dots\f[R] convenience symlink in the config directory
|
|
tracks this path.
|
|
Disable it with:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_user_dots_symlink false
|
|
.EE
|
|
.PP
|
|
See Personalization for the full \f[CR]local.fish\f[R] /
|
|
\f[CR]secrets.fish\f[R] layout.
|
|
.SS Tool Init Does Nothing (Return Sentinel)
|
|
Symptom: you ran a tool\(cqs setup command (e.g.
|
|
\f[CR]starship init fish >> \(ti/.config/fish/config.fish\f[R]) and
|
|
nothing changed.
|
|
.PP
|
|
Cause: \f[CR]config.fish\f[R] ends with a \f[CR]return\f[R] guard.
|
|
Any lines appended after it are never executed.
|
|
.PP
|
|
Fix: create a dedicated \f[CR]conf.d/\f[R] file instead of appending to
|
|
\f[CR]config.fish\f[R]:
|
|
.IP
|
|
.EX
|
|
# \(ti/.config/fish/conf.d/mytool.fish
|
|
mytool init fish | source
|
|
.EE
|
|
.PP
|
|
All existing integrations (\f[CR]starship\f[R], \f[CR]zoxide\f[R],
|
|
\f[CR]direnv\f[R]) already have \f[CR]conf.d/\f[R] files.
|
|
See Return Sentinel for background.
|
|
.SS Missing Dependencies
|
|
Run \f[CR]fish\-deps\f[R] (defaults to \f[CR]fish\-deps status\f[R]) to
|
|
see what is installed and what is missing.
|
|
Common symptoms and their missing tools:
|
|
.IP
|
|
.EX
|
|
Symptom Missing tool
|
|
─────────────────────────────────────────────────────
|
|
ls output has no icons or colors eza (or lsd)
|
|
cd does not remember directories zoxide
|
|
cat shows no syntax highlighting bat
|
|
fzf keybindings do nothing fzf
|
|
Starship prompt not appearing starship
|
|
.EE
|
|
.PP
|
|
Install missing dependencies interactively:
|
|
.IP
|
|
.EX
|
|
fish\-deps install
|
|
.EE
|
|
.PP
|
|
Or install everything missing and update what is installed:
|
|
.IP
|
|
.EX
|
|
fish\-deps sync
|
|
.EE
|
|
.PP
|
|
See Dependency Catalog for the full list grouped by tier (required,
|
|
integrations, recommended).
|
|
.SS Vi Mode Keybindings
|
|
This config enables Vi mode by default (via C3 overrides), replacing the
|
|
standard Emacs\-style bindings.
|
|
If Vi mode interferes with your workflow, override it in
|
|
\f[CR]local.fish\f[R] (See Personalization):
|
|
.IP
|
|
.EX
|
|
# $__fish_user_dots_path/local.fish
|
|
fish_default_key_bindings
|
|
.EE
|
|
.PP
|
|
This restores Emacs\-style bindings without disabling the rest of C3
|
|
(bang\-bang, autopair, \f[CR]starship\f[R] prompt, pager settings,
|
|
etc.).
|
|
.PP
|
|
To disable the entire C3 category (Vi mode and all other key/environment
|
|
overrides):
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_op_overrides off
|
|
.EE
|
|
.PP
|
|
See C3 \(em Key and Environment Overrides for the full list of what C3
|
|
controls.
|
|
.SS What\(cqs with the C1\-C6 stuff?
|
|
This configuration groups its opinionated behaviors into six categories
|
|
(C1\(enC6), allowing you to selectively disable features that conflict
|
|
with your workflow.
|
|
The \f[B]C\f[R]ategory numbers are used as shorthand when referencing
|
|
these.
|
|
Disabling all of them leaves you with a \(lqMinimal Mode\(rq shell that
|
|
only manages basic features like \f[CR]XDG\f[R] variables, and your
|
|
\f[CR]local.fish\f[R] overrides.
|
|
.IP
|
|
.EX
|
|
Category Description
|
|
──────────────────────────────────────────────────────────────────────────
|
|
C1 Command Shadows \(em Wraps destructive commands (rm, cp) to be safe by default
|
|
C2 Startup Side\-Effects \(em Bootstraps Fisher, generates wrappers, auto\-activates venvs
|
|
C3 Overrides \(em Overrides cd, sets Vi mode, binds <CR> to smart_enter
|
|
C4 Integrations \(em Kitty/Wezterm integrations, starship hooks, fzf theme
|
|
C5 Logging and Capture \(em Session logs, command duration
|
|
C6 Greeting & First\-Run UI \(em Custom startup banner
|
|
.EE
|
|
.PP
|
|
Disable all opinionated features at once (Minimal Mode):
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_opinionated 0
|
|
.EE
|
|
.PP
|
|
Disable a single category:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_op_aliases off # C1
|
|
set \-U __fish_config_op_autoexec off # C2
|
|
set \-U __fish_config_op_overrides off # C3
|
|
set \-U __fish_config_op_integrations off # C4
|
|
set \-U __fish_config_op_logging off # C5 (already off by default)
|
|
set \-U __fish_config_op_greeting off # C6
|
|
.EE
|
|
.PP
|
|
Keep one category active under a master disable:
|
|
.IP
|
|
.EX
|
|
set \-U __fish_config_opinionated 0
|
|
set \-U __fish_config_op_aliases 1 # only C1 stays on
|
|
.EE
|
|
.PP
|
|
Re\-enable everything:
|
|
.IP
|
|
.EX
|
|
set \-Ue __fish_config_opinionated
|
|
.EE
|
|
.PP
|
|
Each category also has two to six sub\-categories (e.g.
|
|
\f[CR]__fish_config_op_aliases_filesystem\f[R]) that can be checked,
|
|
disabled, or reset the same way \(em
|
|
\f[CR]set \-U __fish_config_op_<category>_<subcategory> off\f[R] and
|
|
\f[CR]set \-Ue __fish_config_op_<category>_<subcategory>\f[R] work
|
|
identically to the category\-level recipes above, just one level more
|
|
granular.
|
|
See Components Reference for the full list.
|
|
.PP
|
|
For an interactive alternative to setting these variables by hand, run
|
|
\f[CR]config\-settings\f[R].
|
|
.PP
|
|
* * * * *
|
|
.SH 13. VIEWING THIS MANUAL
|
|
There are four ways to read this manual.
|
|
.SS The documentation website
|
|
.IP
|
|
.EX
|
|
help config \-\-html
|
|
.EE
|
|
.PP
|
|
Opens https://fish.rootiest.fyi/ in the default browser \(em the
|
|
Starlight\-powered site built from \f[CR]docs/manual/**\f[R] on every
|
|
push to \f[CR]main\f[R].
|
|
It has a section sidebar and full\-text search.
|
|
Deep links to a specific section aren\(cqt supported from the command
|
|
line; once the site opens, use its search box to jump straight to what
|
|
you need.
|
|
.SS As a man page
|
|
.IP
|
|
.EX
|
|
help config \-\-man
|
|
help config pkg \-\-man
|
|
.EE
|
|
.PP
|
|
Opens the compiled \f[CR]docs/fish\-config.1\f[R] directly via man
|
|
\f[CR]\-l\f[R], bypassing the pager fallback chain.
|
|
If a section keyword is given, the pager opens at the nearest matching
|
|
heading.
|
|
The symlink is created once on first run (like an install step) and
|
|
MANPATH is set each session, enabling the standard invocation:
|
|
.IP
|
|
.EX
|
|
man fish\-config
|
|
.EE
|
|
.PP
|
|
NOTE: fish\-config (hyphen) is this config\(cqs man page.
|
|
\f[CR]fish_config\f[R] (underscore) is fish\(cqs built\-in
|
|
browser\-based configuration tool \(em a completely separate command.
|
|
Do not mix them up.
|
|
.SS In the terminal
|
|
.IP
|
|
.EX
|
|
help config
|
|
help config keybindings
|
|
.EE
|
|
.PP
|
|
Without a pager available beyond the basics,
|
|
\f[CR]help config [SECTION]\f[R] opens the Markdown manual in the best
|
|
available viewer, falling back through:
|
|
.IP
|
|
.EX
|
|
1. ov + bat section navigation + syntax highlighting (best)
|
|
2. ov alone section navigation, raw Markdown
|
|
3. bat alone syntax highlighting, use / to search
|
|
4. man \-l pre\-compiled man page (if available)
|
|
5. less plain text with line\-jump
|
|
6. cat plain output
|
|
.EE
|
|
.PP
|
|
With ov, the Markdown renders with syntax highlighting and
|
|
section\-based navigation:
|
|
.IP
|
|
.EX
|
|
Space next section
|
|
\(ha previous section
|
|
Alt+u toggle section list sidebar
|
|
/ search forward
|
|
n / N next / previous search match
|
|
g go to line number
|
|
j interactive jump target (line, %, or \(aqsection\(aq)
|
|
q quit
|
|
.EE
|
|
.PP
|
|
If SECTION is given, the pager opens at the first heading that matches
|
|
the keyword (case\-insensitive; checks
|
|
\f[CR]docs/fish\-config.index\f[R] aliases first, then falls back to a
|
|
normalized heading scan):
|
|
.IP
|
|
.EX
|
|
help config keybindings
|
|
help config abbreviations
|
|
help config pkg
|
|
help config logs
|
|
help config fish\-deps
|
|
.EE
|
|
.SS Reading the source directly
|
|
\f[CR]docs/manual/**\f[R] is the single source of truth this manual, the
|
|
man page, and the website are all generated from.
|
|
Numbered files and directories correspond to the numbered sections in
|
|
this manual \(em browse them in any editor, or from a shell:
|
|
.IP
|
|
.EX
|
|
cd \(ti/.config/fish/docs/manual
|
|
grep \-rn \(dqkeybindings\(dq .
|
|
.EE
|
|
.PP
|
|
Section 5 is the exception.
|
|
Function entries are generated from the man\-page\-style comment header
|
|
above each function in \f[CR]functions/*.fish\f[R], so the documentation
|
|
for a command lives beside the code that implements it and cannot drift
|
|
from it.
|
|
To read the source for a single function, or to correct its
|
|
documentation, open the function itself:
|
|
.IP
|
|
.EX
|
|
functions/git\-clean.fish
|
|
.EE
|
|
.PP
|
|
The files under \f[CR]docs/manual/05\-functions/\f[R] carry only the
|
|
category titles, ordering, and search keywords.
|
|
.SH 14. TESTING
|
|
.IP
|
|
.EX
|
|
fish tests/run\-tests.fish
|
|
.EE
|
|
.PP
|
|
Runs before every push (and gates the \c
|
|
.UR https://git.rootiest.dev/rootiest/fish-config/src/branch/main/.github/workflows/ci.yml
|
|
documentation build
|
|
.UE \c
|
|
\ in CI, so a broken config can\(cqt get published): syntax\-lints every
|
|
\f[CR].fish\f[R] file, then loads the config in an isolated
|
|
\f[CR]HOME\f[R]/XDG sandbox \(em never this checkout itself, since it
|
|
doubles as a real \f[CR]\(ti/.config/fish\f[R] \(em and runs functional
|
|
checks against foundational behavior (XDG/PATH/CDPATH setup, key
|
|
bindings, abbreviations, core functions, the opinionated\-component
|
|
registry, and more).
|
|
.SH 15. CONTRIBUTING
|
|
Interested in contributing?
|
|
See \c
|
|
.UR https://git.rootiest.dev/rootiest/fish-config/src/branch/main/CONTRIBUTING.md
|
|
\f[CR]CONTRIBUTING.md\f[R]
|
|
.UE \c
|
|
\ for the branching/PR workflow, commit conventions, fish coding
|
|
standards, and the docs/testing pipeline this repo follows.
|
|
.PP
|
|
\f[B]Preferred forge:\f[R] \c
|
|
.UR https://git.rootiest.dev/rootiest/fish-config
|
|
git.rootiest.dev/rootiest/fish\-config
|
|
.UE \c
|
|
\ is the base repository.
|
|
\c
|
|
.UR https://github.com/rootiest/fish-config
|
|
github.com/rootiest/fish\-config
|
|
.UE \c
|
|
\ is a push\-mirror of it \(em identical content, but one\-way and
|
|
read\-only from a contributor\(cqs perspective.
|
|
Branches, forks, and merges made on the GitHub side aren\(cqt fed back
|
|
upstream, so they risk being silently overwritten by the next mirror
|
|
push.
|
|
Until two\-way sync exists, please fork, branch, and open issues/PRs
|
|
from the Gitea repository rather than the GitHub mirror.
|
|
.SH 16. ATTRIBUTION
|
|
The core of the \c
|
|
.UR https://fish.rootiest.fyi/02-path-setup/
|
|
Zoxide integration
|
|
.UE \c
|
|
\ in this repository was originally adapted from the \c
|
|
.UR https://github.com/icezyclon/zoxide.fish
|
|
icezyclon/zoxide.fish
|
|
.UE \c
|
|
\ plugin (MIT Licensed) and has since been heavily customized for
|
|
performance and Fish 4.x compatibility.
|
|
.SH 17. LICENSE
|
|
Copyright (C) 2026 Rootiest
|
|
.PP
|
|
This project is licensed under the \f[B]GNU Affero General Public
|
|
License v3.0 or later\f[R] (AGPLv3+).
|
|
See the \c
|
|
.UR https://git.rootiest.dev/rootiest/fish-config/src/branch/main/LICENSE
|
|
LICENSE
|
|
.UE \c
|
|
\ file for the full license text.
|
|
.SH AUTHORS
|
|
Rootiest.
|