--- title: Configuration Variables manTitle: 1. CONFIGURATION VARIABLES sidebar: order: 5 helpKeywords: - variables - config --- These variables are exported from config.fish on every interactive session. Override them in local.fish (see Section 10, Personalization). ## Environment Directories (XDG) | Variable | Value | |---|---| | `XDG_CONFIG_HOME` | `~/.config` | | `XDG_CACHE_HOME` | `~/.cache` | | `XDG_DATA_HOME` | `~/.local/share` | | `XDG_STATE_HOME` | `~/.local/state` | Tools that respect XDG are directed to these paths rather than polluting $HOME. ## Tool Homes (XDG-compliant) | Variable | Value | |---|---| | `CARGO_HOME` | `$XDG_DATA_HOME/cargo` | | `RUSTUP_HOME` | `$XDG_DATA_HOME/rustup` | | `GOPATH` | `$XDG_DATA_HOME/go` | | `BUN_INSTALL` | `$XDG_DATA_HOME/bun` | | `NPM_CONFIG_PREFIX` | `$XDG_DATA_HOME/npm-global` | | `GNUPGHOME` | `$XDG_CONFIG_HOME/gnupg` | | `WAKATIME_HOME` | `$XDG_CONFIG_HOME/wakatime` | ## Editor and Pager | Variable | Value / Notes | |---|---| | `EDITOR` | `nvim` (falls back to `vi` if `nvim` is absent) | | `VISUAL` | unset by default; set a GUI editor via `local.fish` (the `edit` function falls back to a GUI chain when `VISUAL` is empty) | | `SUDO_EDITOR` | same as `EDITOR` | | `PAGER` | `ov` (falls back to `less`) | ## Scrollback History | Variable | Value / Notes | |---|---| | `__fish_scrollback_history_dir` | (unset → `~/.terminal_history`) | | `__fish_scrollback_history_max_files` | (unset → `100`) | | `SCROLLBACK_HISTORY_DIR` | `~/.terminal_history` (exported mirror) | | `SCROLLBACK_HISTORY_MAX_FILES` | `100` (exported mirror) | The `__fish_scrollback_history_*` universal variables are the fish-style source of truth — set them via `config-settings` → Paths, or `set -U` directly. `config.fish` exports the `SCROLLBACK_HISTORY_*` mirrors from them, because the POSIX wrapper scripts (`paru`/`yay`/`tmux`/`zellij` logging and `_prune_terminal_logs`) read the exported names from the environment. When the `__fish_` vars are unset, the documented defaults are exported. `config.fish` deliberately does not create a global source var, which would shadow the universal and stop live edits from taking effect. Scrollback logs accumulate in `SCROLLBACK_HISTORY_DIR` as timestamped files. When the count exceeds `SCROLLBACK_HISTORY_MAX_FILES` the oldest are pruned automatically on exit. Use `logs` to browse them interactively. ## Other | Variable | Value | Notes | |---|---|---| | `GPG_TTY` | `$(tty)` | ensures GPG passphrase prompts work | | `CLAUDE_CODE_NO_FLICKER` | `1` | suppress terminal flicker in Claude Code | | `CDPATH` | `. ~/projects ~` | | Opinionated defaults (`CDPATH`, `PAGER`/`MANPAGER`, Vi mode, command shadows, terminal integrations) can be switched off per category with universal variables — see Section 7, "Opinionated Components (Minimal Mode)". ## Pager Hierarchy `$PAGER` is set to `ov` when available, falling back to `less`. The `less` wrapper function extends this into a full chain so anything that calls `less` directly also benefits: `$PAGER` → `ov` → `less` → `more` → `cat` When `bat` is installed, man pages are rendered with syntax highlighting: | Variable | Value | |---|---| | `MANROFFOPT` | `-c` | | `MANPAGER` | `sh -c 'col -bx \| bat -l man -p'` | ## Integrations ### Zoxide `cd`, `z`, and `cdi`/`zi` are all mapped to `zoxide`-backed navigation. Tab completions for `cd` and `z` blend standard directory entries (CWD and `CDPATH`) with frecency results so both familiar and frequently-visited paths appear in one list. ### DirEnv Automatically loads `.envrc` files on directory change. Takes priority over the auto-venv logic — if a directory is managed by `direnv`, the auto-venv activation is skipped entirely. ### Auto Python Venv When entering a directory that contains a `.venv/`, the virtualenv is activated automatically and deactivated when you leave the project tree. ### WakaTime Every shell command is reported to WakaTime for time-tracking. Set `FISH_WAKATIME_DISABLED=1` to disable without removing the plugin. ### Tailscale Full tab completion for the `tailscale` CLI is provided via `conf.d/tailscale.fish`. ### 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: | Variable | Value | |---|---| | `__done_min_cmd_duration` | `10000` ms | | `__done_notification_urgency_level` | `low` | ### Scrollback History When running inside Kitty, closing a shell session via `exit` saves a timestamped scrollback snapshot to `SCROLLBACK_HISTORY_DIR`. Files are named: `scrollback_YYYY-MM-DD_HH-MM-SS.log` The `paru` and `yay` wrappers (auto-generated in `~/.local/bin/`) run the command inside a PTY via `script(1)` so download progress bars are preserved on screen, then render the captured terminal animation down to a clean static log via `scripts/clean_progress_log.py` (a small terminal-screen emulator that replays cursor movements, collapses repainted progress frames to their final state, and preserves ANSI color). If `python3` is unavailable the wrapper falls back to dropping only the `script(1)` header/footer. Output is saved to: - `paru_YYYY-MM-DD_HH-MM-SS.log` - `yay_YYYY-MM-DD_HH-MM-SS.log` Before pruning, `_scrollback_prune_junk` silently removes empty files, files with only a single meaningful line (e.g. bare `[exited]` captures), and Kitty tab-rename prompt captures. Use `exit --no-log` (or `exit -n`) to skip capture. ---