diff --git a/.chezmoiexternals/television.toml b/.chezmoiexternals/television.toml new file mode 100644 index 0000000..1148b90 --- /dev/null +++ b/.chezmoiexternals/television.toml @@ -0,0 +1,6 @@ +[".config/television"] + type = "git-repo" + url = "https://github.com/prdlk/television.git" + refreshPeriod = "168h" + [".config/television".pull] + args = ["--ff-only"] diff --git a/.chezmoiexternals/tmux-palette.toml b/.chezmoiexternals/tmux-palette.toml new file mode 100644 index 0000000..1d80338 --- /dev/null +++ b/.chezmoiexternals/tmux-palette.toml @@ -0,0 +1,6 @@ +[".config/tmux-palette"] + type = "git-repo" + url = "https://github.com/prdlk/tmux-palette.git" + refreshPeriod = "168h" + [".config/tmux-palette".pull] + args = ["--ff-only"] diff --git a/.chezmoiexternals/tmux.toml b/.chezmoiexternals/tmux.toml new file mode 100644 index 0000000..d8e23c3 --- /dev/null +++ b/.chezmoiexternals/tmux.toml @@ -0,0 +1,6 @@ +[".config/tmux"] + type = "git-repo" + url = "https://github.com/prdlk/tmux.git" + refreshPeriod = "168h" + [".config/tmux".pull] + args = ["--ff-only"] diff --git a/.chezmoiexternals/yazi.toml b/.chezmoiexternals/yazi.toml new file mode 100644 index 0000000..e7b82cd --- /dev/null +++ b/.chezmoiexternals/yazi.toml @@ -0,0 +1,6 @@ +[".config/yazi"] + type = "git-repo" + url = "https://github.com/prdlk/yazi.git" + refreshPeriod = "168h" + [".config/yazi".pull] + args = ["--ff-only"] diff --git a/.chezmoiignore.tmpl b/.chezmoiignore.tmpl index c43212d..40a432f 100644 --- a/.chezmoiignore.tmpl +++ b/.chezmoiignore.tmpl @@ -12,17 +12,14 @@ bun.lock public dist -# Linked, not copied: ~/.config/television and ~/.config/yazi are symlinks to -# these directories (dot_config/symlink_*.tmpl), so edits apply without -# chezmoi apply. -television -yazi - # Runtime/plugin state living inside managed trees — not managed .config/lazygit/.omc/** .config/tmux/plugins/** !.config/tmux/plugins/tpm .config/fish/fish_variables + +# Plaintext tokens — local-only, never in git. Rotate anything ever committed. +.config/fish/conf.d/secrets.fish .config/nvim/lazy-lock.json .config/nvim/.git .config/nvim/.git/** @@ -38,6 +35,8 @@ yazi # Arch desktop layer — linux desktop/laptop roles only .config/niri .config/niri/** +.config/hypr +.config/hypr/** .config/noctalia .config/noctalia/** .config/niri-dynamic-workspaces @@ -51,7 +50,6 @@ yazi .local/bin/niri-launch .config/fish/auto-Niri.fish .local/bin/cp-appid -.config/tmux/niri-title.sh {{ end }} # Runtime plugin state with embedded tokens — never managed diff --git a/.gitignore b/.gitignore index 2d68f37..4b0b7fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,4 @@ /dot_config/lazygit/dot_omc -/dot_config/tmux/plugins -# yazi plugins installed by `ya pkg install`; bunny.yazi is vendored because -# ya can't materialize its repo's directory symlink -/yazi/plugins/* -!/yazi/plugins/bunny.yazi/ # Beads / Dolt files (added by bd init) .dolt/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..1e3a256 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "dot_config/niri"] + path = dot_config/niri + url = https://github.com/prdlk/niri.git +[submodule "dot_config/hypr"] + path = dot_config/hypr + url = https://github.com/prdlk/hypr.git +[submodule "dot_config/fish"] + path = dot_config/fish + url = https://github.com/prdlk/fish.git diff --git a/docs/chezmoi/data.mdx b/docs/chezmoi/data.mdx index 41e5d76..266e333 100644 --- a/docs/chezmoi/data.mdx +++ b/docs/chezmoi/data.mdx @@ -165,8 +165,8 @@ See [bash and zsh](/shell) for the rest of those files. | `e.h` | not defined | `cd ~/.local/share/chezmoi/dot_config/hypr && yazi` | | `e.k` | `yazi ~/.config/kitty` | `yazi ~/.local/share/chezmoi/dot_config/kitty` | | `e.n` | `yazi ~/.config/niri` | `yazi ~/.local/share/chezmoi/dot_config/niri` | -| `e.y` | `yazi ~/.config/yazi` | `yazi ~/.local/share/chezmoi/yazi` | -| `e.t` | `nvim ~/.config/tmux/tmux.conf` | `nvim ~/.local/share/chezmoi/dot_config/tmux/tmux.conf` | +| `e.y` | `yazi ~/.config/yazi` | ✓ | +| `e.t` | `nvim ~/.config/tmux/tmux.conf` | ✓ | | `cdd` | `cd ~/Developer && yazi` | not defined | | `,,` | not defined | `cd ~/.local/share/chezmoi && yazi` | | `..` | not defined | `cd ..` | diff --git a/docs/chezmoi/externals-and-ignore.mdx b/docs/chezmoi/externals-and-ignore.mdx index d8d0b81..8d5016f 100644 --- a/docs/chezmoi/externals-and-ignore.mdx +++ b/docs/chezmoi/externals-and-ignore.mdx @@ -31,14 +31,48 @@ Externals are content chezmoi fetches instead of storing in the repo. Every entr | --- | --- | --- | | `~/.config/nvim` | [prdlk/nvim](https://github.com/prdlk/nvim) | Neovim config, kept in its own repo | | `~/.config/bat/syntaxes/sublime-purescript-syntax` | [tellnobody1/sublime-purescript-syntax](https://github.com/tellnobody1/sublime-purescript-syntax) | PureScript syntax for bat, compiled into bat's cache by the [bat cache scripts](/chezmoi/scripts#build-bat-cache) | -| `~/.config/tmux/plugins/tpm` | [tmux-plugins/tpm](https://github.com/tmux-plugins/tpm) | tmux plugin manager, run from the bottom of `tmux.conf` ([tmux](/terminal/tmux)) | +| `~/.config/tmux/plugins/tpm` | [tmux-plugins/tpm](https://github.com/tmux-plugins/tpm) | tmux plugin manager, run from the bottom of `tmux.conf` ([tmux](/terminal/tmux)). Cloned inside the tmux checkout, whose `.gitignore` excludes `plugins/` | ### No refreshPeriod -No entry sets `refreshPeriod`, so it stays at chezmoi's default of never. chezmoi clones each repo on a fresh machine and otherwise leaves it alone: `chezmoi apply` and `chezmoi update` do not pull. The local nvim checkout always wins over the remote, so in-progress Neovim edits and unpushed commits are never disturbed by an apply. +No entry in `.chezmoiexternal.toml` sets `refreshPeriod`, so it stays at chezmoi's default of never. chezmoi clones each repo on a fresh machine and otherwise leaves it alone: `chezmoi apply` and `chezmoi update` do not pull. The local nvim checkout always wins over the remote, so in-progress Neovim edits and unpushed commits are never disturbed by an apply. To update explicitly, run `chezmoi apply --refresh-externals` (`-R`), which pulls with `git pull --ff-only`. `--ff-only` makes the pull fail instead of creating a merge commit when the local checkout has diverged. +## .chezmoiexternals/ [#app-externals] + +Per-app config repos, one file each in `.chezmoiexternals/.toml`. Each is a `git-repo` external with `refreshPeriod = "168h"` and `pull.args = ["--ff-only"]`, so `chezmoi apply` fast-forwards them at most once a week. The repos hold plain config files (no chezmoi prefixes) and are not part of `chezmoi managed` contents. + +```toml .chezmoiexternals/tmux.toml +[".config/tmux"] + type = "git-repo" + url = "https://github.com/prdlk/tmux.git" + refreshPeriod = "168h" + [".config/tmux".pull] + args = ["--ff-only"] +``` + +| File | Target | Repo | +| --- | --- | --- | +| `tmux.toml` | `~/.config/tmux` | [prdlk/tmux](https://github.com/prdlk/tmux) | +| `tmux-palette.toml` | `~/.config/tmux-palette` | [prdlk/tmux-palette](https://github.com/prdlk/tmux-palette) | +| `television.toml` | `~/.config/television` | [prdlk/television](https://github.com/prdlk/television) | +| `yazi.toml` | `~/.config/yazi` | [prdlk/yazi](https://github.com/prdlk/yazi) | + +Edit these in place under `~/.config/`, then commit and push from that checkout. + +## Submodules [#submodules] + +Three source directories are git submodules, listed in `.gitmodules`. They keep chezmoi source naming and are applied in symlink mode like the rest of the tree. `chezmoi init` clones them. + +| Source | Target | Repo | +| --- | --- | --- | +| `dot_config/niri` | `~/.config/niri` | [prdlk/niri](https://github.com/prdlk/niri) | +| `dot_config/hypr` | `~/.config/hypr` | [prdlk/hypr](https://github.com/prdlk/hypr) | +| `dot_config/fish` | `~/.config/fish` | [prdlk/fish](https://github.com/prdlk/fish) | + +Edit them inside the submodule in the chezmoi source, commit there, then commit the updated submodule pointer in the root repo. + ## .chezmoiignore.tmpl [#chezmoiignore] Patterns match target paths (relative to `$HOME`). Matching entries are neither written nor removed. The file is a template, so the desktop block appears only on machines where it applies. Source entries that start with `.` (`.github/`, `.claude/`, `.crush/`, `.gitignore`) are ignored by chezmoi without needing a rule. @@ -69,11 +103,12 @@ Files at the source root that would otherwise land in `$HOME` as `~/README.md`, | `.config/lazygit/.omc/**` | Tool state written inside the lazygit config dir | | `.config/tmux/plugins/**`, except `!.config/tmux/plugins/tpm` | Plugins tpm installs with `prefix I`; tpm itself is the external above | | `.config/fish/fish_variables` | fish universal variables, rewritten by fish at runtime | +| `.config/fish/conf.d/secrets.fish` | Plaintext credentials. Local-only, never in git (the fish repo's `.gitignore` also lists it) | | `.config/nvim/lazy-lock.json` | lazy.nvim lockfile inside the nvim external | | `.config/nvim/.git`, `.config/nvim/.git/**` | The external's git metadata | | `.config/nvim/.omc/**`, `.config/nvim/.crush/**`, `.config/nvim/.understand-anything/**` | Agent tool state inside the nvim checkout | -`.gitignore` covers the source side of the same problem: `dot_config/lazygit/dot_omc`, `dot_config/tmux/plugins`, `/yazi/plugins/*` (except the vendored `bunny.yazi`), and `__pycache__/` never get committed even though symlink mode lets tools write into the source tree. +`.gitignore` covers the source side of the same problem: `dot_config/lazygit/dot_omc` and `__pycache__/` never get committed even though symlink mode lets tools write into the source tree. ### mise @@ -90,6 +125,8 @@ mise tool versions stay local to each machine and are not managed. {{ if or (ne .chezmoi.os "linux") (and (ne .role "desktop") (ne .role "laptop")) }} .config/niri .config/niri/** +.config/hypr +.config/hypr/** .config/noctalia .config/noctalia/** .config/niri-dynamic-workspaces @@ -103,11 +140,10 @@ mise tool versions stay local to each machine and are not managed. .local/bin/niri-launch .config/fish/auto-Niri.fish .local/bin/cp-appid -.config/tmux/niri-title.sh {{ end }} ``` -The block is emitted, and these paths skipped, unless the OS is `linux` and the role is `desktop` or `laptop`. `mac` and `server` machines, and any non-Linux machine regardless of role, never receive the niri compositor config (`dot_config/niri/`), fontconfig (`dot_config/fontconfig/fonts.conf`), default-app associations (`dot_config/mimeapps.list`), the fish auto-start hook (`dot_config/fish/auto-Niri.fish`), the tmux window-title helper, the systemd user units (`dot_config/systemd/user/kitty-day-save.service`), or the `niri-launch`, `cp-appid` and `kitty-day-save` scripts. The `noctalia` and `niri-dynamic-workspaces` rules match nothing in the current source tree; they only take effect if those configs are added later. +The block is emitted, and these paths skipped, unless the OS is `linux` and the role is `desktop` or `laptop`. `mac` and `server` machines, and any non-Linux machine regardless of role, never receive the niri and Hyprland configs (`dot_config/niri/`, `dot_config/hypr/`), fontconfig (`dot_config/fontconfig/fonts.conf`), default-app associations (`dot_config/mimeapps.list`), the fish auto-start hook (`dot_config/fish/auto-Niri.fish`), the systemd user units (`dot_config/systemd/user/kitty-day-save.service`), or the `niri-launch`, `cp-appid` and `kitty-day-save` scripts. The `noctalia` and `niri-dynamic-workspaces` rules match nothing in the current source tree; they only take effect if those configs are added later. | Machine | Desktop layer | | --- | --- | @@ -115,7 +151,7 @@ The block is emitted, and these paths skipped, unless the OS is `linux` and the | Linux, `server` or `mac` | Ignored | | macOS or other OS, any role | Ignored | -See [Desktop](/desktop/niri) for what the layer contains. Gaps in the gate: the block lists `niri-launch` but not its siblings (`niri-launch-ai`, `niri-launch-browser`, `niri-launch-terminal`, `niri-launch-webapp`), and the Hyprland and waybar configs (`dot_config/hypr/`, `dot_config/waybar/`) are not gated at all, so those apply on every role. `dot_config/niri/scripts/` is covered by `.config/niri/**`. +See [Desktop](/desktop/niri) for what the layer contains. Gaps in the gate: the block lists `niri-launch` but not its siblings (`niri-launch-ai`, `niri-launch-browser`, `niri-launch-terminal`, `niri-launch-webapp`), and the waybar config (`dot_config/waybar/`) is not gated at all, so it applies on every role. `dot_config/niri/scripts/` is covered by `.config/niri/**`. ### Secrets in runtime state diff --git a/docs/chezmoi/index.mdx b/docs/chezmoi/index.mdx index 23675d4..cdf29a6 100644 --- a/docs/chezmoi/index.mdx +++ b/docs/chezmoi/index.mdx @@ -27,7 +27,13 @@ The repo is a [chezmoi](https://chezmoi.io) source directory. It lives at `~/.lo - packages.yaml - skills.yaml - .chezmoiexternal.toml +- .chezmoiexternals/ + - television.toml + - tmux.toml + - tmux-palette.toml + - yazi.toml - .chezmoiignore.tmpl +- .gitmodules - .chezmoiscripts/ - run_onchange_before_10-packages.sh.tmpl - run_onchange_after_20-gh-extensions.sh.tmpl @@ -59,15 +65,12 @@ The repo is a [chezmoi](https://chezmoi.io) source directory. It lives at `~/.lo - niri/ - shell/ - starship.toml - - tmux/ - topgrade.toml - waybar/ - - symlink_yazi.tmpl - zsh/ - dot_local/ - bin/ - dot_leetcode/ -- yazi/ - docs/ - public/ - blume.config.ts @@ -81,11 +84,13 @@ The repo is a [chezmoi](https://chezmoi.io) source directory. It lives at `~/.lo | --- | --- | --- | | `.chezmoi.toml.tmpl` | `~/.config/chezmoi/chezmoi.toml` | Config template rendered by `chezmoi init`. See [Config and roles](/chezmoi/config). | | `.chezmoidata/` | — | YAML merged into template data (`.packages`, `.aliases`, `.skills`). See [Packages and aliases](/chezmoi/data) and [Skills](/ai/skills). | -| `.chezmoiexternal.toml` | — | Git repos cloned into `$HOME` (nvim config, a bat syntax). | +| `.chezmoiexternal.toml` | — | Git repos cloned into `$HOME` (nvim config, a bat syntax, tpm). | +| `.chezmoiexternals/` | — | One `git-repo` external per app: tmux, tmux-palette, television, yazi. Plain config repos cloned into `~/.config/`. See [Externals and ignore rules](/chezmoi/externals-and-ignore#app-externals). | +| `.gitmodules` | — | `dot_config/niri`, `dot_config/hypr`, `dot_config/fish` are git submodules. See [Submodules](/chezmoi/externals-and-ignore#submodules). | | `.chezmoiignore.tmpl` | — | Target paths chezmoi skips; gates the Linux desktop layer by role. | | `.chezmoiscripts/`, root `run_*` | — | Install and housekeeping scripts. See [Apply scripts](/chezmoi/scripts). | | `dot_config/` | `~/.config/` | Per-tool config. Documented under [Shell](/shell), [Terminal](/terminal), [Tools](/tools), [Desktop](/desktop). | -| `dot_local/bin/` | `~/.local/bin/` | 34 standalone scripts shared by every shell. | +| `dot_local/bin/` | `~/.local/bin/` | 39 standalone scripts shared by every shell. | | `dot_leetcode/` | `~/.leetcode/` | leetcode CLI workspace state. | | `docs/`, `public/`, `blume.config.ts`, `package.json`, `bun.lock`, `README.md` | — | This docs site and the repo README. Listed in `.chezmoiignore.tmpl`, never applied. | @@ -99,10 +104,10 @@ chezmoi encodes target names and attributes in source file names. These are the | --- | --- | --- | | `dot_` | Target name starts with `.` | `dot_config` → `~/.config`, `dot_zshrc` → `~/.zshrc` | | `private_` | Target has group/world permissions cleared (`0600`/`0700`) | `dot_config/atuin/private_config.toml`, `dot_config/gh/private_config.yml`, `dot_config/hunk/private_state.json` | -| `executable_` | Target gets the executable bit | 40 files: every script in `dot_local/bin/`, `dot_config/niri/scripts/`, `dot_config/tmux/executable_niri-title.sh` | +| `executable_` | Target gets the executable bit | 44 files: every script in `dot_local/bin/` (including `executable_tmux-niri-title`) and `dot_config/niri/scripts/` | | `exact_` | Directory is exact: entries in the target that are not in the source are deleted | `dot_config/niri/exact_config.d/` (numbered `10-…kdl` through `95-…kdl` fragments) | | `empty_` | File is kept even when empty | `dot_config/herdr/empty_dot_plugins.lock` | -| `symlink_` | Target is a symlink; file content is the link destination | `dot_config/kitty/symlink_current-theme.conf` (→ `themes/cyberdream.conf`), `dot_config/symlink_television.tmpl`, `dot_config/symlink_yazi.tmpl` | +| `symlink_` | Target is a symlink; file content is the link destination | `dot_config/kitty/symlink_current-theme.conf` (→ `themes/cyberdream.conf`) | | `.tmpl` | Rendered with Go templates and chezmoi data | `dot_gitconfig.tmpl`, `dot_config/shell/aliases.sh.tmpl`, all scripts, the config and ignore files | | `run_once_` / `run_onchange_` + `before_` / `after_` | Script, with run frequency and phase | See [Apply scripts](/chezmoi/scripts) | @@ -120,7 +125,7 @@ What that means in practice: - Tools that rewrite their own config write through the symlink into the repo. The runtime state that would otherwise pollute the source (plugin dirs, lock files, `fish_variables`, `__pycache__`) is excluded in `.chezmoiignore.tmpl` and `.gitignore`; see [Externals and ignore rules](/chezmoi/externals-and-ignore). :::note -Several fish aliases (`e.f`, `e.h`, `e.k`, `e.n`, `e.y`, `e.t`, `,,`) open the chezmoi source paths directly. Symlink mode makes that equivalent to editing the live config. +Several fish aliases (`e.f`, `e.h`, `e.k`, `e.n`, `,,`) open the chezmoi source paths directly. Symlink mode makes that equivalent to editing the live config. `e.y` and `e.t` open the yazi and tmux external checkouts in `~/.config`. ::: ## Daily workflow diff --git a/docs/chezmoi/scripts.mdx b/docs/chezmoi/scripts.mdx index 60eb898..93fc8fc 100644 --- a/docs/chezmoi/scripts.mdx +++ b/docs/chezmoi/scripts.mdx @@ -28,7 +28,7 @@ Six scripts run during `chezmoi apply`. Four live in `.chezmoiscripts/`, a direc | `.chezmoiscripts/run_once_after_30-user-services.sh.tmpl` | after | once | Runs once per distinct rendered content | | `.chezmoiscripts/run_onchange_after_40-post.sh.tmpl` | after | onchange | Only edits to the script itself (or an OS change) | | `run_onchange_after_build-bat-cache.sh.tmpl` | after | onchange | sha256 of `dot_config/bat/themes/cyberdream.tmTheme` and `dot_config/bat/config` | -| `run_onchange_after_install-yazi-plugins.sh.tmpl` | after | onchange | sha256 of `yazi/package.toml` | +| `run_onchange_after_install-yazi-plugins.sh.tmpl` | after | onchange | sha256 of `~/.config/yazi/package.toml` (empty when the file is absent) | `run_onchange_` scripts re-run whenever their rendered content differs from the last successful run. The hash triggers work by writing a checksum of another file into a comment, so editing that file changes the script's content: @@ -115,4 +115,4 @@ Each step ignores failures (`|| true`). tpm is cloned by [`.chezmoiexternal.toml ## install-yazi-plugins [#install-yazi-plugins] -`run_onchange_after_install-yazi-plugins.sh.tmpl` reinstalls yazi plugins whenever `yazi/package.toml` changes. It exits quietly if `ya` is missing or `${XDG_CONFIG_HOME:-$HOME/.config}/yazi/package.toml` does not exist, and otherwise runs `ya pkg install`. If that fails, it deletes ya's clone cache (`${XDG_CACHE_HOME:-$HOME/.cache}/yazi/packages`), since clones made by an older ya can break a newer one, and retries once. `~/.config/yazi` links to the source dir, so the plugins land in the repo's `yazi/plugins/`, which `.gitignore` excludes apart from the vendored `bunny.yazi`. The plugin list is on the [yazi page](/tools/yazi). +`run_onchange_after_install-yazi-plugins.sh.tmpl` reinstalls yazi plugins whenever `~/.config/yazi/package.toml` changes (the template hashes it via `joinPath .chezmoi.homeDir`, guarded with `stat`). It exits quietly if `ya` is missing or `${XDG_CONFIG_HOME:-$HOME/.config}/yazi/package.toml` does not exist, and otherwise runs `ya pkg install`. If that fails, it deletes ya's clone cache (`${XDG_CACHE_HOME:-$HOME/.cache}/yazi/packages`), since clones made by an older ya can break a newer one, and retries once. `~/.config/yazi` is the [prdlk/yazi](https://github.com/prdlk/yazi) external checkout, so the plugins land in its `plugins/`, which that repo's `.gitignore` excludes apart from the vendored `bunny.yazi`. The plugin list is on the [yazi page](/tools/yazi). diff --git a/docs/desktop/hyprland.mdx b/docs/desktop/hyprland.mdx index c73f2c1..f6fae92 100644 --- a/docs/desktop/hyprland.mdx +++ b/docs/desktop/hyprland.mdx @@ -6,7 +6,9 @@ description: Hyprland Lua config layered on Omarchy — bindings ported from nir [Hyprland](https://hypr.land) is a dynamic tiling Wayland compositor. This config uses Hyprland's Lua configuration and sits on top of [Omarchy](https://omarchy.org), which provides the defaults, theme, menus, and `omarchy-*` commands. The files here only override. Most bindings are ported from the [niri config](/desktop/niri) so the same keys do the same jobs. :::note -`~/.config/hypr` and the `omarchy-*` scripts are **not** listed in `.chezmoiignore.tmpl`. chezmoi applies them on every role and OS, including `mac` and `server`. They only take effect where Hyprland and Omarchy are installed. +Linux `desktop` and `laptop` roles only. `.chezmoiignore.tmpl` skips `~/.config/hypr/**` on other roles. The `omarchy-*` scripts are **not** listed there, so chezmoi applies them on every role and OS; they only take effect where Omarchy is installed. + +`dot_config/hypr` is a git submodule ([prdlk/hypr](https://github.com/prdlk/hypr)). Edit inside the submodule, commit there, then commit the updated pointer in the chezmoi repo. ::: ## Files diff --git a/docs/desktop/index.mdx b/docs/desktop/index.mdx index e4d681a..44a76dd 100644 --- a/docs/desktop/index.mdx +++ b/docs/desktop/index.mdx @@ -6,9 +6,9 @@ sidebar: --- :::note[Role gating] -`.chezmoiignore.tmpl` skips the niri layer unless the machine runs Linux **and** its role is `desktop` or `laptop`. The gated targets are `~/.config/niri`, `~/.config/noctalia`, `~/.config/niri-dynamic-workspaces`, `~/.config/fontconfig`, `~/.config/mimeapps.list`, `~/.config/systemd`, `~/.local/bin/kitty-day-save`, `~/.local/bin/niri-launch`, `~/.local/bin/cp-appid`, `~/.config/fish/auto-Niri.fish`, and `~/.config/tmux/niri-title.sh`. On `mac` and `server` roles these are not applied. +`.chezmoiignore.tmpl` skips the Linux desktop layer unless the machine runs Linux **and** its role is `desktop` or `laptop`. The gated targets are `~/.config/niri`, `~/.config/hypr`, `~/.config/noctalia`, `~/.config/niri-dynamic-workspaces`, `~/.config/fontconfig`, `~/.config/mimeapps.list`, `~/.config/systemd`, `~/.local/bin/kitty-day-save`, `~/.local/bin/niri-launch`, `~/.local/bin/cp-appid`, and `~/.config/fish/auto-Niri.fish`. On `mac` and `server` roles these are not applied. -`~/.config/hypr`, `~/.config/waybar`, the `omarchy-*` scripts, and the `niri-launch-ai` / `-browser` / `-terminal` / `-webapp` wrappers are **not** listed there, so chezmoi applies them on every role and OS. Only the exact path `.local/bin/niri-launch` is ignored, not the wrappers that call it. +`~/.config/waybar`, the `omarchy-*` scripts, the `niri-launch-ai` / `-browser` / `-terminal` / `-webapp` wrappers, and `~/.local/bin/tmux-niri-title` are **not** listed there, so chezmoi applies them on every role and OS. Only the exact path `.local/bin/niri-launch` is ignored, not the wrappers that call it. ::: Two Wayland compositors are configured side by side. niri is the original setup, paired with the Noctalia shell. Hyprland runs on top of [Omarchy](https://omarchy.org), and its bindings are ported from the niri config: the same keys launch the same apps where both compositors support it. Waybar is the Hyprland bar. Noctalia replaces it under niri. diff --git a/docs/desktop/niri.mdx b/docs/desktop/niri.mdx index 34504f8..9fe06aa 100644 --- a/docs/desktop/niri.mdx +++ b/docs/desktop/niri.mdx @@ -7,6 +7,8 @@ description: Scrollable-tiling Wayland compositor config — input, layout, wind :::note Linux `desktop` and `laptop` roles only. `.chezmoiignore.tmpl` skips `~/.config/niri/**`, `~/.local/bin/niri-launch`, and `~/.local/bin/cp-appid` on other roles. The `niri-launch-*` wrappers are not in the ignore list and are applied everywhere. + +`dot_config/niri` is a git submodule ([prdlk/niri](https://github.com/prdlk/niri)). Edit inside the submodule, commit there, then commit the updated pointer in the chezmoi repo. ::: ## Files diff --git a/docs/shell/aliases.mdx b/docs/shell/aliases.mdx index 19f4b77..d4586b1 100644 --- a/docs/shell/aliases.mdx +++ b/docs/shell/aliases.mdx @@ -41,11 +41,11 @@ A ✓ means the alias exists in that shell with the command shown. Where fish us | `e.k` | `yazi ~/.config/kitty` | `yazi ~/.local/share/chezmoi/dot_config/kitty` | | `e.n` | `yazi ~/.config/niri` | `yazi ~/.local/share/chezmoi/dot_config/niri` | | `e.v` | `yazi ~/.config/nvim/lua` | ✓ | -| `e.y` | `yazi ~/.config/yazi` | `yazi ~/.local/share/chezmoi/yazi` | -| `e.t` | `nvim ~/.config/tmux/tmux.conf` | `nvim ~/.local/share/chezmoi/dot_config/tmux/tmux.conf` | +| `e.y` | `yazi ~/.config/yazi` | ✓ | +| `e.t` | `nvim ~/.config/tmux/tmux.conf` | ✓ | | `hx` | `helix` | ✓ (listed under Tools in fish) | -The fish editor aliases open the chezmoi source tree directly. In symlink mode, `~/.config/` files are symlinks into that tree, so both versions edit the same files. +The fish `e.f`, `e.h`, `e.k`, and `e.n` aliases open the chezmoi source tree directly. In symlink mode, `~/.config/` files are symlinks into that tree, so both versions edit the same files. yazi and tmux are external checkouts in `~/.config`, so `e.y` and `e.t` open them there. ### Quick directory jumps diff --git a/docs/shell/fish.mdx b/docs/shell/fish.mdx index 75e7ed7..a735956 100644 --- a/docs/shell/fish.mdx +++ b/docs/shell/fish.mdx @@ -15,7 +15,7 @@ fish is the primary interactive shell. The config is split into autoloaded files | `dot_config/fish/fish_plugins` | `~/.config/fish/fish_plugins` | | `dot_config/fish/auto-Niri.fish` | `~/.config/fish/auto-Niri.fish` (Linux `desktop`/`laptop` only) | -None of these files are templates. chezmoi runs in symlink mode, so each target is a symlink back into the source tree and edits to `~/.config/fish/...` land in the repo directly. `~/.config/fish/fish_variables` (universal variables, including the selected theme) is listed in `.chezmoiignore.tmpl` and stays local to each machine. +`dot_config/fish` is a git submodule ([prdlk/fish](https://github.com/prdlk/fish)). Edit inside the submodule, commit there, then commit the updated pointer in the chezmoi repo. None of these files are templates. chezmoi runs in symlink mode, so each target is a symlink back into the source tree and edits to `~/.config/fish/...` land in the submodule directly. `~/.config/fish/fish_variables` (universal variables, including the selected theme) is listed in `.chezmoiignore.tmpl` and stays local to each machine. `~/.config/fish/conf.d/secrets.fish` is local-only: it is listed in `.chezmoiignore.tmpl` and in the fish repo's `.gitignore`, and never committed. ## Installation @@ -218,7 +218,7 @@ The pickers run `tv --inline`, which opens on the line below the prompt and leav `omp-session` (ctrl-a) does its own `\033[A` when its `omp-sessions` picker is cancelled, so the binding only repaints. -zsh and bash bind ctrl-o, ctrl-e, ctrl-p, down, and ctrl-t the same way ([bash and zsh](/shell/bash-zsh)). Inside television, ctrl-e runs the channel's `edit` action and ctrl-h its `goto_parent_dir` action (`television/config.toml`). The config and cables are on the [television](/tools/television) page. +zsh and bash bind ctrl-o, ctrl-e, ctrl-p, down, and ctrl-t the same way ([bash and zsh](/shell/bash-zsh)). Inside television, ctrl-e runs the channel's `edit` action and ctrl-h its `goto_parent_dir` action (`~/.config/television/config.toml`). The config and cables are on the [television](/tools/television) page. :::note Under kitty, ctrl-g (lazygit overlay), ctrl-y (yazi split), and ctrl-h/j/k/l (split navigation) are mapped in `kitty.conf` and never reach fish. The fish binds for those keys only apply in other terminals. See [kitty](/terminal/kitty). diff --git a/docs/terminal/index.mdx b/docs/terminal/index.mdx index 0b0c928..e7dcef2 100644 --- a/docs/terminal/index.mdx +++ b/docs/terminal/index.mdx @@ -11,7 +11,7 @@ kitty is the primary terminal. It runs in three modes: plain kitty (kitty owns s | --- | --- | --- | | [kitty](/terminal/kitty) | `dot_config/kitty/` | Main config, host configs (tmux, herdr, goliath), kittens, custom tab bar | | [Ghostty](/terminal/ghostty) | `dot_config/ghostty/` | tmux-only terminal: ctrl+shift chords → tmux, themes | -| [tmux](/terminal/tmux) | `dot_config/tmux/` | Prefix, bindings, kitty-style tabs with Nerd Font icons, resurrect/continuum persistence, Niri titles | +| [tmux](/terminal/tmux) | external repo via `.chezmoiexternals/tmux.toml` | Prefix, bindings, kitty-style tabs with Nerd Font icons, resurrect/continuum persistence, Niri titles | | [herdr](/terminal/herdr) | `dot_config/herdr/`, `dot_config/herdr-nvim/` | Agent-aware multiplexer: keys, theme, plugins, Claude hook | ## Shared conventions diff --git a/docs/terminal/tmux.mdx b/docs/terminal/tmux.mdx index 1781594..d8a258e 100644 --- a/docs/terminal/tmux.mdx +++ b/docs/terminal/tmux.mdx @@ -7,11 +7,11 @@ Terminal multiplexer. [Ghostty](/terminal/ghostty) runs nothing but tmux, and Gh | | | | --- | --- | -| Source | `dot_config/tmux/tmux.conf`, `dot_config/tmux/tmux-nerd-font-window-name.yml`, `dot_config/tmux/executable_tab-label.sh`, `dot_config/tmux/executable_niri-title.sh` | +| Source | [prdlk/tmux](https://github.com/prdlk/tmux) via `.chezmoiexternals/tmux.toml`: `tmux.conf`, `tmux-nerd-font-window-name.yml`, `tab-label.sh` | | Target | `~/.config/tmux/` | | Install | `tmux` in `.chezmoidata/packages.yaml` (pacman, brew) | -tpm is a `git-repo` external in `.chezmoiexternal.toml`, cloned to `~/.config/tmux/plugins/tpm` when missing. `tmux.conf` ends with `run '~/.config/tmux/plugins/tpm/tpm'`. Plugins installed by tpm (`prefix I`) land next to it and are ignored by chezmoi. `dot_config/tmux-palette/` (→ `~/.config/tmux-palette/`) holds the [palette](#command-palette) config. +`~/.config/tmux` is a `git-repo` external checkout, not chezmoi-managed contents; edit it in place and commit and push from there. tpm is a separate `git-repo` external in `.chezmoiexternal.toml`, cloned to `~/.config/tmux/plugins/tpm` inside that checkout when missing. `tmux.conf` ends with `run '~/.config/tmux/plugins/tpm/tpm'`. Plugins installed by tpm (`prefix I`) land next to it; the tmux repo's `.gitignore` excludes `plugins/` and chezmoi ignores them. [prdlk/tmux-palette](https://github.com/prdlk/tmux-palette) (`.chezmoiexternals/tmux-palette.toml`, → `~/.config/tmux-palette/`) holds the [palette](#command-palette) config. ## Options @@ -92,7 +92,7 @@ Labels longer than 27 characters end in `…`. The icon comes from tmux-nerd-fon ### Command palette -`ctrl+space` opens tmux-palette, a fuzzy command list in a popup. Its user config lives in `~/.config/tmux-palette/` (source `dot_config/tmux-palette/`): +`ctrl+space` opens tmux-palette, a fuzzy command list in a popup. Its user config lives in `~/.config/tmux-palette/` (the [prdlk/tmux-palette](https://github.com/prdlk/tmux-palette) external): | File | Contents | | --- | --- | @@ -111,9 +111,9 @@ resurrect saves sessions, windows, panes, cwds, pane contents, and a default set `show-name: false`, because `automatic-rename-format` supplies the label. The icon sits on the left, with a fallback icon and a blank multi-pane icon. Icons are defined for `mprocs`, `mm`, `macmon`, `make`, `zsh`, `nvim`, `devbox`, `psql`, `yazi`, `lazygit`, `gh`, `tv`, `docker`, `bun`, `node`, `npm`, `pnpm`, `go`, `bunx`, `claude`, `omp`, and `gitframe`. The plugin parses the YAML with awk and does not interpret `\U` escapes, so the glyphs are literal characters. -## niri-title.sh +## tmux-niri-title -Installed only on Linux `desktop`/`laptop` roles (gated in `.chezmoiignore.tmpl`). Given the pane command, path, tty, and title, it prints a context segment for the window title read by [Niri](/desktop/niri). It picks the first match: +`dot_local/bin/executable_tmux-niri-title` → `~/.local/bin/tmux-niri-title`. POSIX sh, installed on every OS and role. Given the pane command, path, tty, and title, it prints a context segment for a window title such as the one read by [Niri](/desktop/niri). It picks the first match: 1. `ssh`/`mosh-client`/`autossh`/`et`: the remote target. 2. `nvim`/`vim`: the pane title (current file). diff --git a/docs/tools/index.mdx b/docs/tools/index.mdx index 75b74e1..2de2ebf 100644 --- a/docs/tools/index.mdx +++ b/docs/tools/index.mdx @@ -16,13 +16,13 @@ Packages come from `.chezmoidata/packages.yaml` and are installed by `run_onchan | [Git](/tools/git) | git, delta, diffnav, git-split-diffs | `dot_gitconfig.tmpl` | delta colors hand-tuned (dark) | | [GitHub CLI](/tools/github-cli) | gh, gh extensions, gh-dash | `dot_config/gh/`, `dot_config/gh-dash/` | gh-dash defaults | | [Neovim](/tools/neovim) | nvim (AstroNvim) | external repo via `.chezmoiexternal.toml` | managed in the nvim repo | -| [Yazi](/tools/yazi) | yazi file manager | `yazi/` (symlinked) | cyberdream flavor (ii-auto flavor shipped) | +| [Yazi](/tools/yazi) | yazi file manager | external repo via `.chezmoiexternals/yazi.toml` | cyberdream flavor (ii-auto flavor shipped) | | [Lazygit](/tools/lazygit) | lazygit | `dot_config/lazygit/` | cyberdream colors (ii theme file shipped) | | [Lazydocker](/tools/lazydocker) | lazydocker | `dot_config/lazydocker/config.yml` | cyberdream colors | | [bat](/tools/bat) | bat | `dot_config/bat/` | cyberdream tmTheme | | [Topgrade](/tools/topgrade) | topgrade | `dot_config/topgrade.toml` | n/a | | [Hunk](/tools/hunk) | hunk diff viewer | `dot_config/hunk/config.toml` | `auto` | -| [television](/tools/television) | tv fuzzy picker, custom cables | `television/` (symlinked) | `cyberdream-transparent` | +| [television](/tools/television) | tv fuzzy picker, custom cables | external repo via `.chezmoiexternals/television.toml` | `cyberdream-transparent` | | [LeetCode](/tools/leetcode) | leetcode CLI, `lc-elir` | `dot_leetcode/` | n/a | diff --git a/docs/tools/television.mdx b/docs/tools/television.mdx index 306f242..3373275 100644 --- a/docs/tools/television.mdx +++ b/docs/tools/television.mdx @@ -7,13 +7,11 @@ description: tv config symlinked from the repo, a transparent cyberdream theme, | | | | --- | --- | -| Source | `television/config.toml`, `television/cable/*.toml`, `television/themes/cyberdream-transparent.toml` | -| Link | `dot_config/symlink_television.tmpl` → `~/.config/television` is a symlink to `{{ .chezmoi.sourceDir }}/television` | +| Source | [prdlk/television](https://github.com/prdlk/television) via `.chezmoiexternals/television.toml`: `config.toml`, `cable/*.toml`, `themes/cyberdream-transparent.toml` | | Target | `~/.config/television/` | -| Ignore | `.chezmoiignore.tmpl` lists `television`, so it is not copied to `~/television` | | Install | Not listed in `.chezmoidata/packages.yaml`; install separately | -The whole directory is a symlink into the source tree, so edits apply without `chezmoi apply`. `cable/` holds tv's stock cables plus the repo's own and overridden ones. +`~/.config/television` is a `git-repo` checkout (pulled `--ff-only` every 168h), so edits apply immediately; commit and push them from there. `cable/` holds tv's stock cables plus the repo's own and overridden ones. ## config.toml diff --git a/docs/tools/yazi.mdx b/docs/tools/yazi.mdx index ced6b54..a12814e 100644 --- a/docs/tools/yazi.mdx +++ b/docs/tools/yazi.mdx @@ -7,10 +7,8 @@ description: Yazi file manager config — layout, openers, bat previews, keymap, | | | | --- | --- | -| Source | `yazi/` | -| Link | `dot_config/symlink_yazi.tmpl` → `~/.config/yazi` is a symlink to `{{ .chezmoi.sourceDir }}/yazi` | -| Target | `~/.config/yazi/` | -| Ignore | `.chezmoiignore.tmpl` lists `yazi`, so it is not copied to `~/yazi` | +| Source | [prdlk/yazi](https://github.com/prdlk/yazi) via `.chezmoiexternals/yazi.toml` (`git-repo`, pulled `--ff-only` every 168h) | +| Target | `~/.config/yazi/` (git checkout; edit in place, commit and push from there) | | Files | `yazi.toml`, `keymap.toml`, `init.lua`, `package.toml`, `theme.toml`, `vfs.toml`, `flavors/{cyberdream,ii-auto}.yazi/flavor.toml`, `plugins/bunny.yazi/` (vendored) | | Helper | `dot_local/bin/executable_yazi-nvim-open` → `~/.local/bin/yazi-nvim-open` | | Packages | `yazi` plus preview backends `ffmpeg`, `ffmpegthumbnailer`, `poppler`, `resvg`, `imagemagick`, `7zip` (`sevenzip` on macOS), `unzip` | @@ -137,14 +135,15 @@ In the shell opened by Shift+Tab, the `q` function (fish, ## Plugins -`package.toml` pins every plugin to a commit and hash. Since `~/.config/yazi` links to the source dir, `ya pkg install` writes plugins into the repo's `yazi/plugins/`, which `.gitignore` excludes (`/yazi/plugins/*`, `!/yazi/plugins/bunny.yazi/`). The post-apply script reinstalls from the manifest: +`package.toml` pins every plugin to a commit and hash. `~/.config/yazi` is the [prdlk/yazi](https://github.com/prdlk/yazi) checkout, so `ya pkg install` writes plugins into its `plugins/`, which that repo's `.gitignore` excludes (`plugins/*`, `!plugins/bunny.yazi/`). The post-apply script reinstalls from the manifest: ```sh run_onchange_after_install-yazi-plugins.sh.tmpl #!/bin/sh -# Install the yazi plugins pinned in yazi/package.toml whenever it changes. -# ~/.config/yazi links to the source dir, so they land in yazi/plugins/ -# (gitignored, except the vendored bunny.yazi). -# package.toml hash: {{ include "yazi/package.toml" | sha256sum }} +# Install the yazi plugins pinned in ~/.config/yazi/package.toml whenever it +# changes. ~/.config/yazi is a git-repo external (prdlk/yazi); plugins land in +# its plugins/ dir (gitignored there, except the vendored bunny.yazi). +{{- $pkg := joinPath .chezmoi.homeDir ".config/yazi/package.toml" }} +# package.toml hash: {{ if stat $pkg }}{{ include $pkg | sha256sum }}{{ end }} set -eu command -v ya >/dev/null 2>&1 || exit 0 [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/yazi/package.toml" ] || exit 0 @@ -158,7 +157,7 @@ ya pkg install || { The embedded hash makes chezmoi re-run the script whenever `package.toml` changes. -bunny is not in `package.toml`: it is vendored at `71b14a3` in `yazi/plugins/bunny.yazi/`, because its repo contains a Git symlink to a directory (`test/plugins/bunny.yazi -> ../..`) that `ya pkg` cannot materialize. To update it, re-copy the files from upstream. +bunny is not in `package.toml`: it is vendored at `71b14a3` in `plugins/bunny.yazi/` of the yazi repo, because its repo contains a Git symlink to a directory (`test/plugins/bunny.yazi -> ../..`) that `ya pkg` cannot materialize. To update it, re-copy the files from upstream. | Plugin | Rev | Used by | | --- | --- | --- | diff --git a/dot_config/fish b/dot_config/fish new file mode 160000 index 0000000..3eeef30 --- /dev/null +++ b/dot_config/fish @@ -0,0 +1 @@ +Subproject commit 3eeef30313cb3e143c81255ca8f14c5a315ffe50 diff --git a/dot_config/fish/auto-Niri.fish b/dot_config/fish/auto-Niri.fish deleted file mode 100644 index 02f9606..0000000 --- a/dot_config/fish/auto-Niri.fish +++ /dev/null @@ -1,5 +0,0 @@ -# Auto start Niri on tty1 -if test -z "$DISPLAY" ;and test "$XDG_VTNR" -eq 1 - mkdir -p ~/.cache - exec niri-session > ~/.cache/niri.log 2>&1 -end diff --git a/dot_config/fish/completions/ccc.fish b/dot_config/fish/completions/ccc.fish deleted file mode 100644 index f4c8f89..0000000 --- a/dot_config/fish/completions/ccc.fish +++ /dev/null @@ -1 +0,0 @@ -complete --command ccc --no-files --arguments "(env _CCC_COMPLETE=complete_fish _TYPER_COMPLETE_FISH_ACTION=get-args _TYPER_COMPLETE_ARGS=(commandline -cp) ccc)" --condition "env _CCC_COMPLETE=complete_fish _TYPER_COMPLETE_FISH_ACTION=is-args _TYPER_COMPLETE_ARGS=(commandline -cp) ccc" diff --git a/dot_config/fish/completions/grok.fish b/dot_config/fish/completions/grok.fish deleted file mode 100644 index 5148a5c..0000000 --- a/dot_config/fish/completions/grok.fish +++ /dev/null @@ -1,685 +0,0 @@ -# Print an optspec for argparse to handle cmd's options that are independent of any subcommand. -function __fish_grok_global_optspecs - string join \n v/version cwd= leader-socket= debug debug-file= always-approve trust allow= deny= p/single= prompt-json= prompt-file= verbatim output-format= include-partial-messages json-schema= m/model= reasoning-effort= rules= compaction-mode= compaction-detail= system-prompt-override= r/resume= load= c/continue s/session-id= fork-session w/worktree= worktree-ref= restore-code no-plan no-subagents no-ask-user experimental-memory no-memory agent= agents= tools= disallowed-tools= max-turns= permission-mode= disable-web-search no-wait-for-background background-wait-timeout= sandbox= storage-mode= client-identifier= hunk-tracker-mode= terminal fs-read fs-write no-auto-update todo-gate installer= no-alt-screen minimal fullscreen log-sampling force-login oauth leader no-leader h/help -end - -function __fish_grok_needs_command - # Figure out if the current invocation already has a command. - set -l cmd (commandline -opc) - set -e cmd[1] - argparse -s (__fish_grok_global_optspecs) -- $cmd 2>/dev/null - or return - if set -q argv[1] - # Also print the command, so this can be used to figure out what it is. - echo $argv[1] - return 1 - end - return 0 -end - -function __fish_grok_using_subcommand - set -l cmd (__fish_grok_needs_command) - test -z "$cmd" - and return 1 - contains -- $cmd[1] $argv -end - -complete -c grok -n "__fish_grok_needs_command" -l cwd -d 'Working directory' -r -F -complete -c grok -n "__fish_grok_needs_command" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_needs_command" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_needs_command" -l allow -d 'Permission allow rule (compat alias: --allowedTools)' -r -complete -c grok -n "__fish_grok_needs_command" -l deny -d 'Permission deny rule (compat alias: --disallowedTools)' -r -complete -c grok -n "__fish_grok_needs_command" -s p -l single -d 'Single-turn prompt. Prints the response to stdout and exits' -r -complete -c grok -n "__fish_grok_needs_command" -l prompt-json -d 'Single-turn prompt as JSON content blocks' -r -complete -c grok -n "__fish_grok_needs_command" -l prompt-file -d 'Single-turn prompt from a file' -r -F -complete -c grok -n "__fish_grok_needs_command" -l output-format -d 'Output format for headless mode' -r -f -a "plain\t'' -json\t'' -streaming-json\t'NDJSON of the agent native ACP session updates' -streaming-messages-json\t'NDJSON in the Anthropic Messages API wire format'" -complete -c grok -n "__fish_grok_needs_command" -l json-schema -d 'JSON Schema for structured output. When set, the model is constrained to produce JSON matching this schema. Implies --output-format json. Example: --json-schema \'{"type":"object","properties":{"name":{"type":"string"}}}\'' -r -complete -c grok -n "__fish_grok_needs_command" -s m -l model -d 'Model ID to use' -r -complete -c grok -n "__fish_grok_needs_command" -l reasoning-effort -l effort -d 'Reasoning effort for reasoning models' -r -complete -c grok -n "__fish_grok_needs_command" -l rules -d 'Extra rules to append to the system prompt' -r -complete -c grok -n "__fish_grok_needs_command" -l compaction-mode -d 'Compaction mode [summary|transcript|segments]: `summary` (default) adds no pointer; `transcript` points at the raw transcript; `segments` persists per-segment markdown to grep. Sets `GROK_COMPACTION_MODE`' -r -complete -c grok -n "__fish_grok_needs_command" -l compaction-detail -d 'Segments verbatim detail [none|minimal|balanced|verbose] (default `verbose`). Only affects `--compaction-mode segments`. Sets `GROK_COMPACTION_DETAIL`' -r -complete -c grok -n "__fish_grok_needs_command" -l system-prompt-override -d 'Override the agent\'s system prompt (compat alias: --system-prompt)' -r -complete -c grok -n "__fish_grok_needs_command" -s r -l resume -d 'Resume a session by ID or title, or the most recent if omitted. Non-ID values match session titles for the current directory (ignoring letter case; a sole renamed match wins among duplicates, otherwise ambiguity errors; UUID-shaped values always mean IDs)' -r -complete -c grok -n "__fish_grok_needs_command" -l load -d 'Resume a previous session by session ID (alias for --resume)' -r -complete -c grok -n "__fish_grok_needs_command" -s s -l session-id -d 'Use a specific session UUID for a **new** conversation (must be a valid UUID and must not already exist under the target session directory). With `--resume`/`--continue`, only valid together with `--fork-session` (names the forked session). Does not resume existing sessions — use `--resume` / `--continue` instead' -r -complete -c grok -n "__fish_grok_needs_command" -s w -l worktree -d 'Start the session in a new git worktree, optionally named. With `--resume` of a remote session, pass `--restore-code` to apply the snapshot codebase (conversation is restored either way). Headless (`-p`) does not create a worktree from this flag' -r -complete -c grok -n "__fish_grok_needs_command" -l worktree-ref -l ref -d 'Branch, tag, or commit to base the worktree on (with `--worktree`). Defaults to the current HEAD of the source checkout when omitted' -r -complete -c grok -n "__fish_grok_needs_command" -l agent -d 'Agent name or definition file path' -r -complete -c grok -n "__fish_grok_needs_command" -l agents -d 'Inline subagent definitions as JSON' -r -complete -c grok -n "__fish_grok_needs_command" -l tools -d 'Built-in tools to allow (comma-separated)' -r -complete -c grok -n "__fish_grok_needs_command" -l disallowed-tools -d 'Built-in tools to remove (comma-separated)' -r -complete -c grok -n "__fish_grok_needs_command" -l max-turns -d 'Maximum number of agent turns' -r -complete -c grok -n "__fish_grok_needs_command" -l permission-mode -d 'Permission mode' -r -f -a "default\t'' -acceptEdits\t'' -auto\t'' -dontAsk\t'' -bypassPermissions\t'' -plan\t''" -complete -c grok -n "__fish_grok_needs_command" -l background-wait-timeout -d 'Max seconds to wait for background work after the first turn ends (headless only). Applies to bash/monitor `task_completed`, background subagents (`SubagentFinished`), and any still-running non-persistent work. Persistent `monitor(persistent:true)` never completes and always waits the full timeout — use `--no-wait-for-background` or a lower timeout for throughput. Conflicts with `--no-wait-for-background`' -r -complete -c grok -n "__fish_grok_needs_command" -l sandbox -d 'Sandbox profile for filesystem and network access' -r -complete -c grok -n "__fish_grok_needs_command" -l storage-mode -d 'Session storage mode: local or writeback' -r -complete -c grok -n "__fish_grok_needs_command" -l client-identifier -d 'Override the client identifier sent to the agent' -r -complete -c grok -n "__fish_grok_needs_command" -l hunk-tracker-mode -d 'Hunk tracker mode: agent_only, all_dirty, or off ("disabled" is an alias for off, which turns the hunk tracker off entirely)' -r -complete -c grok -n "__fish_grok_needs_command" -l installer -d 'Set the installer field in config.toml' -r -complete -c grok -n "__fish_grok_needs_command" -s v -l version -d 'Print version' -complete -c grok -n "__fish_grok_needs_command" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_needs_command" -l always-approve -d 'Auto-approve all tool executions' -complete -c grok -n "__fish_grok_needs_command" -l trust -d 'Trust this folder and persist the decision to the trust store' -complete -c grok -n "__fish_grok_needs_command" -l verbatim -d 'Send the prompt exactly as given' -complete -c grok -n "__fish_grok_needs_command" -l include-partial-messages -d 'Emit incremental `stream_event` lines (text/thinking deltas) alongside whole messages. Only affects `--output-format streaming-messages-json`' -complete -c grok -n "__fish_grok_needs_command" -s c -l continue -d 'Continue the most recent session for the current working directory' -complete -c grok -n "__fish_grok_needs_command" -l fork-session -d 'When resuming (`--resume` / `--continue`), create a new session ID instead of reusing the original (optionally set via `--session-id`)' -complete -c grok -n "__fish_grok_needs_command" -l restore-code -d 'Restore the original session\'s repository snapshot when resuming. Remote sessions require `--worktree` (never checks out into the current directory). Without this flag, resume restores conversation only' -complete -c grok -n "__fish_grok_needs_command" -l no-plan -d 'Disable plan mode' -complete -c grok -n "__fish_grok_needs_command" -l no-subagents -d 'Disable subagent spawning' -complete -c grok -n "__fish_grok_needs_command" -l no-ask-user -d 'Disable structured question prompts from the agent' -complete -c grok -n "__fish_grok_needs_command" -l experimental-memory -d 'Enable cross-session memory' -complete -c grok -n "__fish_grok_needs_command" -l no-memory -d 'Disable cross-session memory for this session' -complete -c grok -n "__fish_grok_needs_command" -l disable-web-search -d 'Disable web search and web fetch tools' -complete -c grok -n "__fish_grok_needs_command" -l no-wait-for-background -d 'Exit as soon as the first agent turn ends, without waiting for pending background bash/monitor tasks or background subagents (headless only). Default for all `grok -p` runs is to wait (up to `--background-wait-timeout`) so eval harnesses see full task completion. Use this for fast scripts that only need the first turn\'s text. Does not wait for server-side auto-wake output or persistent monitors (those hit the timeout)' -complete -c grok -n "__fish_grok_needs_command" -l terminal -d 'Enable terminal support for the agent' -complete -c grok -n "__fish_grok_needs_command" -l fs-read -d 'Enable client-side file reads' -complete -c grok -n "__fish_grok_needs_command" -l fs-write -d 'Enable client-side file writes' -complete -c grok -n "__fish_grok_needs_command" -l no-auto-update -d 'Disable automatic updates for this session' -complete -c grok -n "__fish_grok_needs_command" -l todo-gate -d 'Enable the runtime turn-end TodoGate for this session' -complete -c grok -n "__fish_grok_needs_command" -l no-alt-screen -d 'Run inline instead of using the terminal alternate screen' -complete -c grok -n "__fish_grok_needs_command" -l minimal -d 'Experimental: scrollback-native rendering. Finalized blocks are printed into the terminal\'s native scrollback (use the terminal\'s own scroll / selection); a small pinned region holds the prompt + running turn. Session-scoped only — does not write config. To default plain `grok` to minimal, set `[ui] screen_mode = "minimal"` in ~/.grok/config.toml' -complete -c grok -n "__fish_grok_needs_command" -l fullscreen -d 'Open in the standard fullscreen TUI for this session, overriding a config `[ui] screen_mode = "minimal"` preference. Session-scoped only — does not write config. Fullscreen-vs-inline still follows the alt-screen policy (--no-alt-screen, [terminal] alt_screen, terminal auto-detection)' -complete -c grok -n "__fish_grok_needs_command" -l log-sampling -d 'Write sampling events to ~/.grok/logs/sampling.jsonl' -complete -c grok -n "__fish_grok_needs_command" -l force-login -d 'Show the login screen even when credentials are already available' -complete -c grok -n "__fish_grok_needs_command" -l oauth -d 'Use OAuth when the welcome screen starts authentication' -complete -c grok -n "__fish_grok_needs_command" -l leader -d 'Connect to a shared leader process' -complete -c grok -n "__fish_grok_needs_command" -l no-leader -d 'Run standalone even when leader mode is configured' -complete -c grok -n "__fish_grok_needs_command" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c grok -n "__fish_grok_needs_command" -a "agent" -d 'Run Grok without the interactive UI' -complete -c grok -n "__fish_grok_needs_command" -a "inspect" -d 'Show the configuration Grok discovers for this directory' -complete -c grok -n "__fish_grok_needs_command" -a "doctor" -d 'Check terminal, clipboard, color, and input support without starting Grok' -complete -c grok -n "__fish_grok_needs_command" -a "leader" -d 'Manage running leader processes' -complete -c grok -n "__fish_grok_needs_command" -a "logout" -d 'Sign out and clear cached credentials' -complete -c grok -n "__fish_grok_needs_command" -a "login" -d 'Sign in to Grok' -complete -c grok -n "__fish_grok_needs_command" -a "mcp" -d 'Manage MCP server configurations' -complete -c grok -n "__fish_grok_needs_command" -a "plugin" -d 'Manage plugins and marketplace sources' -complete -c grok -n "__fish_grok_needs_command" -a "memory" -d 'Manage cross-session memory' -complete -c grok -n "__fish_grok_needs_command" -a "models" -d 'List available models and exit' -complete -c grok -n "__fish_grok_needs_command" -a "sessions" -d 'List, search, or restore sessions' -complete -c grok -n "__fish_grok_needs_command" -a "setup" -d 'Fetch and install managed configuration' -complete -c grok -n "__fish_grok_needs_command" -a "share" -d 'Share a session and print the share URL' -complete -c grok -n "__fish_grok_needs_command" -a "wrap" -d 'Run any command with local clipboard support (OSC 52 → system clipboard)' -complete -c grok -n "__fish_grok_needs_command" -a "export" -d 'Export a session transcript as Markdown' -complete -c grok -n "__fish_grok_needs_command" -a "trace" -d 'Export or upload session trace data' -complete -c grok -n "__fish_grok_needs_command" -a "update" -d 'Check for updates or install a specific version' -complete -c grok -n "__fish_grok_needs_command" -a "version" -d 'Print version information' -complete -c grok -n "__fish_grok_needs_command" -a "v" -d 'Print version information' -complete -c grok -n "__fish_grok_needs_command" -a "completions" -d 'Generate shell completion scripts (bash, zsh, fish, powershell, ...)' -complete -c grok -n "__fish_grok_needs_command" -a "worktree" -d 'Manage git worktrees' -complete -c grok -n "__fish_grok_needs_command" -a "du" -d 'Show what the grok home (~/.grok) uses on disk' -complete -c grok -n "__fish_grok_needs_command" -a "disk-usage" -d 'Show what the grok home (~/.grok) uses on disk' -complete -c grok -n "__fish_grok_needs_command" -a "workspace" -d 'Expose this workspace to the Computer Hub (via the leader)' -complete -c grok -n "__fish_grok_needs_command" -a "dashboard" -d 'Open the Agent Dashboard view at startup' -complete -c grok -n "__fish_grok_needs_command" -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -s m -l model -d 'Model ID to use' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l reasoning-effort -l effort -d 'Reasoning effort for reasoning models' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l agent-profile -d 'Path to an agent profile file' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l plugin-dir -d 'Load a plugin from this directory for this process only (repeatable). Highest-priority plugin scope; always trusted — hooks and MCP servers activate without a prompt. Used by the Agent SDKs to inject per-connection plugins' -r -f -a "(__fish_complete_directories)" -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l grok-ws-origin -r -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l grok-ws-url -r -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l cli-chat-proxy-base-url -d 'Override the CLI chat proxy base URL' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l xai-api-base-url -d 'Override the public xAI API base URL' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l reauth -l --reauthenticate -d 'Run authentication before starting the agent' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l always-approve -d 'Auto-approve all tool executions' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l leader -d 'Connect to a shared leader process instead of starting a new agent. Allows multiple clients to share one backend. Defaults to [cli] use_leader in config.toml' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l no-leader -d 'Start a new agent even when config enables leader mode' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -f -a "stdio" -d 'Run the agent over stdio' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -f -a "headless" -d 'Run the agent headlessly over the Grok WebSocket relay' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -f -a "serve" -d 'Run the agent as a WebSocket server' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -f -a "leader" -d 'Run as the shared leader process for other clients' -complete -c grok -n "__fish_grok_using_subcommand agent; and not __fish_seen_subcommand_from stdio headless serve leader help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from stdio" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from stdio" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from stdio" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from stdio" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from headless" -l grok-ws-origin -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from headless" -l grok-ws-url -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from headless" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from headless" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from headless" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from headless" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l bind -d 'Address for the server to listen on' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l secret -d 'Secret token for client authentication (auto-generated if not provided)' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l remote -d 'Remote agent URL for proxy mode' -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l grok-ws-origin -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l grok-ws-url -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from serve" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l grok-ws-origin -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l grok-ws-url -r -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l no-exit-on-disconnect -d 'Keep the leader running after the last client disconnects' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l relay-on-demand -d 'Defer the grok.com relay WebSocket until the first headless IPC client registers. Without this flag the leader connects the relay eagerly at startup — required for bare leaders (headless remote env / systemd) that receive remote prompts *through* the relay. Passed by leaders auto-spawned from interactive clients (TUI/IDE), which only need the relay if a headless client appears' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l no-auto-update -d 'Disable periodic auto-update checks for the leader' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from leader" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from help" -f -a "stdio" -d 'Run the agent over stdio' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from help" -f -a "headless" -d 'Run the agent headlessly over the Grok WebSocket relay' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from help" -f -a "serve" -d 'Run the agent as a WebSocket server' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from help" -f -a "leader" -d 'Run as the shared leader process for other clients' -complete -c grok -n "__fish_grok_using_subcommand agent; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand inspect" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand inspect" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand inspect" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand inspect" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand inspect" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -l json -d 'Print the diagnostic report as JSON' -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -f -a "fix" -d 'Apply an automatic fix' -complete -c grok -n "__fish_grok_using_subcommand doctor; and not __fish_seen_subcommand_from fix help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from fix" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from fix" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from fix" -l yes -d 'Apply the displayed changes without confirmation' -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from fix" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from fix" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from help" -f -a "fix" -d 'Apply an automatic fix' -complete -c grok -n "__fish_grok_using_subcommand doctor; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -f -a "list" -d 'List running leader processes' -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -f -a "info" -d 'Show details for a leader process' -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -f -a "kill" -d 'Stop all running leader processes' -complete -c grok -n "__fish_grok_using_subcommand leader; and not __fish_seen_subcommand_from list info kill help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from list" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from list" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from list" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from info" -l pid -d 'Leader process ID from `grok leader list`' -r -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from info" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from info" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from info" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from info" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from info" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from kill" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from kill" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from kill" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from kill" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from help" -f -a "list" -d 'List running leader processes' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from help" -f -a "info" -d 'Show details for a leader process' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from help" -f -a "kill" -d 'Stop all running leader processes' -complete -c grok -n "__fish_grok_using_subcommand leader; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand logout" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand logout" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand logout" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand logout" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand login" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand login" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand login" -l legacy -d 'Ignored (kept for backwards compatibility). OAuth2 is now the only auth method' -complete -c grok -n "__fish_grok_using_subcommand login" -l oauth -d 'Use Grok OAuth via auth.x.ai' -complete -c grok -n "__fish_grok_using_subcommand login" -l device-auth -l device-code -d 'Use device-code authentication for headless/remote environments' -complete -c grok -n "__fish_grok_using_subcommand login" -l devbox -d 'Authenticate for remote development environments (hidden)' -complete -c grok -n "__fish_grok_using_subcommand login" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand login" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "list" -d 'List configured MCP servers' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "add" -d 'Add or update an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "remove" -d 'Remove an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "enable" -d 'Enable an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "disable" -d 'Disable an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "doctor" -d 'Diagnose MCP server configuration and connectivity' -complete -c grok -n "__fish_grok_using_subcommand mcp; and not __fish_seen_subcommand_from list add remove enable disable doctor help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from list" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from list" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from list" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -s t -l transport -d 'Transport type. Defaults to stdio' -r -f -a "stdio\t'Launch a local process and communicate over stdin/stdout' -http\t'Connect to a remote server over streamable HTTP' -sse\t'Connect to a remote server over Server-Sent Events'" -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -s s -l scope -d 'Config to write to: user (~/.grok/config.toml) or project (./.grok/config.toml)' -r -f -a "user\t'`~/.grok/config.toml`, available in all your projects' -project\t'`./.grok/config.toml`, shared with everyone working in this directory'" -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -s e -l env -d 'Environment variable for the server process (repeatable)' -r -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -s H -l header -d 'HTTP header for remote servers (repeatable)' -r -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l command -d 'Legacy alias for the positional command argument' -r -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l args -d 'Legacy companion to --command' -r -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l url -d 'Legacy alias for adding a remote server by URL' -r -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l type -d 'Legacy transport type for --url servers' -r -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from add" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from remove" -s s -l scope -d 'Config to remove from. When omitted, all scopes are searched' -r -f -a "user\t'`~/.grok/config.toml`, available in all your projects' -project\t'`./.grok/config.toml`, shared with everyone working in this directory'" -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from remove" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from remove" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from remove" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from remove" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from enable" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from enable" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from enable" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from enable" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from disable" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from disable" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from disable" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from disable" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from doctor" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from doctor" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from doctor" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from doctor" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from doctor" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "list" -d 'List configured MCP servers' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "add" -d 'Add or update an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "remove" -d 'Remove an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "enable" -d 'Enable an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "disable" -d 'Disable an MCP server' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "doctor" -d 'Diagnose MCP server configuration and connectivity' -complete -c grok -n "__fish_grok_using_subcommand mcp; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "list" -d 'List installed plugins' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "install" -d 'Install a plugin from a git URL or local path' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "uninstall" -d 'Uninstall an installed plugin by name' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "rm" -d 'Uninstall an installed plugin by name' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "remove" -d 'Uninstall an installed plugin by name' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "update" -d 'Update installed plugin(s)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "enable" -d 'Enable a disabled plugin' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "disable" -d 'Disable a plugin without uninstalling it' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "details" -d 'Show a plugin\'s component inventory' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "validate" -d 'Validate a plugin manifest' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "tag" -d 'Create a release git tag from the plugin\'s manifest version' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "marketplace" -d 'Manage marketplace sources' -complete -c grok -n "__fish_grok_using_subcommand plugin; and not __fish_seen_subcommand_from list install uninstall rm remove update enable disable details validate tag marketplace help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from list" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from list" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from list" -l available -d 'Include available plugins from marketplace sources. Requires --json' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from list" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from install" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from install" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from install" -l trust -d 'Trust the plugin immediately (skip confirmation prompt)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from install" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from uninstall" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from uninstall" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from uninstall" -l confirm -d 'Skip confirmation for multi-plugin repos' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from uninstall" -l keep-data -d 'Preserve the plugin\'s persistent data directory' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from uninstall" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from rm" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from rm" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from rm" -l confirm -d 'Skip confirmation for multi-plugin repos' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from rm" -l keep-data -d 'Preserve the plugin\'s persistent data directory' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from rm" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from rm" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from remove" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from remove" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from remove" -l confirm -d 'Skip confirmation for multi-plugin repos' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from remove" -l keep-data -d 'Preserve the plugin\'s persistent data directory' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from remove" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from remove" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from update" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from update" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from update" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from update" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from enable" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from enable" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from enable" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from enable" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from disable" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from disable" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from disable" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from disable" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from details" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from details" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from details" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from details" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from validate" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from validate" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from validate" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from validate" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -l push -d 'Push the tag to the remote after creating it' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -s f -l force -d 'Create the tag even if the working tree is dirty or tag exists' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -l dry-run -d 'Print what would be tagged without creating the tag' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from tag" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -f -a "list" -d 'List configured marketplace sources and their plugins' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -f -a "add" -d 'Add a marketplace source (git URL, GitHub shorthand, or local path)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -f -a "remove" -d 'Remove a marketplace source and uninstall its plugins' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -f -a "update" -d 'Refresh marketplace source(s) and sync git caches' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from marketplace" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "list" -d 'List installed plugins' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install a plugin from a git URL or local path' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Uninstall an installed plugin by name' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "update" -d 'Update installed plugin(s)' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "enable" -d 'Enable a disabled plugin' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "disable" -d 'Disable a plugin without uninstalling it' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "details" -d 'Show a plugin\'s component inventory' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "validate" -d 'Validate a plugin manifest' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "tag" -d 'Create a release git tag from the plugin\'s manifest version' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "marketplace" -d 'Manage marketplace sources' -complete -c grok -n "__fish_grok_using_subcommand plugin; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand memory; and not __fish_seen_subcommand_from clear help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand memory; and not __fish_seen_subcommand_from clear help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand memory; and not __fish_seen_subcommand_from clear help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand memory; and not __fish_seen_subcommand_from clear help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand memory; and not __fish_seen_subcommand_from clear help" -f -a "clear" -d 'Clear memory files (workspace by default)' -complete -c grok -n "__fish_grok_using_subcommand memory; and not __fish_seen_subcommand_from clear help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -l workspace -d 'Clear workspace-scoped memory (MEMORY.md, sessions/, index.sqlite)' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -l global -d 'Clear global MEMORY.md' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -l all -d 'Clear both workspace and global memory' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -s y -l yes -d 'Skip confirmation prompt' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from clear" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from help" -f -a "clear" -d 'Clear memory files (workspace by default)' -complete -c grok -n "__fish_grok_using_subcommand memory; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand models" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand models" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand models" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand models" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -f -a "list" -d 'List recent sessions (same as search with no query)' -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -f -a "search" -d 'Search sessions by keyword' -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -f -a "delete" -d 'Permanently delete a session from history' -complete -c grok -n "__fish_grok_using_subcommand sessions; and not __fish_seen_subcommand_from list search delete help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from list" -s n -l limit -d 'Maximum number of sessions to show' -r -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from list" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from list" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from list" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from search" -s n -l limit -d 'Maximum number of sessions to show' -r -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from search" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from search" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from search" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from search" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from delete" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from delete" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from delete" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from delete" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from help" -f -a "list" -d 'List recent sessions (same as search with no query)' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from help" -f -a "search" -d 'Search sessions by keyword' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from help" -f -a "delete" -d 'Permanently delete a session from history' -complete -c grok -n "__fish_grok_using_subcommand sessions; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand setup" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand setup" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand setup" -l json -d 'Print the fetched configuration as JSON instead of installing it; writes nothing to ~/.grok' -complete -c grok -n "__fish_grok_using_subcommand setup" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand setup" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand share" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand share" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand share" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand share" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand wrap" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand wrap" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand wrap" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand wrap" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c grok -n "__fish_grok_using_subcommand export" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand export" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand export" -s c -l clipboard -d 'Copy to clipboard instead of writing to stdout' -complete -c grok -n "__fish_grok_using_subcommand export" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand export" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand trace" -s o -l output -d 'Output path (default: $GROK_HOME/trace-exports/.tar.gz)' -r -F -complete -c grok -n "__fish_grok_using_subcommand trace" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand trace" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand trace" -l local -d 'Save locally only, skip remote upload' -complete -c grok -n "__fish_grok_using_subcommand trace" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand trace" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand trace" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand update" -l version -d 'Install a specific version (e.g. 0.1.150 or 0.1.151-alpha.2)' -r -complete -c grok -n "__fish_grok_using_subcommand update" -l trigger -d 'Internal: what spawned this `grok update` (`user_command`, `auto_background`, `leader_converge`). Hidden' -r -complete -c grok -n "__fish_grok_using_subcommand update" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand update" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand update" -l check -d 'Check for updates without installing' -complete -c grok -n "__fish_grok_using_subcommand update" -l json -d 'Emit machine-readable JSON output (for --check)' -complete -c grok -n "__fish_grok_using_subcommand update" -l force-reinstall -d 'Force re-download and install even if already up to date' -complete -c grok -n "__fish_grok_using_subcommand update" -l alpha -d 'Switch to the alpha release channel (faster updates, may have bugs)' -complete -c grok -n "__fish_grok_using_subcommand update" -l stable -d 'Switch to the stable release channel (default, weekly releases)' -complete -c grok -n "__fish_grok_using_subcommand update" -l enterprise -d 'Switch to the enterprise release channel' -complete -c grok -n "__fish_grok_using_subcommand update" -l auto -d 'Internal compat alias for `--trigger=auto_background` (older parents still spawn children with it)' -complete -c grok -n "__fish_grok_using_subcommand update" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand update" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand version" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand version" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand version" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand version" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand version" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand v" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand v" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand v" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand v" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand v" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand completions" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand completions" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand completions" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand completions" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "list" -d 'List tracked worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "ls" -d 'List tracked worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "show" -d 'Show details for a specific worktree' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "rm" -d 'Remove worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "gc" -d 'Garbage-collect orphaned/stale worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "db" -d 'Database maintenance' -complete -c grok -n "__fish_grok_using_subcommand worktree; and not __fish_seen_subcommand_from list ls show rm gc db help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l repo -r -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l type -r -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l json -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l all -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l repo -r -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l type -r -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l json -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l all -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from ls" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from show" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from show" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from show" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from rm" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from rm" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from rm" -s f -l force -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from rm" -l dry-run -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from rm" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from rm" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -l max-age -r -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -l dry-run -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -s f -l force -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from gc" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -f -a "rebuild" -d 'Rebuild DB from filesystem scan' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -f -a "stats" -d 'Show DB statistics' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -f -a "path" -d 'Print DB file path' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from db" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from help" -f -a "list" -d 'List tracked worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from help" -f -a "show" -d 'Show details for a specific worktree' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from help" -f -a "rm" -d 'Remove worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from help" -f -a "gc" -d 'Garbage-collect orphaned/stale worktrees' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from help" -f -a "db" -d 'Database maintenance' -complete -c grok -n "__fish_grok_using_subcommand worktree; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand du" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand du" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand du" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand du" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand du" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand disk-usage" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand disk-usage" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand disk-usage" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand disk-usage" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand disk-usage" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "start" -d 'Start (or update) the workspace→hub exposure' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "pause" -d 'Drain and disconnect from the hub, keeping the exposure warm' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "resume" -d 'Reconnect a paused exposure to the hub' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "stop" -d 'Stop exposing the workspace (the leader keeps running)' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "restart" -d 'Restart the exposure (stop, then start with the given options)' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "status" -d 'Show the current workspace-exposure status' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "list" -d 'Show the current workspace-exposure status' -complete -c grok -n "__fish_grok_using_subcommand workspace; and not __fish_seen_subcommand_from start pause resume stop restart status list help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l hub-url -d 'Computer Hub WebSocket URL (default: `[hub].url`, then the prod hub)' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l cwd -d 'Workspace root directory to expose. Defaults to the current directory' -r -f -a "(__fish_complete_directories)" -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l leader -d 'Force leader mode for this command, overriding config' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l no-leader -d 'Refuse to start even when config enables leader mode' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from start" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from pause" -l pid -d 'Leader process ID from `grok leader list`' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from pause" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from pause" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from pause" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from pause" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from pause" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from resume" -l pid -d 'Leader process ID from `grok leader list`' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from resume" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from resume" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from resume" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from resume" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from resume" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from stop" -l pid -d 'Leader process ID from `grok leader list`' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from stop" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from stop" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from stop" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from stop" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from stop" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l hub-url -d 'Computer Hub WebSocket URL (default: `[hub].url`, then the prod hub)' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l cwd -d 'Workspace root directory to expose. Defaults to the current directory' -r -f -a "(__fish_complete_directories)" -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l leader -d 'Force leader mode for this command, overriding config' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l no-leader -d 'Refuse to start even when config enables leader mode' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from restart" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from status" -l pid -d 'Leader process ID from `grok leader list`' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from status" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from status" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from status" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from status" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from status" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from list" -l pid -d 'Leader process ID from `grok leader list`' -r -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from list" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from list" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from list" -l json -d 'Emit machine-readable JSON output' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from list" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "start" -d 'Start (or update) the workspace→hub exposure' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "pause" -d 'Drain and disconnect from the hub, keeping the exposure warm' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "resume" -d 'Reconnect a paused exposure to the hub' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "stop" -d 'Stop exposing the workspace (the leader keeps running)' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "restart" -d 'Restart the exposure (stop, then start with the given options)' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "status" -d 'Show the current workspace-exposure status' -complete -c grok -n "__fish_grok_using_subcommand workspace; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand dashboard" -l leader-socket -d 'Use a custom leader socket path instead of the default `~/.grok/leader.sock`' -r -F -complete -c grok -n "__fish_grok_using_subcommand dashboard" -l debug-file -d 'Write debug logs to FILE' -r -F -complete -c grok -n "__fish_grok_using_subcommand dashboard" -l debug -d 'Enable debug logging' -complete -c grok -n "__fish_grok_using_subcommand dashboard" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "agent" -d 'Run Grok without the interactive UI' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "inspect" -d 'Show the configuration Grok discovers for this directory' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "doctor" -d 'Check terminal, clipboard, color, and input support without starting Grok' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "leader" -d 'Manage running leader processes' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "logout" -d 'Sign out and clear cached credentials' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "login" -d 'Sign in to Grok' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "mcp" -d 'Manage MCP server configurations' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "plugin" -d 'Manage plugins and marketplace sources' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "memory" -d 'Manage cross-session memory' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "models" -d 'List available models and exit' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "sessions" -d 'List, search, or restore sessions' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "setup" -d 'Fetch and install managed configuration' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "share" -d 'Share a session and print the share URL' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "wrap" -d 'Run any command with local clipboard support (OSC 52 → system clipboard)' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "export" -d 'Export a session transcript as Markdown' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "trace" -d 'Export or upload session trace data' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "update" -d 'Check for updates or install a specific version' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "version" -d 'Print version information' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "completions" -d 'Generate shell completion scripts (bash, zsh, fish, powershell, ...)' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "worktree" -d 'Manage git worktrees' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "du" -d 'Show what the grok home (~/.grok) uses on disk' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "workspace" -d 'Expose this workspace to the Computer Hub (via the leader)' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "dashboard" -d 'Open the Agent Dashboard view at startup' -complete -c grok -n "__fish_grok_using_subcommand help; and not __fish_seen_subcommand_from agent inspect doctor leader logout login mcp plugin memory models sessions setup share wrap export trace update version completions worktree du workspace dashboard help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from agent" -f -a "stdio" -d 'Run the agent over stdio' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from agent" -f -a "headless" -d 'Run the agent headlessly over the Grok WebSocket relay' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from agent" -f -a "serve" -d 'Run the agent as a WebSocket server' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from agent" -f -a "leader" -d 'Run as the shared leader process for other clients' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from doctor" -f -a "fix" -d 'Apply an automatic fix' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from leader" -f -a "list" -d 'List running leader processes' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from leader" -f -a "info" -d 'Show details for a leader process' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from leader" -f -a "kill" -d 'Stop all running leader processes' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from mcp" -f -a "list" -d 'List configured MCP servers' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from mcp" -f -a "add" -d 'Add or update an MCP server' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from mcp" -f -a "remove" -d 'Remove an MCP server' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from mcp" -f -a "enable" -d 'Enable an MCP server' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from mcp" -f -a "disable" -d 'Disable an MCP server' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from mcp" -f -a "doctor" -d 'Diagnose MCP server configuration and connectivity' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "list" -d 'List installed plugins' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "install" -d 'Install a plugin from a git URL or local path' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "uninstall" -d 'Uninstall an installed plugin by name' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "update" -d 'Update installed plugin(s)' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "enable" -d 'Enable a disabled plugin' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "disable" -d 'Disable a plugin without uninstalling it' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "details" -d 'Show a plugin\'s component inventory' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "validate" -d 'Validate a plugin manifest' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "tag" -d 'Create a release git tag from the plugin\'s manifest version' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from plugin" -f -a "marketplace" -d 'Manage marketplace sources' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from memory" -f -a "clear" -d 'Clear memory files (workspace by default)' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from sessions" -f -a "list" -d 'List recent sessions (same as search with no query)' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from sessions" -f -a "search" -d 'Search sessions by keyword' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from sessions" -f -a "delete" -d 'Permanently delete a session from history' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from worktree" -f -a "list" -d 'List tracked worktrees' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from worktree" -f -a "show" -d 'Show details for a specific worktree' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from worktree" -f -a "rm" -d 'Remove worktrees' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from worktree" -f -a "gc" -d 'Garbage-collect orphaned/stale worktrees' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from worktree" -f -a "db" -d 'Database maintenance' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from workspace" -f -a "start" -d 'Start (or update) the workspace→hub exposure' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from workspace" -f -a "pause" -d 'Drain and disconnect from the hub, keeping the exposure warm' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from workspace" -f -a "resume" -d 'Reconnect a paused exposure to the hub' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from workspace" -f -a "stop" -d 'Stop exposing the workspace (the leader keeps running)' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from workspace" -f -a "restart" -d 'Restart the exposure (stop, then start with the given options)' -complete -c grok -n "__fish_grok_using_subcommand help; and __fish_seen_subcommand_from workspace" -f -a "status" -d 'Show the current workspace-exposure status' diff --git a/dot_config/fish/completions/mise.fish b/dot_config/fish/completions/mise.fish deleted file mode 100644 index ff7fb5b..0000000 --- a/dot_config/fish/completions/mise.fish +++ /dev/null @@ -1 +0,0 @@ -mise completion fish | source diff --git a/dot_config/fish/completions/nvm.fish b/dot_config/fish/completions/nvm.fish deleted file mode 100644 index 14be1b7..0000000 --- a/dot_config/fish/completions/nvm.fish +++ /dev/null @@ -1,21 +0,0 @@ -complete --command nvm --exclusive -complete --command nvm --exclusive --long version --description "Print version" -complete --command nvm --exclusive --long help --description "Print help" -complete --command nvm --long silent --description "Suppress standard output" - -complete --command nvm --exclusive --condition __fish_use_subcommand --arguments install --description "Download and activate the specified Node version" -complete --command nvm --exclusive --condition __fish_use_subcommand --arguments use --description "Activate the specified Node version in the current shell" -complete --command nvm --exclusive --condition __fish_use_subcommand --arguments list --description "List installed Node versions" -complete --command nvm --exclusive --condition __fish_use_subcommand --arguments list-remote --description "List available Node versions to install" -complete --command nvm --exclusive --condition __fish_use_subcommand --arguments current --description "Print the currently-active Node version" -complete --command nvm --exclusive --condition "__fish_seen_subcommand_from install" --arguments "( - test -e $nvm_data && string split ' ' <$nvm_data/.index -)" -complete --command nvm --exclusive --condition "__fish_seen_subcommand_from use" --arguments "(_nvm_list | string split ' ')" -complete --command nvm --exclusive --condition __fish_use_subcommand --arguments uninstall --description "Uninstall the specified Node version" -complete --command nvm --exclusive --condition "__fish_seen_subcommand_from uninstall" --arguments "( - _nvm_list | string split ' ' | string replace system '' -)" -complete --command nvm --exclusive --condition "__fish_seen_subcommand_from use uninstall" --arguments "( - set --query nvm_default_version && echo default -)" diff --git a/dot_config/fish/completions/omp.fish b/dot_config/fish/completions/omp.fish deleted file mode 100644 index b89887a..0000000 --- a/dot_config/fish/completions/omp.fish +++ /dev/null @@ -1 +0,0 @@ -omp completions fish | source diff --git a/dot_config/fish/completions/ostt.fish b/dot_config/fish/completions/ostt.fish deleted file mode 100644 index 1d9a56f..0000000 --- a/dot_config/fish/completions/ostt.fish +++ /dev/null @@ -1,425 +0,0 @@ -# Print an optspec for argparse to handle cmd's options that are independent of any subcommand. -function __fish_ostt_global_optspecs - string join \n c/clipboard paste o/output= p/process= m/model= param= h/help V/version -end - -function __fish_ostt_needs_command - # Figure out if the current invocation already has a command. - set -l cmd (commandline -opc) - set -e cmd[1] - argparse -s (__fish_ostt_global_optspecs) -- $cmd 2>/dev/null - or return - if set -q argv[1] - # Also print the command, so this can be used to figure out what it is. - echo $argv[1] - return 1 - end - return 0 -end - -function __fish_ostt_using_subcommand - set -l cmd (__fish_ostt_needs_command) - test -z "$cmd" - and return 1 - contains -- $cmd[1] $argv -end - -complete -c ostt -n "__fish_ostt_needs_command" -s o -l output -d 'Write transcription to file instead of stdout (record default command)' -r -complete -c ostt -n "__fish_ostt_needs_command" -s p -l process -d 'Enable processing after transcription' -r -complete -c ostt -n "__fish_ostt_needs_command" -s m -l model -d 'Override transcription model for this run' -r -complete -c ostt -n "__fish_ostt_needs_command" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_needs_command" -s c -l clipboard -d 'Copy transcription to clipboard instead of stdout (record default command)' -complete -c ostt -n "__fish_ostt_needs_command" -l paste -d 'Paste transcription into the focused app (record default command)' -complete -c ostt -n "__fish_ostt_needs_command" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_needs_command" -s V -l version -d 'Print version' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "record" -d 'Record audio with real-time visualization (default)' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "r" -d 'Record audio with real-time visualization (default)' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "retry" -d 'Retry transcription of a previous recording' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "transcribe" -d 'Transcribe a pre-recorded audio file' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "t" -d 'Transcribe a pre-recorded audio file' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "replay" -d 'Replay a previous recording using system audio player' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "rp" -d 'Replay a previous recording using system audio player' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "auth" -d 'Manage cloud provider credentials' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "a" -d 'Manage cloud provider credentials' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "model" -d 'Choose and manage cloud or local transcription models' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "history" -d 'View and browse transcription history' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "h" -d 'View and browse transcription history' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "keyword" -d 'Manage keywords for improved transcription accuracy' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "k" -d 'Manage keywords for improved transcription accuracy' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "replace" -d 'Manage deterministic text replace rules' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "config" -d 'Open configuration file in your preferred editor' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "c" -d 'Open configuration file in your preferred editor' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "logs" -d 'Show recent log entries from the application' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "process" -d 'Post-process a transcription from history' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "p" -d 'Post-process a transcription from history' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "launch" -d 'Launch ostt in a popup terminal window' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "l" -d 'Launch ostt in a popup terminal window' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "completions" -d 'Generate shell completion script' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "daemon" -d 'Manage the local model daemon' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "d" -d 'Manage the local model daemon' -complete -c ostt -n "__fish_ostt_needs_command" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand record" -s o -l output -d 'Write transcription to file instead of stdout' -r -complete -c ostt -n "__fish_ostt_using_subcommand record" -s p -l process -d 'Enable processing after transcription. Optionally specify action ID to skip picker' -r -complete -c ostt -n "__fish_ostt_using_subcommand record" -s m -l model -d 'Override transcription model for this run' -r -complete -c ostt -n "__fish_ostt_using_subcommand record" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand record" -s c -l clipboard -d 'Copy transcription to clipboard instead of stdout' -complete -c ostt -n "__fish_ostt_using_subcommand record" -l paste -d 'Paste transcription into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand record" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand r" -s o -l output -d 'Write transcription to file instead of stdout' -r -complete -c ostt -n "__fish_ostt_using_subcommand r" -s p -l process -d 'Enable processing after transcription. Optionally specify action ID to skip picker' -r -complete -c ostt -n "__fish_ostt_using_subcommand r" -s m -l model -d 'Override transcription model for this run' -r -complete -c ostt -n "__fish_ostt_using_subcommand r" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand r" -s c -l clipboard -d 'Copy transcription to clipboard instead of stdout' -complete -c ostt -n "__fish_ostt_using_subcommand r" -l paste -d 'Paste transcription into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand r" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand retry" -s o -l output -d 'Write transcription to file instead of stdout' -r -complete -c ostt -n "__fish_ostt_using_subcommand retry" -s p -l process -d 'Enable processing after transcription. Optionally specify action ID to skip picker' -r -complete -c ostt -n "__fish_ostt_using_subcommand retry" -s m -l model -d 'Override transcription model for this run' -r -complete -c ostt -n "__fish_ostt_using_subcommand retry" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand retry" -s c -l clipboard -d 'Copy transcription to clipboard instead of stdout' -complete -c ostt -n "__fish_ostt_using_subcommand retry" -l paste -d 'Paste transcription into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand retry" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -s o -l output -d 'Write transcription to file instead of stdout' -r -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -s p -l process -d 'Enable processing after transcription. Optionally specify action ID to skip picker' -r -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -s m -l model -d 'Override transcription model for this run' -r -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -s c -l clipboard -d 'Copy transcription to clipboard instead of stdout' -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -l paste -d 'Paste transcription into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand transcribe" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand t" -s o -l output -d 'Write transcription to file instead of stdout' -r -complete -c ostt -n "__fish_ostt_using_subcommand t" -s p -l process -d 'Enable processing after transcription. Optionally specify action ID to skip picker' -r -complete -c ostt -n "__fish_ostt_using_subcommand t" -s m -l model -d 'Override transcription model for this run' -r -complete -c ostt -n "__fish_ostt_using_subcommand t" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand t" -s c -l clipboard -d 'Copy transcription to clipboard instead of stdout' -complete -c ostt -n "__fish_ostt_using_subcommand t" -l paste -d 'Paste transcription into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand t" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand replay" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand replay" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand rp" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand rp" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -f -a "login" -d 'Add or update a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -f -a "logout" -d 'Remove a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -f -a "list" -d 'List authenticated providers' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -f -a "status" -d 'Show authentication status' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and not __fish_seen_subcommand_from login logout list status help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from login" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from login" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from logout" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from logout" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from status" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from status" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from help" -f -a "login" -d 'Add or update a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from help" -f -a "logout" -d 'Remove a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from help" -f -a "list" -d 'List authenticated providers' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from help" -f -a "status" -d 'Show authentication status' -complete -c ostt -n "__fish_ostt_using_subcommand auth; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -f -a "login" -d 'Add or update a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -f -a "logout" -d 'Remove a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -f -a "list" -d 'List authenticated providers' -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -f -a "status" -d 'Show authentication status' -complete -c ostt -n "__fish_ostt_using_subcommand a; and not __fish_seen_subcommand_from login logout list status help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from login" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from login" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from logout" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from logout" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from status" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from status" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from help" -f -a "login" -d 'Add or update a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from help" -f -a "logout" -d 'Remove a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from help" -f -a "list" -d 'List authenticated providers' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from help" -f -a "status" -d 'Show authentication status' -complete -c ostt -n "__fish_ostt_using_subcommand a; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -f -a "list" -d 'List available transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -f -a "current" -d 'Show the currently selected transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -f -a "params" -d 'List supported transcription params for a transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -f -a "select" -d 'Select the active transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -f -a "local" -d 'Manage local transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand model; and not __fish_seen_subcommand_from list current params select local help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from list" -l provider -d 'Filter by provider ID' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from list" -l installed -d 'Show only downloaded local models' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from current" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from current" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from params" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from params" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from params" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from select" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from select" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from local" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from local" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from local" -f -a "download" -d 'Download a local model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from local" -f -a "remove" -d 'Remove a downloaded local model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from local" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from help" -f -a "list" -d 'List available transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from help" -f -a "current" -d 'Show the currently selected transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from help" -f -a "params" -d 'List supported transcription params for a transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from help" -f -a "select" -d 'Select the active transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from help" -f -a "local" -d 'Manage local transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand model; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand history; and not __fish_seen_subcommand_from list show copy help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand history; and not __fish_seen_subcommand_from list show copy help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand history; and not __fish_seen_subcommand_from list show copy help" -f -a "list" -d 'List transcription history' -complete -c ostt -n "__fish_ostt_using_subcommand history; and not __fish_seen_subcommand_from list show copy help" -f -a "show" -d 'Show a transcription from history' -complete -c ostt -n "__fish_ostt_using_subcommand history; and not __fish_seen_subcommand_from list show copy help" -f -a "copy" -d 'Copy a transcription from history to clipboard' -complete -c ostt -n "__fish_ostt_using_subcommand history; and not __fish_seen_subcommand_from list show copy help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from list" -l limit -d 'Limit to N most recent entries' -r -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from show" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from copy" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from copy" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from help" -f -a "list" -d 'List transcription history' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from help" -f -a "show" -d 'Show a transcription from history' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from help" -f -a "copy" -d 'Copy a transcription from history to clipboard' -complete -c ostt -n "__fish_ostt_using_subcommand history; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand h; and not __fish_seen_subcommand_from list show copy help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand h; and not __fish_seen_subcommand_from list show copy help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand h; and not __fish_seen_subcommand_from list show copy help" -f -a "list" -d 'List transcription history' -complete -c ostt -n "__fish_ostt_using_subcommand h; and not __fish_seen_subcommand_from list show copy help" -f -a "show" -d 'Show a transcription from history' -complete -c ostt -n "__fish_ostt_using_subcommand h; and not __fish_seen_subcommand_from list show copy help" -f -a "copy" -d 'Copy a transcription from history to clipboard' -complete -c ostt -n "__fish_ostt_using_subcommand h; and not __fish_seen_subcommand_from list show copy help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from list" -l limit -d 'Limit to N most recent entries' -r -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from show" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from show" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from copy" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from copy" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from help" -f -a "list" -d 'List transcription history' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from help" -f -a "show" -d 'Show a transcription from history' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from help" -f -a "copy" -d 'Copy a transcription from history to clipboard' -complete -c ostt -n "__fish_ostt_using_subcommand h; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and not __fish_seen_subcommand_from list add remove help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and not __fish_seen_subcommand_from list add remove help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and not __fish_seen_subcommand_from list add remove help" -f -a "list" -d 'List transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and not __fish_seen_subcommand_from list add remove help" -f -a "add" -d 'Add transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and not __fish_seen_subcommand_from list add remove help" -f -a "remove" -d 'Remove transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and not __fish_seen_subcommand_from list add remove help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from add" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from add" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from remove" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from remove" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from help" -f -a "list" -d 'List transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from help" -f -a "add" -d 'Add transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from help" -f -a "remove" -d 'Remove transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand keyword; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand k; and not __fish_seen_subcommand_from list add remove help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand k; and not __fish_seen_subcommand_from list add remove help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand k; and not __fish_seen_subcommand_from list add remove help" -f -a "list" -d 'List transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand k; and not __fish_seen_subcommand_from list add remove help" -f -a "add" -d 'Add transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand k; and not __fish_seen_subcommand_from list add remove help" -f -a "remove" -d 'Remove transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand k; and not __fish_seen_subcommand_from list add remove help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from list" -l format -d 'Output format' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from list" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from list" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from add" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from add" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from remove" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from remove" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from help" -f -a "list" -d 'List transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from help" -f -a "add" -d 'Add transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from help" -f -a "remove" -d 'Remove transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand k; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand replace" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand replace" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand config; and not __fish_seen_subcommand_from path list-devices help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand config; and not __fish_seen_subcommand_from path list-devices help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand config; and not __fish_seen_subcommand_from path list-devices help" -f -a "path" -d 'Print the config file path' -complete -c ostt -n "__fish_ostt_using_subcommand config; and not __fish_seen_subcommand_from path list-devices help" -f -a "list-devices" -d 'List audio input devices for config selection' -complete -c ostt -n "__fish_ostt_using_subcommand config; and not __fish_seen_subcommand_from path list-devices help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from path" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from path" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from list-devices" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from list-devices" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "path" -d 'Print the config file path' -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "list-devices" -d 'List audio input devices for config selection' -complete -c ostt -n "__fish_ostt_using_subcommand config; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand c; and not __fish_seen_subcommand_from path list-devices help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand c; and not __fish_seen_subcommand_from path list-devices help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand c; and not __fish_seen_subcommand_from path list-devices help" -f -a "path" -d 'Print the config file path' -complete -c ostt -n "__fish_ostt_using_subcommand c; and not __fish_seen_subcommand_from path list-devices help" -f -a "list-devices" -d 'List audio input devices for config selection' -complete -c ostt -n "__fish_ostt_using_subcommand c; and not __fish_seen_subcommand_from path list-devices help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from path" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from path" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from list-devices" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from list-devices" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from help" -f -a "path" -d 'Print the config file path' -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from help" -f -a "list-devices" -d 'List audio input devices for config selection' -complete -c ostt -n "__fish_ostt_using_subcommand c; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and not __fish_seen_subcommand_from follow path help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand logs; and not __fish_seen_subcommand_from follow path help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and not __fish_seen_subcommand_from follow path help" -f -a "follow" -d 'Follow the latest log file' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and not __fish_seen_subcommand_from follow path help" -f -a "path" -d 'Print the latest log file path' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and not __fish_seen_subcommand_from follow path help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from follow" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from follow" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from path" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from path" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from help" -f -a "follow" -d 'Follow the latest log file' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from help" -f -a "path" -d 'Print the latest log file path' -complete -c ostt -n "__fish_ostt_using_subcommand logs; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand process" -s o -l output -d 'Write result to file instead of stdout (shadows global -o)' -r -complete -c ostt -n "__fish_ostt_using_subcommand process" -l format -d 'Output format for `ostt process list`' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand process" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand process" -s c -l clipboard -d 'Copy result to clipboard instead of stdout (shadows global -c)' -complete -c ostt -n "__fish_ostt_using_subcommand process" -l paste -d 'Paste result into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand process" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand p" -s o -l output -d 'Write result to file instead of stdout (shadows global -o)' -r -complete -c ostt -n "__fish_ostt_using_subcommand p" -l format -d 'Output format for `ostt process list`' -r -f -a "table\t'' -json\t''" -complete -c ostt -n "__fish_ostt_using_subcommand p" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand p" -s c -l clipboard -d 'Copy result to clipboard instead of stdout (shadows global -c)' -complete -c ostt -n "__fish_ostt_using_subcommand p" -l paste -d 'Paste result into the focused app' -complete -c ostt -n "__fish_ostt_using_subcommand p" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand launch" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand launch" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand l" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand l" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand completions; and not __fish_seen_subcommand_from install help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand completions; and not __fish_seen_subcommand_from install help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand completions; and not __fish_seen_subcommand_from install help" -a "install" -d 'Install completions to the standard system directory' -complete -c ostt -n "__fish_ostt_using_subcommand completions; and not __fish_seen_subcommand_from install help" -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand completions; and __fish_seen_subcommand_from install" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand completions; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand completions; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install completions to the standard system directory' -complete -c ostt -n "__fish_ostt_using_subcommand completions; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "start" -d 'Start the daemon for the active local model' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "stop" -d 'Stop the running daemon' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "restart" -d 'Restart the daemon with the currently active local model' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "status" -d 'Show daemon status (running, model, PID, service)' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "install" -d 'Install daemon as a login service (auto-start on login)' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "uninstall" -d 'Remove the daemon login service' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "run" -d '[Internal] Run the daemon process — used by the service manager and daemon start' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from start" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from start" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from stop" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from stop" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from restart" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from restart" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from status" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from status" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from install" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from uninstall" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from run" -l model-id -d 'Model ID to load (defaults to the currently active local model)' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from run" -l idle-timeout-secs -d 'Exit after this many seconds of inactivity (omit for no timeout)' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from run" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from run" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "start" -d 'Start the daemon for the active local model' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "stop" -d 'Stop the running daemon' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "restart" -d 'Restart the daemon with the currently active local model' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "status" -d 'Show daemon status (running, model, PID, service)' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install daemon as a login service (auto-start on login)' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Remove the daemon login service' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "run" -d '[Internal] Run the daemon process — used by the service manager and daemon start' -complete -c ostt -n "__fish_ostt_using_subcommand daemon; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -s h -l help -d 'Print help (see more with \'--help\')' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "start" -d 'Start the daemon for the active local model' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "stop" -d 'Stop the running daemon' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "restart" -d 'Restart the daemon with the currently active local model' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "status" -d 'Show daemon status (running, model, PID, service)' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "install" -d 'Install daemon as a login service (auto-start on login)' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "uninstall" -d 'Remove the daemon login service' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "run" -d '[Internal] Run the daemon process — used by the service manager and daemon start' -complete -c ostt -n "__fish_ostt_using_subcommand d; and not __fish_seen_subcommand_from start stop restart status install uninstall run help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from start" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from start" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from stop" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from stop" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from restart" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from restart" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from status" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from status" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from install" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from install" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from uninstall" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from uninstall" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from run" -l model-id -d 'Model ID to load (defaults to the currently active local model)' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from run" -l idle-timeout-secs -d 'Exit after this many seconds of inactivity (omit for no timeout)' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from run" -l param -d 'Override a transcription param for this run, as key=value' -r -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from run" -s h -l help -d 'Print help' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "start" -d 'Start the daemon for the active local model' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "stop" -d 'Stop the running daemon' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "restart" -d 'Restart the daemon with the currently active local model' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "status" -d 'Show daemon status (running, model, PID, service)' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "install" -d 'Install daemon as a login service (auto-start on login)' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "uninstall" -d 'Remove the daemon login service' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "run" -d '[Internal] Run the daemon process — used by the service manager and daemon start' -complete -c ostt -n "__fish_ostt_using_subcommand d; and __fish_seen_subcommand_from help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "record" -d 'Record audio with real-time visualization (default)' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "retry" -d 'Retry transcription of a previous recording' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "transcribe" -d 'Transcribe a pre-recorded audio file' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "replay" -d 'Replay a previous recording using system audio player' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "auth" -d 'Manage cloud provider credentials' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "model" -d 'Choose and manage cloud or local transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "history" -d 'View and browse transcription history' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "keyword" -d 'Manage keywords for improved transcription accuracy' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "replace" -d 'Manage deterministic text replace rules' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "config" -d 'Open configuration file in your preferred editor' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "logs" -d 'Show recent log entries from the application' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "process" -d 'Post-process a transcription from history' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "launch" -d 'Launch ostt in a popup terminal window' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "completions" -d 'Generate shell completion script' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "daemon" -d 'Manage the local model daemon' -complete -c ostt -n "__fish_ostt_using_subcommand help; and not __fish_seen_subcommand_from record retry transcribe replay auth model history keyword replace config logs process launch completions daemon help" -f -a "help" -d 'Print this message or the help of the given subcommand(s)' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from auth" -f -a "login" -d 'Add or update a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from auth" -f -a "logout" -d 'Remove a cloud provider credential' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from auth" -f -a "list" -d 'List authenticated providers' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from auth" -f -a "status" -d 'Show authentication status' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from model" -f -a "list" -d 'List available transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from model" -f -a "current" -d 'Show the currently selected transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from model" -f -a "params" -d 'List supported transcription params for a transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from model" -f -a "select" -d 'Select the active transcription model' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from model" -f -a "local" -d 'Manage local transcription models' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from history" -f -a "list" -d 'List transcription history' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from history" -f -a "show" -d 'Show a transcription from history' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from history" -f -a "copy" -d 'Copy a transcription from history to clipboard' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from keyword" -f -a "list" -d 'List transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from keyword" -f -a "add" -d 'Add transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from keyword" -f -a "remove" -d 'Remove transcription keywords' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "path" -d 'Print the config file path' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from config" -f -a "list-devices" -d 'List audio input devices for config selection' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from logs" -f -a "follow" -d 'Follow the latest log file' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from logs" -f -a "path" -d 'Print the latest log file path' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from completions" -f -a "install" -d 'Install completions to the standard system directory' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "start" -d 'Start the daemon for the active local model' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "stop" -d 'Stop the running daemon' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "restart" -d 'Restart the daemon with the currently active local model' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "status" -d 'Show daemon status (running, model, PID, service)' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "install" -d 'Install daemon as a login service (auto-start on login)' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "uninstall" -d 'Remove the daemon login service' -complete -c ostt -n "__fish_ostt_using_subcommand help; and __fish_seen_subcommand_from daemon" -f -a "run" -d '[Internal] Run the daemon process — used by the service manager and daemon start' diff --git a/dot_config/fish/conf.d/00-path.fish b/dot_config/fish/conf.d/00-path.fish deleted file mode 100644 index 1540202..0000000 --- a/dot_config/fish/conf.d/00-path.fish +++ /dev/null @@ -1,18 +0,0 @@ -# PATH — runs for every shell (scripts need these too). -# ~/.local/bin and ~/.cargo/bin are handled by inir-path.fish / rustup.fish. -fish_add_path $HOME/.bun/bin -fish_add_path $HOME/.local/share/go/bin -fish_add_path $HOME/.maestro/bin -fish_add_path $HOME/.grok/bin -fish_add_path $HOME/.opencode/bin -fish_add_path -a $HOME/.foundry/bin - -# Android SDK (relocated under ~/.local/share/android) -fish_add_path -a $HOME/.local/share/android/platform-tools -fish_add_path -a $HOME/.local/share/android/cmdline-tools/latest/bin -fish_add_path -a $HOME/.local/share/android/emulator -fish_add_path -a $HOME/local/share/pnpm - -# pnpm -set -gx PNPM_HOME $HOME/.local/share/pnpm -fish_add_path $PNPM_HOME/bin diff --git a/dot_config/fish/conf.d/10-env.fish b/dot_config/fish/conf.d/10-env.fish deleted file mode 100644 index 080e920..0000000 --- a/dot_config/fish/conf.d/10-env.fish +++ /dev/null @@ -1,69 +0,0 @@ -# Environment — non-secret. Secrets live in conf.d/secrets.fish (gitignored). -set -g fish_greeting - -# Bottom-pinned prompt toggle (config.fish + functions/clear.fish). -# 1 = pin prompt to the bottom of the terminal, 0 = default top prompt. -# Respects an inherited value, so `FISH_BOTTOM_PROMPT=0 fish` opts out. -set -q FISH_BOTTOM_PROMPT; or set -gx FISH_BOTTOM_PROMPT 0 - -# GPU (ROCm / HIP) — used by ML scripts, so set unconditionally. -set -gx HSA_OVERRIDE_GFX_VERSION 11.5.0 -set -gx ROCR_VISIBLE_DEVICES 0 -set -gx HIP_VISIBLE_DEVICES 0 - -set -gx EGET_BIN $HOME/.local/bin - -# Repo roots (ghq) -set -gx GHQ_ROOT $HOME/Code -set -gx CODE_ROOT $HOME/Code - -set -gx EDITOR nvim -set -gx VISUAL nvim - -# Go env (GOPATH/GOBIN) is pinned in ~/.config/mise/config.toml [env] because -# mise's fish hook re-applies env each prompt and would clobber a shell-set -# GOBIN. GOROOT is provided by mise (toolchain under ~/.local/share/mise). - -# Android SDK — relocated under ~/.local/share/android. -set -gx ANDROID_HOME $HOME/.local/share/android -set -gx ANDROID_SDK_ROOT $ANDROID_HOME - -# Git hosts (non-secret; tokens are in secrets.fish) -set -gx GITEA_LOGIN prad.codes -set -gx GITLAB_HOST git.sonr.org - -# GITHUB_TOKEN from gh's keyring login — never stored on disk. An inherited -# value wins, so nested shells skip the gh call. -if not set -q GITHUB_TOKEN; and command -q gh - set -l _gh_token (gh auth token 2>/dev/null) - test -n "$_gh_token"; and set -gx GITHUB_TOKEN $_gh_token -end - -set -gx EDITOR nvim -set -gx VISUAL nvim - -test -x /usr/bin/brave-origin; and set -gx BROWSER /usr/bin/brave-origin -test -x /usr/bin/chromium; and set -gx CHROME_EXECUTABLE /usr/bin/chromium -# Puppeteer / CDP tools — chrome-headless-shell via @puppeteer/browsers, -# symlinked from ~/.config/chrome-headless-shell// into ~/.local/bin. -# NOTE: omp's browser tool prefers detected system Chrome over this env var; -# ~/.local/bin/google-chrome-stable shims its first detection candidate to the -# same binary (and masks the broken /usr/bin/google-chrome wrapper). -set -gx PUPPETEER_EXECUTABLE_PATH $HOME/.local/bin/chrome-headless-shell -set -gx ZEAL_DOCSETS $HOME/.var/app/org.zealdocs.Zeal/data/Zeal/Zeal/docsets -set -gx SHARP_IGNORE_GLOBAL_LIBVIPS 1 - -set -gx FZF_DEFAULT_OPTS " - --height=~40% - --layout=default - --info=inline-right - --border=rounded - --prompt=' ' - --pointer='▶' - --marker='✓' - --color=fg:#ffffff,fg+:#ffffff,bg:-1,bg+:#3c4048 - --color=hl:#5ef1ff,hl+:#5ef1ff - --color=info:#7b8496,header:#7b8496,border:#7b8496 - --color=prompt:#5ef1ff,pointer:#ffaecf,marker:#5eff6c,spinner:#f1ff5e - --color=gutter:-1,query:#ffffff -" diff --git a/dot_config/fish/conf.d/20-aliases.fish b/dot_config/fish/conf.d/20-aliases.fish deleted file mode 100644 index e222a34..0000000 --- a/dot_config/fish/conf.d/20-aliases.fish +++ /dev/null @@ -1,78 +0,0 @@ -# Aliases — generated from .chezmoidata/aliases.yaml (shared with bash/zsh -# via ~/.config/shell/aliases.sh). Add shell-agnostic aliases in the YAML; -# fish-only bits live below the generated block. - -# Editors / file managers -alias e nvim -alias vim nvim -alias e.f 'cd ~/.local/share/chezmoi/dot_config/fish && yazi' -alias e.h 'cd ~/.local/share/chezmoi/dot_config/hypr && yazi' -alias e.k 'yazi ~/.local/share/chezmoi/dot_config/kitty' -alias e.n 'yazi ~/.local/share/chezmoi/dot_config/niri' -alias e.y 'yazi ~/.local/share/chezmoi/yazi' -alias e.t 'nvim ~/.local/share/chezmoi/dot_config/tmux/tmux.conf' -alias e.v 'yazi ~/.config/nvim/lua' - -# Bun -alias br 'bun run' -alias br.d 'bun run dev' -alias br.b 'bun run build' -alias br.t 'bun run test' -alias bi 'bun install' -alias bg 'bun install -g' -alias bx 'bunx' - -# Quick directory jumps -alias cdc 'cd ~/.config && yazi' -alias ,, 'cd ~/.local/share/chezmoi && yazi' -alias cdk 'cd ~/Documents/Knowledge && obsidian' -alias cdl 'cd ~/.local && yazi' -alias cds 'cd ~/.local/share/services && ls' -alias cdw 'cd ~/Downloads && yazi' - -# Tools -alias hx helix -alias dd lazydocker -alias gg lazygit -alias ff 'exec fish' -alias npx bunx -alias sm 'sudo micro' -alias sd 'ssh prad@192.168.1.68' -alias oc opencode -alias dss 'dotstate sync' -alias fabric fabric-ai -alias bk bead-kanban -alias sua 'shelly upgrade-all -n' -alias lc leetcode -alias tk task -alias .. 'cd ..' - -# Clipboard -if command -v wl-copy >/dev/null 2>&1 - alias cpy wl-copy - alias pst wl-paste -else if command -v pbcopy >/dev/null 2>&1 - alias cpy pbcopy - alias pst pbpaste -end - -# q exits the shell; if this shell was spawned from yazi's own `q` bind -# (`shell "$SHELL" --block`), also tell that yazi to quit so exiting -# doesn't bounce back into the file manager. -function q --description 'exit (and quit parent yazi)' - if set -q YAZI_ID; and command -q ya - ya emit quit 2>/dev/null - end - exit -end - -# Interactive-only: don't override `ls` for scripts. -if status is-interactive - # `clear` is functions/clear.fish (kitty scrollback + bottom-pinned - # prompt) — don't alias it here, an alias would shadow the autoload. - alias celar clear - alias claer clear - if command -v eza >/dev/null 2>&1 - alias ls 'eza --icons' - end -end diff --git a/dot_config/fish/conf.d/30-ssh-agent.fish b/dot_config/fish/conf.d/30-ssh-agent.fish deleted file mode 100644 index 2d9a843..0000000 --- a/dot_config/fish/conf.d/30-ssh-agent.fish +++ /dev/null @@ -1,13 +0,0 @@ -# Start or reuse a single ssh-agent shared across shells. -# Respects an externally provided SSH_AUTH_SOCK (systemd unit, forwarding, keyring). -if status is-interactive; and not set -q SSH_AUTH_SOCK - set -l env_file $HOME/.ssh/agent.env.fish - test -r $env_file; and source $env_file - - # ssh-add exit 2 = no agent reachable (0/1 = agent alive) - ssh-add -l >/dev/null 2>&1 - if test $status -eq 2 - ssh-agent -c | string replace -r '^setenv (\S+) (\S+);$' 'set -gx $1 $2' | string match -rv '^echo ' >$env_file - source $env_file - end -end diff --git a/dot_config/fish/conf.d/40-tools.fish b/dot_config/fish/conf.d/40-tools.fish deleted file mode 100644 index 75f869d..0000000 --- a/dot_config/fish/conf.d/40-tools.fish +++ /dev/null @@ -1,28 +0,0 @@ -# Tool initialization. -# mise provides tool shims, so activate it for every shell (scripts included). -mise activate fish | source - -# Everything below spawns subprocesses or only matters for a prompt — -# skip it for non-interactive shells to keep scripts fast. -status is-interactive; or return - -# Material You terminal colors generated from the wallpaper (quickshell). -if test -f ~/.local/state/quickshell/user/generated/terminal/sequences.txt - cat ~/.local/state/quickshell/user/generated/terminal/sequences.txt -end - -command -v tv >/dev/null 2>&1; and tv init fish | source -command -v starship >/dev/null 2>&1; and starship init fish | source -command -v zoxide >/dev/null 2>&1; and zoxide init fish | source -command -v entire >/dev/null 2>&1; and entire completion fish | source -# television fuzzy finder — sourced BEFORE hishtory so hishtory keeps -# ctrl-r; tv's default binds are curated in fish_user_key_bindings. -command -v tv >/dev/null 2>&1; and tv init fish | source - -# hishtory shell history -test -f ~/.hishtory/config.fish; and source ~/.hishtory/config.fish - -# unsloth studio python venv -test -f ~/.unsloth/studio/unsloth_studio/bin/activate.fish - and source ~/.unsloth/studio/unsloth_studio/bin/activate.fish - diff --git a/dot_config/fish/conf.d/50-terminal-title.fish b/dot_config/fish/conf.d/50-terminal-title.fish deleted file mode 100644 index 176a0fb..0000000 --- a/dot_config/fish/conf.d/50-terminal-title.fish +++ /dev/null @@ -1,8 +0,0 @@ -# Set the tmux/screen window name from $PWD (the ESC-k sequence). -# fish_title() handles the regular terminal title; this targets multiplexers. -status is-interactive; or return - -function terminal_title --on-variable PWD - printf '\033k%s\033\\' (prompt_pwd) -end -terminal_title diff --git a/dot_config/fish/conf.d/inir-env.fish b/dot_config/fish/conf.d/inir-env.fish deleted file mode 100644 index e5d2ba6..0000000 --- a/dot_config/fish/conf.d/inir-env.fish +++ /dev/null @@ -1,3 +0,0 @@ -# iNiR environment — auto-generated by setup install -set -gx INIR_VENV "/home/prad/.local/state/quickshell/.venv" -set -gx ILLOGICAL_IMPULSE_VIRTUAL_ENV "$INIR_VENV" diff --git a/dot_config/fish/conf.d/inir-path.fish b/dot_config/fish/conf.d/inir-path.fish deleted file mode 100644 index 0e437f9..0000000 --- a/dot_config/fish/conf.d/inir-path.fish +++ /dev/null @@ -1,3 +0,0 @@ -if not contains -- "/home/prad/.local/bin" $PATH - set -gx PATH "/home/prad/.local/bin" $PATH -end diff --git a/dot_config/fish/conf.d/nvm.fish b/dot_config/fish/conf.d/nvm.fish deleted file mode 100644 index 7545699..0000000 --- a/dot_config/fish/conf.d/nvm.fish +++ /dev/null @@ -1,28 +0,0 @@ -set --query XDG_DATA_HOME || set --local XDG_DATA_HOME ~/.local/share -set --query nvm_mirror || set --global nvm_mirror https://nodejs.org/dist -set --query nvm_data || set --global nvm_data $XDG_DATA_HOME/nvm - -function _nvm_install --on-event nvm_install - test ! -d $nvm_data && command mkdir -p $nvm_data - echo "Downloading the Node distribution index..." 2>/dev/null - _nvm_index_update -end - -function _nvm_update --on-event nvm_update - set --query --universal nvm_data && set --erase --universal nvm_data - set --query --universal nvm_mirror && set --erase --universal nvm_mirror - set --query nvm_mirror || set --global nvm_mirror https://nodejs.org/dist -end - -function _nvm_uninstall --on-event nvm_uninstall - command rm -rf $nvm_data - - set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version - - set --names | string replace --filter --regex -- "^nvm" "set --erase nvm" | source - functions --erase (functions --all | string match --entire --regex -- "^_nvm_") -end - -if status is-interactive && set --query nvm_default_version && ! set --query nvm_current_version - nvm use --silent $nvm_default_version -end diff --git a/dot_config/fish/conf.d/opencode-background-subagents.fish b/dot_config/fish/conf.d/opencode-background-subagents.fish deleted file mode 100644 index 348257d..0000000 --- a/dot_config/fish/conf.d/opencode-background-subagents.fish +++ /dev/null @@ -1,4 +0,0 @@ -# >>> oh-my-opencode-slim background subagents >>> -set -gx OPENCODE_EXPERIMENTAL_BACKGROUND_SUBAGENTS true -set -gx OPENCODE_ENABLE_EXA 1 -# <<< oh-my-opencode-slim background subagents <<< diff --git a/dot_config/fish/conf.d/pnpm-filter.fish b/dot_config/fish/conf.d/pnpm-filter.fish deleted file mode 100644 index 210ada4..0000000 --- a/dot_config/fish/conf.d/pnpm-filter.fish +++ /dev/null @@ -1,42 +0,0 @@ -# ~/.config/fish/conf.d/pnpm-filter.fish - -# Shared helper: pick a workspace package name via gum filter -function __pnpm_pick_pkg - pnpm m ls --depth -1 --json 2>/dev/null \ - | jq -r '.[] | select(.name != null) | .name' \ - | gum filter --placeholder "Select package…" --height 12 -end - -# pnpmf: add deps to a selected package -# usage: pnpmf viem zod -function pnpmf -d "pnpm add to a workspace package (gum filter)" - set -l pkg (__pnpm_pick_pkg); or return - gum spin --title "Adding $argv → $pkg" -- pnpm --filter $pkg add $argv -end - -# pnpmfd: add devDependencies -function pnpmfd -d "pnpm add -D to a workspace package" - set -l pkg (__pnpm_pick_pkg); or return - gum spin --title "Adding (dev) $argv → $pkg" -- pnpm --filter $pkg add -D $argv -end - -# pnpmfr: remove deps -function pnpmfr -d "pnpm remove from a workspace package" - set -l pkg (__pnpm_pick_pkg); or return - pnpm --filter $pkg remove $argv -end - -# pnpmfw: link a sibling workspace package (workspace:^) -function pnpmfw -d "pnpm add --workspace sibling package" - set -l pkg (__pnpm_pick_pkg); or return - set -l dep (__pnpm_pick_pkg); or return - pnpm --filter $pkg add $dep --workspace -end - -# pnpmfx: run a script in a selected package, script also picked via gum -function pnpmfx -d "pnpm run script in a workspace package" - set -l pkg (__pnpm_pick_pkg); or return - set -l dir (pnpm m ls --depth -1 --json | jq -r ".[] | select(.name == \"$pkg\") | .path") - set -l script (jq -r '.scripts | keys[]' $dir/package.json | gum filter --placeholder "Script…"); or return - pnpm --filter $pkg run $script -end diff --git a/dot_config/fish/conf.d/rustup.fish b/dot_config/fish/conf.d/rustup.fish deleted file mode 100644 index e4cb363..0000000 --- a/dot_config/fish/conf.d/rustup.fish +++ /dev/null @@ -1 +0,0 @@ -source "$HOME/.cargo/env.fish" diff --git a/dot_config/fish/conf.d/secrets.fish b/dot_config/fish/conf.d/secrets.fish deleted file mode 100644 index c062951..0000000 --- a/dot_config/fish/conf.d/secrets.fish +++ /dev/null @@ -1,21 +0,0 @@ -# Secrets — gitignored. Do NOT commit. Rotate anything that ever was committed. -set -gx PGDATABASE 'postgresql://prad:dv@localhost:5432/devdb' - -set -gx HF_TOKEN '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' -set -gx GITLAB_TOKEN 'glpat-CUmtwRHJl1gkFZKXnOPiEG86MQp1OjEH.01.0w0405m5v' -set -gx OPPER_API_KEY 'op-5S93K4PP2AIQXVY1Y1Q5' -set -gx OPENAI_API_KEY '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' -set -gx GROQ_API_KEY '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' -set -gx WEBAWESOME_NPM_TOKEN 'my_LVaJupQwmJKhgm1lMa' -set -gx TAVILY_API_KEY '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' -set -gx FINANCIAL_DATASETS_API_KEY '338132a1-4349-443a-9a39-47a4c4f1e55f' -set -gx PIMLICO_API_KEY 'pim_bQtdWLgXDUuBSzdTJAjWn2' -set -gx WAKATIME_API_KEY 'waka_4f74f981-d1f7-489d-9270-f8423768476d' - - -set -gx LINEAR_CLI_PROFILE 'walletbase' - -set -gx LINEAR_API_KEY 'lin_api_Z3HTtgAXHAD5LqvV3CaCMEmHYNjzTkKFdJC1quin' -set -gx LINEAR_TEAM_ID 'deb602fb-cae3-42cf-9084-3b1fd4fa6589' - - diff --git a/dot_config/fish/conf.d/uv.env.fish b/dot_config/fish/conf.d/uv.env.fish deleted file mode 100644 index d97734b..0000000 --- a/dot_config/fish/conf.d/uv.env.fish +++ /dev/null @@ -1,2 +0,0 @@ - -source "$HOME/.local/share/../bin/env.fish" diff --git a/dot_config/fish/config.fish b/dot_config/fish/config.fish deleted file mode 100644 index f29ae8f..0000000 --- a/dot_config/fish/config.fish +++ /dev/null @@ -1,104 +0,0 @@ -# Config is split into autoloaded files (see `man fish` → Configuration files): -# conf.d/00-path.fish PATH entries -# conf.d/10-env.fish environment + fish_greeting + fzf theme -# conf.d/20-aliases.fish aliases -# conf.d/40-tools.fish starship / zoxide / mise / hishtory init -# conf.d/50-terminal-title.fish tmux window title -# conf.d/secrets.fish API keys (gitignored) -# functions/ one autoloaded function per file -# functions/fish_user_key_bindings.fish key bindings -# -# Nothing needs to live here; keep it empty so startup stays fast. - -function starship_transient_prompt_func - starship module character -end - -function starship_transient_rprompt_func - starship module time -end - -starship init fish | source -enable_transience - -# Pin the prompt to the bottom of the terminal (FISH_BOTTOM_PROMPT=1, the -# default from conf.d/10-env.fish; set 0 for the normal top prompt). -# functions/clear.fish and the ctrl-l binding re-pin it after clearing. -status is-interactive; and test "$FISH_BOTTOM_PROMPT" = 1; and tput cup $LINES 0 - -# >>> grok installer >>> -fish_add_path $HOME/.grok/bin -# <<< grok installer <<< - -# Generated for envman. Do not edit. -test -s ~/.config/envman/load.fish; and source ~/.config/envman/load.fish - -if status is-interactive - atuin init fish | source - # atuin 18.21 dropped `atuin ai init`; the `?` binding it used to emit is - # copied below as _atuin_ai_question_mark. -end - -# cmux -fish_add_path "/home/prad/.cmux/bin" -fish_add_path "/home/prad/.cache/.bun/bin" - -for _f in $HOME/.config/herdr/plugins/github/herdr-automatic-rename-*/shell/hook.fish - test -r "$_f"; and source "$_f"; and break -end - - -# Question mark at start of line - natural language mode -function _atuin_ai_question_mark - set -l buf (commandline -b) - - # If buffer is empty or just contains '?', trigger natural language mode - if test -z "$buf" -o "$buf" = "?" - commandline -r "" - - # Close the semantic prompt zone (OSC 133 C) so terminals with - # shell integration don't erase the TUI's output during their - # resize-time prompt reflow. - printf '\033]133;C\007' > /dev/tty - - # Run atuin ai inline, swapping stdout and stderr - set -l output (atuin ai inline --hook 3>&1 1>&2 2>&3 | string collect) - - if string match --quiet '__atuin_ai_print__:*' "$output" - echo (string replace "__atuin_ai_print__:" "" -- "$output" | string collect) - commandline -f repaint - else if test "$output" = "__atuin_ai_cancel__" - commandline -f repaint - else if string match --quiet '__atuin_ai_execute__:*' "$output" - # Execute the command immediately - set -l cmd (string replace "__atuin_ai_execute__:" "" -- "$output" | string collect) - commandline -r "$cmd" - commandline -f repaint - commandline -f execute - else if string match --quiet '__atuin_ai_insert__:*' "$output" - # Insert the command for editing - set -l cmd (string replace "__atuin_ai_insert__:" "" -- "$output" | string collect) - commandline -r "$cmd" - commandline -f repaint - else if test -n "$output" - # Default: insert for editing - commandline -r "$output" - commandline -f repaint - else - commandline -f repaint - end - else if not contains -- "$fish_key_bindings" fish_vi_key_bindings fish_hybrid_key_bindings - # Not at empty prompt, just insert the question mark - commandline -i "?" - end -end - -# Set up keybindings -bind "?" _atuin_ai_question_mark - -eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv fish)" - -# Added by LM Studio CLI (lms) -set -gx PATH $PATH /home/prad/.lmstudio/bin -# End of LM Studio CLI section - diff --git a/dot_config/fish/config.fish.bak.1783797282 b/dot_config/fish/config.fish.bak.1783797282 deleted file mode 100644 index 92cdbcd..0000000 --- a/dot_config/fish/config.fish.bak.1783797282 +++ /dev/null @@ -1,27 +0,0 @@ -# Config is split into autoloaded files (see `man fish` → Configuration files): -# conf.d/00-path.fish PATH entries -# conf.d/10-env.fish environment + fish_greeting + fzf theme -# conf.d/20-aliases.fish aliases -# conf.d/40-tools.fish starship / zoxide / mise / hishtory init -# conf.d/50-terminal-title.fish tmux window title -# conf.d/secrets.fish API keys (gitignored) -# functions/ one autoloaded function per file -# functions/fish_user_key_bindings.fish key bindings -# -# Nothing needs to live here; keep it empty so startup stays fast. - -function starship_transient_prompt_func - starship module character -end - -function starship_transient_rprompt_func - starship module time -end - -starship init fish | source -enable_transience - -# Pin the prompt to the bottom of the terminal (FISH_BOTTOM_PROMPT=1, the -# default from conf.d/10-env.fish; set 0 for the normal top prompt). -# functions/clear.fish and the ctrl-l binding re-pin it after clearing. -status is-interactive; and test "$FISH_BOTTOM_PROMPT" = 1; and tput cup $LINES 0 diff --git a/dot_config/fish/fish_plugins b/dot_config/fish/fish_plugins deleted file mode 100644 index aea2aa0..0000000 --- a/dot_config/fish/fish_plugins +++ /dev/null @@ -1 +0,0 @@ -jorgebucaran/nvm.fish diff --git a/dot_config/fish/functions/_gho_bind.fish b/dot_config/fish/functions/_gho_bind.fish deleted file mode 100644 index 3518ae6..0000000 --- a/dot_config/fish/functions/_gho_bind.fish +++ /dev/null @@ -1,13 +0,0 @@ -function _gho_bind --description 'ctrl-o: gho (tv --inline), then redraw the prompt in the right place' - set -l before $PWD - gho - if test "$PWD" = "$before" - # Cancelled (or the nvim action ran): tv --inline left the cursor on - # the line below the prompt; step back so repaint redraws in place. - printf '\033[A' >/dev/tty - else - # cd + clear + onefetch: put the prompt below onefetch's output. - printf '\n' >/dev/tty - end - commandline -f repaint -end diff --git a/dot_config/fish/functions/_jobs_bind.fish b/dot_config/fish/functions/_jobs_bind.fish deleted file mode 100644 index 7ffe067..0000000 --- a/dot_config/fish/functions/_jobs_bind.fish +++ /dev/null @@ -1,54 +0,0 @@ -function _jobs_bind --description 'ctrl-z: fg the only job, or pick one from the jobs tv cable' - # Only reached at the prompt: while a job owns the terminal, ctrl-z is the - # tty's SIGTSTP and stops it. So ctrl-z toggles: suspend, then resume. - # Records for the `jobs` cable: display, job id, process group (tabs). - set -l recs - for line in (jobs 2>/dev/null) - set -l f (string split \t -- $line) - string match -qr '^\d+$' -- $f[1]; or continue # header row - set -a recs (printf '%%%s %-8s %s\t%s\t%s' $f[1] $f[4] $f[5] $f[1] $f[2]) - end - - set -l id - switch (count $recs) - case 0 - return - case 1 - set id (string split \t -- $recs[1])[2] - case '*' - set -lx TV_JOBS (mktemp) - printf '%s\n' $recs >$TV_JOBS - set id (_tv_inline jobs) - rm -f $TV_JOBS - end - - if test -z "$id" - commandline -f repaint - return - end - - # Run fg as a command line, not from the binding: a binding runs with the - # terminal still in fish's reader mode (extended keys on), so a job that - # never had the terminal (started with &) would get ctrl-z/ctrl-c as escape - # sequences instead of signals. The leading space keeps it out of history. - # Whatever was typed comes back at the next prompt. - set -l buf (commandline | string collect) - if test -n "$buf" - set -g __jobs_bind_buf $buf - function __jobs_bind_restore --on-event fish_prompt - functions -e __jobs_bind_restore - commandline -r -- $__jobs_bind_buf - set -e __jobs_bind_buf - end - end - - # Executing leaves "❯ __jobs_bind_fg 1" on the prompt line: step up and - # erase it, and drop fg's "Send job … to foreground" (stderr of fg only; - # the job keeps its own stdout/stderr). - function __jobs_bind_fg - printf '\033[A\033[2K\r' >/dev/tty - fg %$argv[1] 2>/dev/null - end - commandline -r -- " __jobs_bind_fg $id" - commandline -f execute -end diff --git a/dot_config/fish/functions/_nvm_index_update.fish b/dot_config/fish/functions/_nvm_index_update.fish deleted file mode 100644 index c66753d..0000000 --- a/dot_config/fish/functions/_nvm_index_update.fish +++ /dev/null @@ -1,20 +0,0 @@ -function _nvm_index_update - test ! -d $nvm_data && command mkdir -p $nvm_data - - set --local index $nvm_data/.index - - if not command curl -q --location --silent $nvm_mirror/index.tab >$index.temp - command rm -f $index.temp - echo "nvm: Can't update index, host unavailable: \"$nvm_mirror\"" >&2 - return 1 - end - - command awk -v OFS=\t ' - /v0.9.12/ { exit } # Unsupported - NR > 1 { - print $1 (NR == 2 ? " latest" : $10 != "-" ? " lts/" tolower($10) : "") - } - ' $index.temp >$index - - command rm -f $index.temp -end diff --git a/dot_config/fish/functions/_nvm_list.fish b/dot_config/fish/functions/_nvm_list.fish deleted file mode 100644 index 1623bb8..0000000 --- a/dot_config/fish/functions/_nvm_list.fish +++ /dev/null @@ -1,14 +0,0 @@ -function _nvm_list - set --local versions $nvm_data/* - - set --query versions[1] && - string match --entire --regex -- ( - string replace --all -- $nvm_data/ "" $versions | - string match --regex -- "v\d.+" | - string escape --style=regex | - string join "|" - ) <$nvm_data/.index - - command --all node | - string match --quiet --invert --regex -- "^$nvm_data" && echo system -end diff --git a/dot_config/fish/functions/_nvm_version_activate.fish b/dot_config/fish/functions/_nvm_version_activate.fish deleted file mode 100644 index f7dfef7..0000000 --- a/dot_config/fish/functions/_nvm_version_activate.fish +++ /dev/null @@ -1,4 +0,0 @@ -function _nvm_version_activate --argument-names ver - set --global --export nvm_current_version $ver - set --prepend PATH $nvm_data/$ver/bin -end diff --git a/dot_config/fish/functions/_nvm_version_deactivate.fish b/dot_config/fish/functions/_nvm_version_deactivate.fish deleted file mode 100644 index 24dd36e..0000000 --- a/dot_config/fish/functions/_nvm_version_deactivate.fish +++ /dev/null @@ -1,5 +0,0 @@ -function _nvm_version_deactivate --argument-names ver - test "$nvm_current_version" = "$ver" && set --erase nvm_current_version - set --local index (contains --index -- $nvm_data/$ver/bin $PATH) && - set --erase PATH[$index] -end diff --git a/dot_config/fish/functions/_pj_bind.fish b/dot_config/fish/functions/_pj_bind.fish deleted file mode 100644 index bc265d7..0000000 --- a/dot_config/fish/functions/_pj_bind.fish +++ /dev/null @@ -1,21 +0,0 @@ -function _pj_bind --description 'ctrl-p / down: pj (tv --inline), then redraw the prompt in the right place' - # pj reports through $PJ_STATE: `open` = the picker was cancelled and - # left the cursor on the line below the prompt; empty = no task sources, - # nothing drawn — but fish's repaint after an external command still - # lands one line low, so both step back up. `ran` = a task printed - # output: new line, prompt below it. - set -lx PJ_STATE (mktemp) - if contains -- --quiet $argv - set -lx PJ_QUIET 1 - end - pj - set -l state (cat $PJ_STATE) - switch "$state" - case open '' - printf '\033[A' >/dev/tty - case ran - printf '\n' >/dev/tty - end - rm -f $PJ_STATE - commandline -f repaint -end diff --git a/dot_config/fish/functions/_pj_bind_down.fish b/dot_config/fish/functions/_pj_bind_down.fish deleted file mode 100644 index 948aa39..0000000 --- a/dot_config/fish/functions/_pj_bind_down.fish +++ /dev/null @@ -1,21 +0,0 @@ -function _pj_bind_down --description "down arrow: pj tv cable on an idle empty prompt, else fish's down-or-search" - # Mirror of atuin's up binding (atuin owns up, this owns down). Everything - # that legitimately needs the arrow keys keeps them: - # - non-empty buffer → multiline cursor movement / forward history search - # - paging mode → tab-completion pager navigation (tab on an empty - # line opens the pager with an empty buffer) - # - search mode → history-search navigation - # down-or-search is fish's own input function, called as a command exactly - # the way atuin's _atuin_bind_up calls up-or-search. - set -l buf (commandline | string collect) - if test -n "$buf"; or commandline --paging-mode; or commandline --search-mode - down-or-search - return - end - - # _pj_bind runs ~/.local/bin/pj (also ctrl-p), which opens the `pj` tv - # cable. --quiet (PJ_QUIET) keeps it silent when the tree has no task - # source at all, so down is a no-op outside projects instead of printing - # an error per press. - _pj_bind --quiet -end diff --git a/dot_config/fish/functions/_tv_inline.fish b/dot_config/fish/functions/_tv_inline.fish deleted file mode 100644 index af2b544..0000000 --- a/dot_config/fish/functions/_tv_inline.fish +++ /dev/null @@ -1,10 +0,0 @@ -function _tv_inline --description 'tv --inline below the prompt, cursor back on the prompt line; stdout is the pick' - # tv --inline opens on the line below the prompt and leaves the cursor on - # its own first row when it exits; step back up so the following - # `commandline -f repaint` redraws the prompt in place instead of one line - # lower. /dev/tty keeps the move out of callers that capture stdout (gho). - tv $argv --inline - set -l st $status - printf '\033[A' >/dev/tty - return $st -end diff --git a/dot_config/fish/functions/ai.fish b/dot_config/fish/functions/ai.fish deleted file mode 100644 index 447b452..0000000 --- a/dot_config/fish/functions/ai.fish +++ /dev/null @@ -1,15 +0,0 @@ -function ai --description 'Choose and launch an AI CLI via gum' - set -l choice (gum choose --header 'AI CLI' claude opencode codex hermes fractal) - test -n "$choice"; or return # cancelled (Esc / Ctrl-C) → bail out - - switch $choice - case claude - claude --dangerously-skip-permissions - case '*' - # labels match the binary names, so just run it - # add a dedicated `case` here if another tool needs flags - $choice - end -end - - diff --git a/dot_config/fish/functions/c.fish b/dot_config/fish/functions/c.fish deleted file mode 100644 index 26a8bcd..0000000 --- a/dot_config/fish/functions/c.fish +++ /dev/null @@ -1,9 +0,0 @@ -function c - if test -z "$argv[1]" - clear - else - cd $argv[1] - end -end - - diff --git a/dot_config/fish/functions/c2p.fish b/dot_config/fish/functions/c2p.fish deleted file mode 100644 index 106a3c6..0000000 --- a/dot_config/fish/functions/c2p.fish +++ /dev/null @@ -1,3 +0,0 @@ -function c2p --description "Code2Prompt with fuzzy-search template" - fd --type f --extension hbs . $HOME/.config/code2prompt | fzf | xargs code2prompt --template -end diff --git a/dot_config/fish/functions/cd.fish b/dot_config/fish/functions/cd.fish deleted file mode 100644 index ba28ff2..0000000 --- a/dot_config/fish/functions/cd.fish +++ /dev/null @@ -1,20 +0,0 @@ -function cd --description 'cd with zoxide fallback, else builtin cd' - if test (count $argv) -eq 0 - builtin cd $HOME - else if test "$argv[1]" = '-' - builtin cd - - else if builtin cd $argv[1] 2>/dev/null - # exact path resolved, nothing else to do - else if type -q zoxide - set -l target (zoxide query -- $argv[1] 2>/dev/null) - if test -n "$target" - builtin cd $target - else - builtin cd $argv[1] # let builtin cd surface the real error - end - else - builtin cd $argv[1] - end - - type -q zoxide; and zoxide add $PWD -end diff --git a/dot_config/fish/functions/clear.fish b/dot_config/fish/functions/clear.fish deleted file mode 100644 index 7054070..0000000 --- a/dot_config/fish/functions/clear.fish +++ /dev/null @@ -1,11 +0,0 @@ -function clear --wraps clear --description 'clear screen + kitty scrollback, prompt pinned to the bottom' - if not status is-interactive - command clear $argv - return - end - # kitty doesn't clear scrollback with plain `clear`; 3J drops it. - printf '\033[2J\033[3J\033[1;1H' - # Re-pin only when the bottom prompt is enabled (FISH_BOTTOM_PROMPT=0 - # keeps the default top prompt). - test "$FISH_BOTTOM_PROMPT" = 1; and tput cup $LINES 0 -end diff --git a/dot_config/fish/functions/clip-last.fish b/dot_config/fish/functions/clip-last.fish deleted file mode 100644 index 3a5f256..0000000 --- a/dot_config/fish/functions/clip-last.fish +++ /dev/null @@ -1,4 +0,0 @@ -function clip-last --description 'Re-run last command, copy output to clipboard' - eval $history[1] | cpy - notify-send -a fish "Clipboard" "Command output copied to clipboard" -end diff --git a/dot_config/fish/functions/cp-appid.fish b/dot_config/fish/functions/cp-appid.fish deleted file mode 100644 index 6489665..0000000 --- a/dot_config/fish/functions/cp-appid.fish +++ /dev/null @@ -1,43 +0,0 @@ -function cp-appid --description "Fuzzy-pick a desktop app ID and copy to clipboard" - set -l search_dirs \ - /usr/share/applications \ - /usr/local/share/applications \ - $HOME/.local/share/applications \ - /var/lib/flatpak/exports/share/applications \ - $HOME/.local/share/flatpak/exports/share/applications \ - /var/lib/snapd/desktop/applications - - set -l existing_dirs - for d in $search_dirs - test -d $d; and set -a existing_dirs $d - end - - test (count $existing_dirs) -eq 0 - and echo "No application directories found." >&2 - and return 1 - - set -l chosen ( - fd --type f --extension desktop . $existing_dirs \ - | while read -l f - set -l app_id (basename $f .desktop) - set -l name (rg -m1 '^Name=' $f | string replace 'Name=' '') - test -z "$name"; and set name $app_id - echo "$name\t$app_id" - end \ - | sort -u -t\t -k1 \ - | fzf \ - --delimiter='\t' \ - --with-nth=1,2 \ - --prompt="App ID › " \ - --height=50% \ - --layout=reverse \ - --border=rounded \ - --info=inline - ) - - test -z "$chosen"; and return 0 - - set -l app_id (string split '\t' $chosen)[2] - echo -n $app_id | wl-copy - echo "Copied: $app_id" -end diff --git a/dot_config/fish/functions/czs.fish b/dot_config/fish/functions/czs.fish deleted file mode 100644 index 23d0ce1..0000000 --- a/dot_config/fish/functions/czs.fish +++ /dev/null @@ -1,37 +0,0 @@ -function czs --description 'chezmoi: re-add drifted files, then commit + push the source repo' - # Optional targets scope both the status view and the re-add, - # e.g. `chs ~/.config/fish`. No args = all managed files. - set -l drift (chezmoi status $argv) - or return - - if test -n "$drift" - printf '%s\n' $drift - # re-add takes the local (destination) contents as truth for modified - # files; templates are never overwritten, non-file entries are ignored. - chezmoi re-add $argv - or return - else - echo "chs: in sync — nothing to re-add" - end - - # Commit + sync the source repo (~/.local/share/chezmoi). - set -l src (chezmoi source-path) - if test -n "$(git -C $src status --porcelain)" - git -C $src add -A - and git -C $src commit --quiet -m 'chs: re-add drifted files' - or return - echo "chs: committed "(git -C $src rev-parse --short HEAD) - end - - # Push anything unpushed — covers this commit AND leftovers from a - # previously failed push. --autostash tolerates post-commit hooks - # (beads export) re-dirtying the tree mid-sync. - set -l ahead (git -C $src rev-list --count @{upstream}..HEAD 2>/dev/null; or echo 0) - if test $ahead -gt 0 - git -C $src pull --rebase --autostash --quiet - and git -C $src push --quiet - and echo "chs: pushed $ahead commit(s) to "(git -C $src remote get-url origin) - else - echo "chs: remote up to date" - end -end diff --git a/dot_config/fish/functions/extract_agents.fish b/dot_config/fish/functions/extract_agents.fish deleted file mode 100644 index 5c048a2..0000000 --- a/dot_config/fish/functions/extract_agents.fish +++ /dev/null @@ -1,18 +0,0 @@ -function extract_agents -d "Copy all AGENTS.md files to a target directory while preserving structure" - set -l out_dir $argv[1] - - # Validate input - if test -z "$out_dir" - echo "Error: Output directory required." - echo "Usage: extract_agents " - return 1 - end - - # Ensure output directory exists - mkdir -p $out_dir - - # Find and copy preserving relative paths - fd -t f -g "AGENTS.md" -x cp --parents "{}" $out_dir - - echo "Extraction complete. Check $out_dir." -end diff --git a/dot_config/fish/functions/fab.fish b/dot_config/fish/functions/fab.fish deleted file mode 100644 index f83dec6..0000000 --- a/dot_config/fish/functions/fab.fish +++ /dev/null @@ -1,40 +0,0 @@ -function fab -d "Fuzzy find and execute a Fabric pattern" - set -l json_file ~/.config/fabric/pattern_explainations.json - - if not test -f $json_file - set_color red; echo "Error: $json_file not found."; set_color normal - return 1 - end - - # 1. Safely capture piped input (if any) to a temp file - # This preserves all formatting, newlines, and avoids variable escaping issues - set -l temp_input (mktemp) - if not isatty stdin - cat > $temp_input - end - - # 2. Parse JSON to TSV -> fzf (Name in list, Description in preview) -> Extract Name - set -l selection (jq -r '.[] | "\(.name)\t\(.description)"' $json_file | \ - fzf --delimiter '\t' \ - --with-nth 1 \ - --preview 'echo {2}' \ - --preview-window 'right:60%:wrap' \ - --prompt 'Pattern > ' \ - --info inline \ - --bind 'ctrl-/:toggle-preview') - - # 3. Execute with or without the piped data - if test -n "$selection" - set -l pattern (string split -f 1 \t "$selection") - - # If our temp file has data (-s), pipe it. Otherwise, run bare. - if test -s $temp_input - cat $temp_input | fabric --pattern "$pattern" - else - fabric --pattern "$pattern" - end - end - - # 4. Clean up - rm -f $temp_input -end diff --git a/dot_config/fish/functions/fish_title.fish b/dot_config/fish/functions/fish_title.fish deleted file mode 100644 index 65a8f0c..0000000 --- a/dot_config/fish/functions/fish_title.fish +++ /dev/null @@ -1,8 +0,0 @@ -function fish_title - # Show a short hostname over SSH, otherwise just the current directory. - if set -q SSH_TTY - echo (prompt_hostname | string sub -l 10):(prompt_pwd) - else - prompt_pwd - end -end diff --git a/dot_config/fish/functions/fish_user_key_bindings.fish b/dot_config/fish/functions/fish_user_key_bindings.fish deleted file mode 100644 index 1b90e48..0000000 --- a/dot_config/fish/functions/fish_user_key_bindings.fish +++ /dev/null @@ -1,50 +0,0 @@ -function fish_user_key_bindings - # Vi mode first: it rebinds the preset tables and (on first activation) - # re-triggers this function via the fish_key_bindings handler, so custom - # binds must come after it to land on top. - fish_vi_key_bindings - - # Vi mode types in `insert`; bind customs there AND in `default` (normal) - # so the keys work regardless of mode. - for mode in insert default - # Keys owned by kitty.conf never reach fish and are NOT bound here: - # ctrl-g → lazygit overlay, ctrl-y → yazi vsplit, - # ctrl-h/j/k/l → vim-aware split nav (pass_keys.py). - # ctrl-e: tv git-files (bat preview, enter opens nvim). ctrl-o, ctrl-p - # and down also open tv cables — same keys in zsh and bash. tv runs - # --inline below the prompt; _tv_inline/_gho_bind/_pj_bind put the - # prompt back in place (or below any output) afterwards. ctrl-a: - # omp-session resumes or starts omp for the repo (same in zsh); when it - # opens the omp-sessions cable and it is cancelled, it steps back up. - # ctrl-n: always a new omp session. - bind -M $mode ctrl-e '_tv_inline git-files; commandline -f repaint' - bind -M $mode ctrl-b purple repaint - bind -M $mode ctrl-y clip-last - - bind -M $mode ctrl-o _gho_bind - bind -M $mode ctrl-p _pj_bind - bind -M $mode ctrl-a 'omp-session; commandline -f repaint' - bind -M $mode ctrl-n 'omp; commandline -f repaint' - bind -M $mode ctrl-w 'atuin ai inline; commandline -f repaint' - # ctrl-z at the prompt: fg the only background job, or pick one from - # the jobs tv cable when there are several (_jobs_bind). - bind -M $mode ctrl-z _jobs_bind - - # Arrow keys: atuin owns up (bound from config.fish, survives the - # fish_vi_key_bindings reset above because that only erases presets), - # down opens the pj tv cable — but only on an idle, empty prompt; see - # _pj_bind_down. - bind -M $mode down _pj_bind_down - - # ctrl-f: yazi (cd's to yazi's exit dir on quit). - bind -M $mode ctrl-f 'yy; commandline -f repaint' - bind -M $mode ctrl-g 'lazygit; commandline -f repaint' - - # ctrl-c routes through the clear wrapper (kitty scrollback + prompt - # pinned to the bottom) AND wipes any text typed on the command line. - bind -M $mode ctrl-c 'commandline -r ""; clear; commandline -f repaint' - - # ctrl-q mirrors ctrl-d's preset (`exit`) — quit the shell. - bind -M $mode ctrl-q exit - end -end diff --git a/dot_config/fish/functions/gdc.fish b/dot_config/fish/functions/gdc.fish deleted file mode 100644 index 7707748..0000000 --- a/dot_config/fish/functions/gdc.fish +++ /dev/null @@ -1,9 +0,0 @@ -function gdc --description "Discard all git changes with gum confirmation" - if gum confirm "Discard all uncommitted changes? This is irreversible." - git reset --hard HEAD - git clean -fd - echo "Changes wiped." - else - echo "Operation aborted." - end -end diff --git a/dot_config/fish/functions/gh-sonr-org-migrate.fish b/dot_config/fish/functions/gh-sonr-org-migrate.fish deleted file mode 100644 index e960b7a..0000000 --- a/dot_config/fish/functions/gh-sonr-org-migrate.fish +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env fish -# sonr-consolidate.fish -# Migrates all repos from orgs matching "sonr" into sonr-io, -# prompting via gum for renames on collision, then deletes emptied orgs. -# -# Requires: gh (authenticated as org owner on all orgs), gum, jq - -set -g TARGET_ORG sonr-io - -# ── Preflight ──────────────────────────────────────────────────────────────── -for bin in gh gum jq - if not command -q $bin - echo (set_color red)"missing dependency: $bin"(set_color normal) - exit 1 - end -end - -if not gh auth status &>/dev/null - echo (set_color red)"gh is not authenticated"(set_color normal) - exit 1 -end - -# ── Discover source orgs ───────────────────────────────────────────────────── -# All orgs the user belongs to whose login contains "sonr", excluding target. -set -l source_orgs (gh api user/orgs --paginate --jq '.[].login' \ - | string match -r '.*sonr.*' \ - | string match -v $TARGET_ORG) - -if test (count $source_orgs) -eq 0 - echo "No source orgs found. Nothing to do." - exit 0 -end - -echo (set_color cyan)"Source orgs:"(set_color normal) -printf ' %s\n' $source_orgs -echo (set_color cyan)"Target org:"(set_color normal)" $TARGET_ORG" -echo - -# Let the user confirm / trim the list interactively -set -l selected_orgs (printf '%s\n' $source_orgs | gum choose --no-limit \ - --header "Select orgs to migrate into $TARGET_ORG (space to toggle, enter to confirm)") - -if test (count $selected_orgs) -eq 0 - echo "Nothing selected. Exiting." - exit 0 -end - -# ── Helpers ────────────────────────────────────────────────────────────────── -function repo_exists_in_target - gh api "repos/$TARGET_ORG/$argv[1]" --silent &>/dev/null -end - -function transfer_repo - # $1 = source org, $2 = repo name, $3 = (optional) new name - set -l src $argv[1] - set -l repo $argv[2] - set -l args -f new_owner=$TARGET_ORG - if set -q argv[3]; and test -n "$argv[3]" - set -a args -f new_name=$argv[3] - end - gh api -X POST "repos/$src/$repo/transfer" $args --silent -end - -# ── Migration ──────────────────────────────────────────────────────────────── -set -g failed_transfers - -for org in $selected_orgs - echo - echo (set_color --bold cyan)"── $org ──"(set_color normal) - - set -l repos (gh api "orgs/$org/repos" --paginate --jq '.[].name') - - if test (count $repos) -eq 0 - echo " (no repos)" - continue - end - - for repo in $repos - set -l new_name "" - - if repo_exists_in_target $repo - echo (set_color yellow)" ⚠ $repo already exists in $TARGET_ORG"(set_color normal) - while true - set new_name (gum input \ - --header "New name for $org/$repo (exists in $TARGET_ORG)" \ - --placeholder "$org-$repo" \ - --value "$org-$repo") - if test -z "$new_name" - echo " skipped $org/$repo" - set new_name __SKIP__ - break - end - if repo_exists_in_target $new_name - echo (set_color yellow)" $new_name also exists — pick another"(set_color normal) - else - break - end - end - test "$new_name" = __SKIP__; and continue - end - - set -l label "$org/$repo → $TARGET_ORG/"(test -n "$new_name"; and echo $new_name; or echo $repo) - if transfer_repo $org $repo $new_name - echo (set_color green)" ✓ $label"(set_color normal) - else - echo (set_color red)" ✗ failed: $label"(set_color normal) - set -a failed_transfers "$org/$repo" - end - end -end - -if test (count $failed_transfers) -gt 0 - echo - echo (set_color red)"Failed transfers (orgs containing these will NOT be deleted):"(set_color normal) - printf ' %s\n' $failed_transfers -end - -# ── Wait for transfers to settle ───────────────────────────────────────────── -# GitHub repo transfers are asynchronous; give them time to drain. -echo -gum spin --title "Waiting 30s for transfers to settle..." -- sleep 30 - -# ── Delete emptied orgs ────────────────────────────────────────────────────── -echo -for org in $selected_orgs - # Skip orgs with failed transfers - if string match -q "$org/*" -- $failed_transfers - echo (set_color yellow)"skipping delete: $org (had failures)"(set_color normal) - continue - end - - set -l remaining (gh api "orgs/$org/repos" --paginate --jq '. | length' | jq -s 'add // 0') - - if test "$remaining" -gt 0 - echo (set_color yellow)"skipping delete: $org still has $remaining repo(s) (transfer pending?)"(set_color normal) - continue - end - - if gum confirm "Delete empty org $org?" - if gh api -X DELETE "orgs/$org" --silent - echo (set_color green)"✓ deleted $org"(set_color normal) - else - echo (set_color red)"✗ could not delete $org (API delete requires org owner; may need manual deletion in Settings)"(set_color normal) - end - else - echo "kept $org" - end -end - -echo -echo (set_color --bold green)"Done."(set_color normal) diff --git a/dot_config/fish/functions/gh-wiki.fish b/dot_config/fish/functions/gh-wiki.fish deleted file mode 100644 index d989567..0000000 --- a/dot_config/fish/functions/gh-wiki.fish +++ /dev/null @@ -1,150 +0,0 @@ -function gh-wiki --description "Clone a GitHub wiki and build one PDF from its Markdown pages" - # Usage: gh-wiki [-o OUTPUT.pdf] [-t TEMPLATE] [-d] [-k] - argparse 'h/help' 'o/output=' 't/template=' 'd/docker' 'k/keep' -- $argv - or return 1 - - if set -q _flag_help; or test (count $argv) -eq 0 - echo "Usage: gh-wiki [-o OUTPUT.pdf] [-t TEMPLATE] [-d] [-k]" - echo " -o Output PDF path (default: -wiki.pdf in the current directory)" - echo " -t Pandoc template (default: eisvogel, from ~/.local/share/pandoc/templates)" - echo " -d Use the pandoc/extra Docker image instead of the local pandoc" - echo " -k Keep the clone in /tmp" - return 0 - end - - # --- Check dependencies --------------------------------------------- - set -l deps git gum - set -l engine - if set -q _flag_docker - set -a deps docker - else - set -a deps pandoc - # Eisvogel needs a XeTeX engine; tectonic is a self-contained one. - for e in xelatex tectonic - command -q $e; and set engine $e; and break - end - if test -z "$engine" - echo "gh-wiki: install xelatex or tectonic, or pass -d to use Docker" >&2 - return 1 - end - end - for bin in $deps - if not command -q $bin - echo "gh-wiki: '$bin' is not installed" >&2 - return 1 - end - end - - set -l url $argv[1] - - # Accept a plain repo URL and turn it into the wiki URL. - if not string match -q '*.wiki.git' $url - set url (string replace -r '(\.git)?/?$' '.wiki.git' $url) - end - - # Repo name: https://github.com/user/repo.wiki.git -> repo - set -l repo (string replace -r '\.wiki\.git$' '' (basename $url)) - set -l clone_dir (mktemp -d /tmp/gh-wiki-$repo-XXXXXX) - set -l out "$repo-wiki.pdf" - set -q _flag_output; and set out $_flag_output - - # --- Clone ---------------------------------------------------------- - gum spin --show-error --spinner dot --title "Cloning $url" -- \ - git clone --quiet --depth 1 $url $clone_dir - or begin - gum log --level error "Clone failed: $url" - rm -rf $clone_dir - return 1 - end - - # --- Collect pages -------------------------------------------------- - # Home first, then the rest in alphabetical order. Skip wiki chrome. - set -l pages - test -f $clone_dir/Home.md; and set -a pages $clone_dir/Home.md - for f in (find $clone_dir -maxdepth 1 -name '*.md' | sort) - set -l name (basename $f) - string match -q 'Home.md' $name; and continue - string match -q '_*' $name; and continue - set -a pages $f - end - - if test (count $pages) -eq 0 - gum log --level error "No Markdown pages found in $url" - rm -rf $clone_dir - return 1 - end - gum log --level info "Found "(count $pages)" pages" - - # --- Build one Markdown source -------------------------------------- - # Each page becomes a chapter. Its own headings move one level down. - set -l src_name _combined.md - set -l src $clone_dir/$src_name - for f in $pages - set -l title (string replace -a -- '-' ' ' (basename $f .md)) - printf '\n# %s\n\n' "$title" >> $src - cat $f >> $src - printf '\n\n' >> $src - end - - # --- Shared pandoc options ------------------------------------------ - set -l template eisvogel - set -q _flag_template; and set template $_flag_template - set -l common_args \ - --from gfm \ - --shift-heading-level-by=1 \ - --toc --toc-depth=2 \ - --number-sections \ - -M title="$repo Wiki" \ - -M date=(date +%Y-%m-%d) \ - -V titlepage=true \ - -V toc-own-page=true - - # --- Render --------------------------------------------------------- - set -l status_code 0 - if set -q _flag_docker - # pandoc/extra ships pandoc, LaTeX and Eisvogel. Mount the clone as - # /data, write the PDF there, then move it to the requested path. - set -l tmp_pdf _out.pdf - gum spin --show-error --spinner line --title "Rendering $out" -- \ - docker run --rm \ - --volume "$clone_dir:/data" \ - --user (id -u):(id -g) \ - pandoc/extra $src_name -o $tmp_pdf \ - --resource-path /data \ - --template $template --pdf-engine xelatex \ - $common_args - set status_code $status - test $status_code -eq 0; and mv $clone_dir/$tmp_pdf $out - else - set -l pandoc_args --pdf-engine $engine - # Tectonic's bundle lacks Eisvogel's default sourcesans/sourcecodepro - # packages; naming system fonts makes the template skip them. - test $engine = tectonic; and set -a pandoc_args \ - -V mainfont="Noto Sans" -V monofont="JetBrains Mono" - set -l data_dir (pandoc --version | string match -r 'User data directory: (.*)' | tail -n1) - if test -f "$data_dir/templates/$template.latex"; or test -f "$template" - set -a pandoc_args --template $template - else - gum log --level warn "Template '$template' not found; using the pandoc default" - end - gum spin --show-error --spinner line --title "Rendering $out" -- \ - pandoc $src -o $out \ - --resource-path $clone_dir \ - $pandoc_args \ - $common_args - set status_code $status - end - - # --- Clean up ------------------------------------------------------- - if set -q _flag_keep - gum log --level info "Clone kept at $clone_dir" - else - rm -rf $clone_dir - end - - if test $status_code -ne 0 - gum log --level error "pandoc failed" - return $status_code - end - gum log --level info "Wrote $out" -end diff --git a/dot_config/fish/functions/ghg.fish b/dot_config/fish/functions/ghg.fish deleted file mode 100644 index c77b559..0000000 --- a/dot_config/fish/functions/ghg.fish +++ /dev/null @@ -1,5 +0,0 @@ -function ghg -a repo --description 'ghq get + cd (clone/path logic in ~/.local/bin/ghg-clone)' - set -l dir (ghg-clone $repo); or return - cd $dir; or return - clear; and onefetch -end diff --git a/dot_config/fish/functions/ghn.fish b/dot_config/fish/functions/ghn.fish deleted file mode 100644 index 79688dd..0000000 --- a/dot_config/fish/functions/ghn.fish +++ /dev/null @@ -1,4 +0,0 @@ -function ghn -a repo --description 'create repo + cd (logic in ~/.local/bin/ghn)' - set -l dir (command ghn $repo); or return - cd $dir -end diff --git a/dot_config/fish/functions/gho.fish b/dot_config/fish/functions/gho.fish deleted file mode 100644 index 67e7fd3..0000000 --- a/dot_config/fish/functions/gho.fish +++ /dev/null @@ -1,9 +0,0 @@ -function gho --description 'pick a ghq repo / Obsidian vault (tv ghq-repos cable) + cd' - set -l dir (tv ghq-repos --inline); or return - test -n "$dir"; or return 1 - cd $dir; or return - clear - if test -d .git - onefetch - end -end diff --git a/dot_config/fish/functions/git-summary.fish b/dot_config/fish/functions/git-summary.fish deleted file mode 100644 index 349cabf..0000000 --- a/dot_config/fish/functions/git-summary.fish +++ /dev/null @@ -1,22 +0,0 @@ -function git-summary --description "Aggregate all AGENTS.md files in the current git repo via code2prompt" - # Resolve the repo root so it works from any subdirectory - set -l repo_root (git rev-parse --show-toplevel 2>/dev/null) - if test -z "$repo_root" - echo "git-summary: not inside a git repository" >&2 - return 1 - end - - set -l template ~/.config/code2prompt/agents-md.hbs - if not test -f $template - echo "git-summary: template not found at $template" >&2 - return 1 - end - - # Pass through any extra flags (e.g. --output-file, --tokens) - code2prompt $repo_root \ - --include "AGENTS.md" \ - --include "**/AGENTS.md" \ - --template $template \ - $argv -end - diff --git a/dot_config/fish/functions/gtm.fish b/dot_config/fish/functions/gtm.fish deleted file mode 100644 index 4002f12..0000000 --- a/dot_config/fish/functions/gtm.fish +++ /dev/null @@ -1,160 +0,0 @@ -# ~/.config/fish/functions/gtm.fish -# Migrate GitHub repos → prad.codes (Gitea) via tea. -# Usage: gtm [/ | ] — no arg: multi-select via fzf - -function gtm --description "Migrate GitHub repo(s) to a prad.codes org via tea" - # -- Preflight ------------------------------------------------------------ - for bin in gh tea gum jq - if not command -q $bin - echo "gtm: missing dependency: $bin" >&2 - return 1 - end - end - - set -l gh_token (gh auth token 2>/dev/null) - if test -z "$gh_token" - echo "gtm: gh not authenticated (run: gh auth login)" >&2 - return 1 - end - - # -- Resolve source repos ------------------------------------------------- - # Each entry: nameWithOwner \t isPrivate - set -l repos - - if test (count $argv) -ge 1 - # Direct mode: accepts owner/repo, https://…, ssh://…, git@host:… - # Same normalization as ghg-clone: strip scheme, user@, scp colon, .git - set -l rel ( - printf '%s\n' $argv[1] \ - | sed -E 's#^[[:alnum:]]+://##; s#^[^@/]+@##; s#:#/#; s#\.git$##; s#/+$##' - ) - # Reduce to owner/repo: take the last two path segments - set -l parts (string split / -- $rel | string match -rv '^$') - if test (count $parts) -lt 2 - echo "usage: gtm [/ | ]" >&2 - return 1 - end - # If a host segment is present, it must be github.com — that's the - # only source this migrator pulls from (clone-url is hardcoded to it) - if test (count $parts) -gt 2; and test "$parts[-3]" != github.com - echo "gtm: source must be a github.com repo, got host: $parts[-3]" >&2 - return 1 - end - set -l nwo "$parts[-2]/$parts[-1]" - if not string match -qr '^[\w.-]+/[\w.-]+$' -- $nwo - echo "gtm: could not parse owner/repo from: $argv[1]" >&2 - return 1 - end - set -l meta ( - gh repo view $nwo \ - --json nameWithOwner,isPrivate \ - --jq '[.nameWithOwner, (.isPrivate|tostring)] | @tsv' 2>/dev/null - ) - if test -z "$meta" - echo "gtm: repo not found or inaccessible: $nwo" >&2 - return 1 - end - set repos $meta - else - # Interactive mode: fzf multi-select - if not command -q fzf - echo "gtm: missing dependency: fzf" >&2 - return 1 - end - set repos ( - gh repo list --limit 200 \ - --json nameWithOwner,isPrivate,description \ - --jq '.[] | [.nameWithOwner, (.isPrivate|tostring), .description // ""] | @tsv' \ - | fzf --multi \ - --delimiter '\t' \ - --with-nth 1,3 \ - --prompt 'migrate> ' \ - --header 'TAB: multi-select · ENTER: confirm' \ - --preview 'gh repo view {1}' \ - --preview-window 'right:50%:wrap' - ) - if test (count $repos) -eq 0 - echo "gtm: nothing selected" >&2 - return 1 - end - end - - # -- Select target org on prad.codes -------------------------------------- - set -l owner ( - tea organizations list -o simple \ - | string trim \ - | string match -rv '^$' \ - | gum choose --header "Target org on prad.codes" - ) - if test -z "$owner" - echo "gtm: no target org selected" >&2 - return 1 - end - - # -- Options -------------------------------------------------------------- - set -l extras ( - gum choose --no-limit \ - --header "Migration options (space to toggle)" \ - "wiki" "issues" "labels" "pull-requests" "releases" "milestones" "lfs" "mirror" - ) - set -l extra_flags - for opt in $extras - set -a extra_flags "--$opt" - end - - # -- Migrate -------------------------------------------------------------- - set -l failed - set -l migrated # repo names successfully landed on prad.codes/$owner - for line in $repos - set -l fields (string split \t -- $line) - set -l nwo $fields[1] - set -l is_private $fields[2] - set -l name (string split -m1 / -- $nwo)[2] - - set -l flags --name $name --owner $owner \ - --clone-url "https://github.com/$nwo.git" \ - --service git \ - --auth-token $gh_token \ - $extra_flags - - if test "$is_private" = true - set -a flags --private - end - - echo "→ migrating $nwo → prad.codes/$owner/$name" - if tea repos migrate $flags - set -a migrated $name - else - set -a failed $nwo - echo "✗ failed: $nwo" >&2 - end - end - - # -- Optional local clone ------------------------------------------------- - if test (count $migrated) -gt 0 - and gum confirm "Clone "(count $migrated)" migrated repo(s) locally via ghg-clone?" - set -l last_dir - for name in $migrated - set -l dir (ghg-clone "https://prad.codes/$owner/$name") - if test -n "$dir" - set last_dir $dir - else - echo "✗ clone failed: $owner/$name" >&2 - end - end - # Single repo → drop into it (function runs in-shell, so cd sticks) - if test (count $migrated) -eq 1 -a -n "$last_dir" - cd $last_dir - end - end - - # -- Summary -------------------------------------------------------------- - if test (count $failed) -gt 0 - echo - echo "gtm: "(count $failed)" migration(s) failed:" >&2 - printf ' %s\n' $failed >&2 - return 1 - end - echo - echo "✓ done — "(count $repos)" repo(s) migrated to $owner" -end diff --git a/dot_config/fish/functions/launch_omp_livediff_overlay.fish b/dot_config/fish/functions/launch_omp_livediff_overlay.fish deleted file mode 100644 index 484f65d..0000000 --- a/dot_config/fish/functions/launch_omp_livediff_overlay.fish +++ /dev/null @@ -1,16 +0,0 @@ -function launch_omp_livediff_overlay --description "Overlay omp on the current kitty window with a livediff split beside it" - # kitty appends -PID to config-file listen_on sockets, so a hardcoded - # --to unix:@kitty-local never matches. kitty @ resolves the real - # address from $KITTY_LISTEN_ON on its own. - if not set -q KITTY_LISTEN_ON - echo "launch_omp_livediff_overlay: no kitty remote-control socket (KITTY_LISTEN_ON unset)" >&2 - return 1 - end - - # omp overlays the current window; capture its window id - set -l wid (kitty @ launch --type=overlay-main --cwd=current omp) - or return - - # livediff side by side in the same tab; keep focus on omp - kitty @ launch --match id:$wid --location=vsplit --keep-focus --cwd=current livediff -end diff --git a/dot_config/fish/functions/lc-elir.fish b/dot_config/fish/functions/lc-elir.fish deleted file mode 100644 index a085a31..0000000 --- a/dot_config/fish/functions/lc-elir.fish +++ /dev/null @@ -1,16 +0,0 @@ -function lc-elir -d "fzf-pick LeetCode solution files and run /leetcode-eli5 on each via omp" - set -l root (count $argv > /dev/null; and echo $argv[1]; or echo .) - # Match only numbered problem files: 1365.some-slug.js anywhere in the tree - set -l files (fd --type f '^\d+\..+\.(js|ts)$' $root \ - | fzf --multi \ - --prompt='eli5> ' \ - --delimiter=/ \ - --with-nth=-3.. \ - --preview 'bat --color=always --line-range=:40 {}' \ - --preview-window=right:60%) - test -z "$files"; and return 1 - for f in $files - echo "── /leetcode-eli5 $f" - omp -p "/leetcode-eli5 $f" - end -end diff --git a/dot_config/fish/functions/mdcp.fish b/dot_config/fish/functions/mdcp.fish deleted file mode 100644 index 908da8a..0000000 --- a/dot_config/fish/functions/mdcp.fish +++ /dev/null @@ -1,8 +0,0 @@ -function mdcp -a url - if test -z "$url" - echo "usage: mdcp " >&2 - return 1 - end - curl.md $url | cpy - pst | mdfried -end diff --git a/dot_config/fish/functions/mdp.fish b/dot_config/fish/functions/mdp.fish deleted file mode 100644 index 556ba1c..0000000 --- a/dot_config/fish/functions/mdp.fish +++ /dev/null @@ -1,10 +0,0 @@ -# ~/.config/fish/functions/mdv.fish -function mdp -d "Interactive Markdown selector and previewer" - # Find markdown files up to 3 directories deep - set -l file (fd --type f --extension md --max-depth 3 | fzf --preview 'mdfried {}' --preview-window=right:60%:wrap) - - # Execute mdfried on the selected file if one was chosen - if test -n "$file" - mdfried "$file" - end -end diff --git a/dot_config/fish/functions/nvm.fish b/dot_config/fish/functions/nvm.fish deleted file mode 100644 index 64d94c5..0000000 --- a/dot_config/fish/functions/nvm.fish +++ /dev/null @@ -1,237 +0,0 @@ -function nvm --description "Node version manager" - for silent in --silent -s - if set --local index (contains --index -- $silent $argv) - set --erase argv[$index] && break - end - set --erase silent - end - - set --local cmd $argv[1] - set --local ver $argv[2] - - if set --query silent && ! set --query cmd[1] - echo "nvm: Version number not specified (see nvm -h for usage)" >&2 - return 1 - end - - if ! set --query ver[1] && contains -- "$cmd" install use - for file in .nvmrc .node-version - set file (_nvm_find_up $PWD $file) && read ver <$file && break - end - - if ! set --query ver[1] - echo "nvm: Invalid version or missing \".nvmrc\" file" >&2 - return 1 - end - end - - set --local their_version $ver - - switch "$cmd" - case -v --version - echo "nvm, version 2.2.18" - case "" -h --help - echo "Usage: nvm install Download and activate the specified Node version" - echo " nvm install Install the version specified in the nearest .nvmrc file" - echo " nvm use Activate the specified Node version in the current shell" - echo " nvm use Activate the version specified in the nearest .nvmrc file" - echo " nvm list List installed Node versions" - echo " nvm list-remote List available Node versions to install" - echo " nvm list-remote List Node versions matching a given regex pattern" - echo " nvm current Print the currently-active Node version" - echo " nvm uninstall Uninstall the specified Node version" - echo "Options:" - echo " -s, --silent Suppress standard output" - echo " -v, --version Print the version of nvm" - echo " -h, --help Print this help message" - echo "Variables:" - echo " nvm_arch Override architecture, e.g. x64-musl" - echo " nvm_mirror Use a mirror for downloading Node binaries" - echo " nvm_default_version Set the default version for new shells" - echo " nvm_default_packages Install a list of packages every time a Node version is installed" - echo " nvm_data Set a custom directory for storing nvm data" - echo "Examples:" - echo " nvm install latest Install the latest version of Node" - echo " nvm use 14.15.1 Use Node version 14.15.1" - echo " nvm use system Activate the system's Node version" - - case install - _nvm_index_update - - string match --entire --regex -- (_nvm_version_match $ver) <$nvm_data/.index | read ver alias - - if ! set --query ver[1] - echo "nvm: Invalid version number or alias: \"$their_version\"" >&2 - return 1 - end - - if test ! -e $nvm_data/$ver - set --local os (command uname -s | string lower) - set --local ext tar.gz - set --local arch (command uname -m) - set --local tarcmd tar - - switch $os - case aix - set arch ppc64 - case sunos - case linux - case darwin - case {msys_nt,mingw\*_nt}\* - set os win - set ext zip - set tarcmd bsdtar - case \* - echo "nvm: Unsupported operating system: \"$os\"" >&2 - return 1 - end - - switch $arch - case i\*86 - set arch x86 - case x86_64 - set arch x64 - case arm64 - string match --regex --quiet "v(?\d+)" $ver - if test "$os" = darwin -a $major -lt 16 - set arch x64 - end - case armv6 armv6l - set arch armv6l - case armv7 armv7l - set arch armv7l - case armv8 armv8l aarch64 - set arch arm64 - end - - set --query nvm_arch && set arch $nvm_arch - - set --local dir "node-$ver-$os-$arch" - set --local url $nvm_mirror/$ver/$dir.$ext - - command mkdir -p $nvm_data/$ver - - if ! set --query silent - echo -e "Installing Node \x1b[1m$ver\x1b[22m $alias" - echo -e "Fetching \x1b[4m$url\x1b[24m\x1b[7m" - end - - if ! command curl -q $silent --progress-bar --location $url | - command $tarcmd --extract --gzip --directory $nvm_data/$ver 2>/dev/null - command rm -rf $nvm_data/$ver - echo -e "\033[F\33[2K\x1b[0mnvm: Invalid mirror or host unavailable: \"$url\"" >&2 - return 1 - end - - set --query silent || echo -en "\033[F\33[2K\x1b[0m" - - if test "$os" = win - command mv $nvm_data/$ver/$dir $nvm_data/$ver/bin - else - command mv $nvm_data/$ver/$dir/* $nvm_data/$ver - command rm -rf $nvm_data/$ver/$dir - end - end - - if test $ver != "$nvm_current_version" - set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version - _nvm_version_activate $ver - - set --query nvm_default_packages[1] && npm install --global $silent $nvm_default_packages - end - - set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info) - case use - test $ver = default && set ver $nvm_default_version - _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __ - - if ! set --query ver[1] - echo "nvm: Can't use Node \"$their_version\", version must be installed first" >&2 - return 1 - end - - if test $ver != "$nvm_current_version" - set --query nvm_current_version && _nvm_version_deactivate $nvm_current_version - test $ver != system && _nvm_version_activate $ver - end - - set --query silent || printf "Now using Node %s (npm %s) %s\n" (_nvm_node_info) - case uninstall - if test -z "$ver" - echo "nvm: Not enough arguments for command: \"$cmd\"" >&2 - return 1 - end - - test $ver = default && test ! -z "$nvm_default_version" && set ver $nvm_default_version - - _nvm_list | string match --entire --regex -- (_nvm_version_match $ver) | read ver __ - - if ! set -q ver[1] - echo "nvm: Node version not installed or invalid: \"$their_version\"" >&2 - return 1 - end - - set --query silent || printf "Uninstalling Node %s %s\n" $ver (string replace ~ \~ "$nvm_data/$ver/bin/node") - - _nvm_version_deactivate $ver - - command rm -rf $nvm_data/$ver - case current - _nvm_current - case ls list - _nvm_list | _nvm_list_format (_nvm_current) $argv[2] - case lsr {ls,list}-remote - _nvm_index_update || return - _nvm_list | command awk ' - FILENAME == "-" && (is_local[$1] = FNR == NR) { next } { - print $0 (is_local[$1] ? " ✓" : "") - } - ' - $nvm_data/.index | _nvm_list_format (_nvm_current) $argv[2] - case \* - echo "nvm: Unknown command or option: \"$cmd\" (see nvm -h for usage)" >&2 - return 1 - end -end - -function _nvm_find_up --argument-names path file - test -e "$path/$file" && echo $path/$file || begin - test ! -z "$path" || return - _nvm_find_up (string replace --regex -- '/[^/]*$' "" $path) $file - end -end - -function _nvm_version_match --argument-names ver - string replace --regex -- '^v?(\d+|\d+\.\d+)$' 'v$1.' $ver | - string replace --filter --regex -- '^v?(\d+)' 'v$1' | - string escape --style=regex || string lower '\b'$ver'(?:/\w+)?$' -end - -function _nvm_list_format --argument-names current regex - command awk -v current="$current" -v regex="$regex" ' - $0 ~ regex { - aliases[versions[i++] = $1] = $2 " " $3 - pad = (n = length($1)) > pad ? n : pad - } - END { - if (!i) exit 1 - while (i--) - printf((current == versions[i] ? " ▶ " : " ") "%"pad"s %s\n", - versions[i], aliases[versions[i]]) - } - ' -end - -function _nvm_current - command --search --quiet node || return - set --query nvm_current_version && echo $nvm_current_version || echo system -end - -function _nvm_node_info - set --local npm_path (string replace bin/npm-cli.js "" (realpath (command --search npm))) - test -f $npm_path/package.json || set --local npm_version_default (command npm --version) - command node --eval " - console.log(process.version) - console.log('$npm_version_default' ? '$npm_version_default': require('$npm_path/package.json').version) - console.log(process.execPath) - " | string replace -- ~ \~ -end diff --git a/dot_config/fish/functions/y.fish b/dot_config/fish/functions/y.fish deleted file mode 100644 index 80ef371..0000000 --- a/dot_config/fish/functions/y.fish +++ /dev/null @@ -1,8 +0,0 @@ -function y - set tmp (mktemp -t "yazi-cwd.XXXXXX") - command yazi $argv --cwd-file="$tmp" - if read -z cwd < "$tmp"; and [ "$cwd" != "$PWD" ]; and test -d "$cwd" - builtin cd -- "$cwd" - end - command rm -f -- "$tmp" -end diff --git a/dot_config/fish/functions/yy.fish b/dot_config/fish/functions/yy.fish deleted file mode 100644 index 799c0e9..0000000 --- a/dot_config/fish/functions/yy.fish +++ /dev/null @@ -1,8 +0,0 @@ -function yy - set tmp (mktemp -t "yazi-cwd.XXXXXX") - command yazi $argv --cwd-file="$tmp" - if read -z cwd < "$tmp"; and [ "$cwd" != "$PWD" ]; and test -d "$cwd" - builtin cd -- "$cwd" - end - rm -f -- "$tmp" -end diff --git a/dot_config/fish/themes/cyberdream.theme b/dot_config/fish/themes/cyberdream.theme deleted file mode 100644 index a76d50d..0000000 --- a/dot_config/fish/themes/cyberdream.theme +++ /dev/null @@ -1,30 +0,0 @@ -# name: 'cyberdream' -# url: 'https://github.com/scottmckendry/cyberdream.nvim' -# preferred_background: 16181a - -fish_color_normal ffffff -fish_color_command 5ef1ff -fish_color_param ffaecf -fish_color_keyword 5eff6c -fish_color_quote f1ff5e -fish_color_redirection 5ea1ff -fish_color_end bd5eff -fish_color_comment 7b8496 -fish_color_error ff6e5e -fish_color_gray 7b8496 -fish_color_selection --background=3c4048 -fish_color_search_match --background=3c4048 -fish_color_option f1ff5e -fish_color_operator 5ea1ff -fish_color_escape ffaecf -fish_color_autosuggestion 7b8496 -fish_color_cancel ff6e5e -fish_color_cwd ffbd5e -fish_color_user 5ef5d2 -fish_color_host 5eff6c -fish_color_host_remote f1ff5e -fish_color_status ff6e5e -fish_pager_color_progress 7b8496 -fish_pager_color_prefix 5ea1ff -fish_pager_color_completion ffffff -fish_pager_color_description 7b8496 diff --git a/dot_config/hypr b/dot_config/hypr new file mode 160000 index 0000000..f4b5663 --- /dev/null +++ b/dot_config/hypr @@ -0,0 +1 @@ +Subproject commit f4b5663ddfe7ee0f80d41dd1b21e06bcfa5d61ae diff --git a/dot_config/hypr/autostart.lua b/dot_config/hypr/autostart.lua deleted file mode 100644 index de1a69a..0000000 --- a/dot_config/hypr/autostart.lua +++ /dev/null @@ -1,2 +0,0 @@ --- Extra autostart processes. --- o.launch_on_start("my-service") diff --git a/dot_config/hypr/bindings.lua b/dot_config/hypr/bindings.lua deleted file mode 100644 index 0228cc3..0000000 --- a/dot_config/hypr/bindings.lua +++ /dev/null @@ -1,331 +0,0 @@ --- ============================================================================ --- Personal overrides, ported from the niri config. --- Append to ~/.config/hypr/hyprland.lua, after require("default.hypr.omarchy"). --- Every rebind of an Omarchy default is unbound first. The comment after each --- unbind says what the key did before. --- ============================================================================ - --- ─── Window management ────────────────────────────────────────────────────── - --- Spawn Terminal --- hl.unbind("SUPER + RETURN") -- was: toggle window transparency - --- Mod+Q -> close. Omarchy already binds this, so it is only made explicit. -hl.unbind("SUPER + Q") -o.bind("SUPER + Q", "Close window", hl.dsp.window.close()) - --- Mod+W was tabbed display. Here it flips the workspace layout, and sets every --- column to 50% of the screen (niri's default-column-width) when the --- workspace turns to scrolling. Dwindle needs no widths, because it re-tiles --- on its own. Needs ~/.local/bin/omarchy-toggle-layout. -hl.unbind("SUPER + W") -- was: close window -o.bind("SUPER + W", "Toggle workspace layout", "omarchy-toggle-layout 0.5") - --- Mod+BackSpace -> last window. -hl.unbind("SUPER + BACKSPACE") -- was: toggle window transparency -o.bind("SUPER + BACKSPACE", "Focus last window", hl.dsp.focus({ last = true })) - --- Mod+Tab -> switch windows inside the focused workspace. Omarchy parks the --- workspace hop here, but SUPER + CTRL + J/K already does that, so the key is --- free. SUPER + CTRL + TAB (former workspace) keeps its default job. --- --- cyclenext is deliberately not used: it walks into a hidden special --- workspace and drags the scratchpad into view. This ring is built from the --- windows of the active workspace alone, and a workspace lives on exactly one --- monitor, so focus never leaves the display. Grouped windows stay in the --- ring (focusing a hidden member just flips the group to that tab); anything --- else hidden is skipped. stable_id fixes the order, so repeated presses walk --- the same ring instead of following focus history. -local function cycle_in_workspace(step) - return function() - local active = hl.get_active_window() - local workspace = active and active.workspace or hl.get_active_workspace() - if not workspace then - return - end - - local ring = {} - for _, window in ipairs(hl.get_workspace_windows(workspace.id)) do - if window.mapped and (window.group or not window.hidden) then - ring[#ring + 1] = window - end - end - if #ring < 2 then - return - end - table.sort(ring, function(a, b) - return a.stable_id < b.stable_id - end) - - local current = 1 - for index, window in ipairs(ring) do - if active and window.address == active.address then - current = index - break - end - end - - -- Raise after the focus, so a floating window comes up on top instead of - -- staying buried, the way Omarchy's ALT + TAB does. - hl.dispatch(hl.dsp.focus({ window = ring[(current - 1 + step) % #ring + 1] })) - hl.dispatch(hl.dsp.window.bring_to_top()) - end -end - -hl.unbind("SUPER + TAB") -- was: next workspace -hl.unbind("SUPER + SHIFT + TAB") -- was: previous workspace -o.bind("SUPER + TAB", "Focus on next window in workspace", cycle_in_workspace(1)) -o.bind("SUPER + SHIFT + TAB", "Focus on previous window in workspace", cycle_in_workspace(-1)) - --- Tabs. Hyprland groups are the nearest thing to a niri tabbed column. --- SUPER + G (group) and SUPER + ALT + TAB (next in group) are Omarchy defaults. - --- ─── Focus and swap: hjkl ─────────────────────────────────────────────────── - --- Focus steps through the windows of a group first, and leaves the group only --- at the ends. This is the focus half of the smart-move behavior below, and --- Hyprland does it on its own, so no script is needed. -hl.config({ binds = { movefocus_cycles_groupfirst = true } }) - -hl.unbind("SUPER + J") -- was: toggle window split -hl.unbind("SUPER + K") -- was: keybindings menu -hl.unbind("SUPER + L") -- was: toggle workspace layout - -o.bind("SUPER + H", "Focus on left window", hl.dsp.focus({ direction = "l" })) -o.bind("SUPER + J", "Focus on below window", hl.dsp.focus({ direction = "d" })) -o.bind("SUPER + K", "Focus on above window", hl.dsp.focus({ direction = "u" })) -o.bind("SUPER + L", "Focus on right window", hl.dsp.focus({ direction = "r" })) - --- The old SUPER + J job, moved to a free key. Dwindle only; toggling needs --- dwindle.preserve_split, which Omarchy already sets. -o.bind("SUPER + D", "Toggle window split", hl.dsp.layout("togglesplit")) - --- Smart move: merge into the neighboring group if there is one, else swap. --- A floating window is parked in a monitor corner instead, clockwise from --- the bottom left: H bottom-left, J top-left, K top-right, L bottom-right. --- Needs ~/.local/bin/omarchy-smart-move. -o.bind("SUPER + SHIFT + H", "Move or merge left / float to bottom-left", "omarchy-smart-move l") -o.bind("SUPER + SHIFT + J", "Move or merge down / float to top-left", "omarchy-smart-move d") -o.bind("SUPER + SHIFT + K", "Move or merge up / float to top-right", "omarchy-smart-move u") -o.bind("SUPER + SHIFT + L", "Move or merge right / float to bottom-right", "omarchy-smart-move r") - --- Picture-in-picture for any window: float + pin, 30% of the focused --- monitor on both axes, bottom-left corner; press again to tile it back. --- Needs ~/.local/bin/omarchy-pip (omarchy-summon shares it). SUPER + SHIFT --- + T is free in Omarchy; SUPER + T (toggle floating) stays as is. -o.bind("SUPER + SHIFT + T", "Toggle picture-in-picture", "omarchy-pip") - --- ─── Workspaces and monitors ──────────────────────────────────────────────── - -hl.unbind("SUPER + CTRL + K") -- was: Herdr keybindings -o.bind("SUPER + CTRL + J", "Next workspace", hl.dsp.focus({ workspace = "e+1" })) -o.bind("SUPER + CTRL + K", "Previous workspace", hl.dsp.focus({ workspace = "e-1" })) - --- Scratch workspaces. Omarchy's SUPER + S is taken by the region screenshot --- below, so the main toggle (Tern) lands on SUPER + CTRL + S, with --- SUPER + A (free in Omarchy) as the home-row alias. Claude Desktop has its --- own scratch workspace on SUPER + CTRL + ALT + L. SUPER + ALT + S (send --- window to the scratchpad) is still the Omarchy default and needs no line. --- --- All of them go through ~/.local/bin/omarchy-toggle-scratch rather than the --- raw special-workspace toggle: it opens each workspace on its home monitor --- (the raw toggle uses the focused one), and on reveal it starts whichever --- resident is missing instead of sliding an empty workspace into view. The --- residents are pinned to their workspaces by window rules in --- hypr/hyprland.lua. Fastmail and Beeper have their own scratch workspaces --- under SUPER + CTRL + ALT + E / M in the Applications block below. -hl.unbind("SUPER + CTRL + S") -- was: share menu -hl.unbind("SUPER + SHIFT + A") -- was: ChatGPT web app - -o.bind("SUPER + A", "Toggle scratch workspace", "omarchy-toggle-scratch scratchpad") -o.bind("SUPER + CTRL + ALT + H", "Toggle Tern scratch workspace", "omarchy-toggle-scratch scratchpad") -o.bind("SUPER + CTRL + ALT + L", "Toggle Claude scratch workspace", "omarchy-toggle-scratch claude") - --- Workspaces 1 to 4 (Studio Display) on Q W E R and 5 to 8 (laptop panel) on --- Y U I O: ALT to focus, ALT + SHIFT to send the window there. The pinning --- lives in hypr/hyprland.lua, so focusing a workspace also moves to its --- monitor. No Omarchy default uses ALT with a letter, so nothing is unbound. -for index, key in ipairs({ "Q", "W", "E", "R", "Y", "U", "I", "O" }) do - local workspace = tostring(index) - - o.bind("ALT + " .. key, "Switch to workspace " .. workspace, hl.dsp.focus({ workspace = workspace })) - o.bind("ALT + SHIFT + " .. key, "Move window to workspace " .. workspace, hl.dsp.window.move({ workspace = workspace })) -end - -hl.unbind("SUPER + O") -- was: pop window out -hl.unbind("SUPER + SHIFT + O") -- was: Obsidian (moved to SUPER + CTRL + ALT + O) -o.bind("SUPER + O", "Focus next monitor", hl.dsp.focus({ monitor = "+1" })) -o.bind("SUPER + SHIFT + O", "Move window to next monitor", hl.dsp.window.move({ monitor = "+1" })) - -o.bind("ALT + SHIFT + J", "Move window to next monitor", hl.dsp.window.move({ monitor = "+1" })) -o.bind("ALT + SHIFT + K", "Move window to previous monitor", hl.dsp.window.move({ monitor = "-1" })) - --- Named workspaces, in place of niri-dynamic-workspaces. -o.bind("SUPER + SHIFT + CTRL + ALT + W", "Workspace w", hl.dsp.focus({ workspace = "name:w" })) -o.bind("SUPER + SHIFT + CTRL + ALT + H", "Workspace h", hl.dsp.focus({ workspace = "name:h" })) -o.bind("SUPER + CTRL + ALT + X", "Workspace x", hl.dsp.focus({ workspace = "name:x" })) - --- ─── Sizing ───────────────────────────────────────────────────────────────── - --- Mod+R / Mod+Shift+R. Needs ~/.local/bin/omarchy-cycle-window-size. -o.bind("SUPER + R", "Cycle window size", "omarchy-cycle-window-size") -o.bind("SUPER + SHIFT + R", "Cycle window size back", "omarchy-cycle-window-size prev") - --- Hyprland resizes by pixels, not by percent, so 100 px replaces the niri --- 10%. ALT + SHIFT + H / L step the width (ALT + SHIFT + J / K move the --- window between monitors, above). -o.bind("ALT + SHIFT + H", "Shrink window width", hl.dsp.window.resize({ x = -100, y = 0, relative = true })) -o.bind("ALT + SHIFT + L", "Grow window width", hl.dsp.window.resize({ x = 100, y = 0, relative = true })) - -hl.unbind("SUPER + CTRL + H") -- was: toggle window gaps (now Google Home; SUPER + comma shrinks width) -hl.unbind("SUPER + CTRL + L") -- was: toggle window gaps (now LM Studio; SUPER + period grows width) -hl.unbind("SUPER + CTRL + K") -- was: toggle window gaps -hl.unbind("SUPER + CTRL + J") -- was: toggle window gaps - -o.bind("SUPER + CTRL + K", "Shrink window height", hl.dsp.window.resize({ x = 0, y = -100, relative = true })) -o.bind("SUPER + CTRL + J", "Grow window height", hl.dsp.window.resize({ x = 0, y = 100, relative = true })) - --- Same width steps on SUPER + , / SUPER + . (the < and > keys). Key names are --- the lower-case xkb keysyms; "COMMA"/"PERIOD" would not match. -hl.unbind("SUPER + comma") -- was: dismiss last notification (now SUPER + SHIFT + BACKSPACE) -o.bind("SUPER + comma", "Shrink window width", hl.dsp.window.resize({ x = -100, y = 0, relative = true })) -o.bind("SUPER + period", "Grow window width", hl.dsp.window.resize({ x = 100, y = 0, relative = true })) - --- The notification dismiss SUPER + comma gave up. SUPER + SHIFT + comma still --- dismisses all. -hl.unbind("SUPER + SHIFT + BACKSPACE") -- was: toggle window gaps -o.bind("SUPER + SHIFT + BACKSPACE", "Dismiss last notification", "omarchy-shell notifications dismissOne") - --- Column fitting. These are scrolling layout messages, so they do nothing on --- a dwindle workspace. Mod+F (expand to available width) has no exact match; --- the Omarchy default SUPER + ALT + F (full width) is the closest. -o.bind("SUPER + ALT + C", "Fit active column", hl.dsp.layout("fit active")) -o.bind("SUPER + SHIFT + ALT + C", "Fit visible columns", hl.dsp.layout("fit visible")) - --- Super+C (niri center-column). Floating windows go through centerwindow. --- On a scrolling workspace the column is re-focused with focus_fit_method --- briefly set to 0 (center), then restored, so plain focus moves keep --- niri's center-focused-column "never". A relative "move" can't do this: the --- tape stops at its first column, so the leftmost window never reaches the --- middle. Dwindle and master have nothing to scroll; the key does nothing. -local function center_window() - local window = hl.get_active_window() - if not window then - return - end - if window.floating then - hl.dispatch(hl.dsp.window.center()) - return - end - if not window.workspace or window.workspace.tiled_layout ~= "scrolling" then - return - end - local fit_method = hl.get_config("scrolling.focus_fit_method") - hl.config({ scrolling = { focus_fit_method = 0 } }) - hl.dispatch(hl.dsp.focus({ window = window })) - hl.config({ scrolling = { focus_fit_method = fit_method } }) -end - -hl.unbind("SUPER + C") -- was: universal copy -o.bind("SUPER + C", "Center window / column", center_window) - --- ─── Applications ─────────────────────────────────────────────────────────── --- Same modifier block as the niri config. Each one focuses an open window --- before it launches a new one. The launch command uses the same desktop --- entry the vicinae URLs named, so no binary names are guessed. - -hl.unbind("SUPER + CTRL + A") -- was: audio panel - -o.bind("SUPER + CTRL + ALT + J", "Terminals", "omarchy-cycle-terminal") -o.bind("SUPER + CTRL + ALT + K", "Browsers", "omarchy-cycle-browser") -o.bind("SUPER + CTRL + ALT + G", "Ghostty", "omarchy-cycle ghostty") -o.bind("SUPER + CTRL + ALT + O", "Obsidian", "omarchy-cycle obsidian") -o.bind("SUPER + CTRL + ALT + F", "File manager", "omarchy-launch-or-focus nautilus \"gtk-launch org.gnome.Nautilus\"") --- Fastmail, Beeper, Google Home and LM Studio each live on their own scratch --- workspace (window rules in hypr/hyprland.lua); the toggle reveals it on the --- focused monitor and starts the app only when no window of it exists -- the --- web-app launcher would otherwise open a second window every time. -o.bind("SUPER + CTRL + ALT + E", "Fastmail", "omarchy-toggle-scratch fastmail") -o.bind("SUPER + CTRL + ALT + M", "Beeper", "omarchy-toggle-scratch beeper") -o.bind("SUPER + CTRL + H", "Google Home", "omarchy-toggle-scratch home") -o.bind("SUPER + CTRL + L", "LM Studio", "omarchy-toggle-scratch lmstudio") --- YouTube is a floating pinned window in the bottom-left corner (window rule --- in hypr/hyprland.lua). The summon launches it when no window exists, --- otherwise carries the window to the focused monitor and focuses it. -o.bind("SUPER + CTRL + ALT + Y", "YouTube", "omarchy-summon youtube") -- was: web apps cycle -hl.unbind("SUPER + SHIFT + Y") -- was: YouTube via the desktop entry (new window every press) -o.bind("SUPER + SHIFT + Y", "YouTube", "omarchy-summon youtube") - -hl.unbind("SUPER + CTRL + ALT + T") -- was: show time --- Pattern is the exact class from `hyprctl clients`; the window rule in --- hypr/hyprland.lua sends it to workspace 5 on eDP-1 fullscreen. -o.bind("SUPER + CTRL + ALT + T", "tldraw offline", "omarchy-launch-or-focus tldraw-offline \"gtk-launch tldraw-offline\"") - -hl.unbind("SUPER + CTRL + ALT + W") -- was: toggle weather --- gtk-launch takes the desktop-entry id: TLDraw.desktop, not tldraw_offline, --- which does not exist (the old command could only focus, never launch). - -hl.unbind("SUPER + SHIFT + M") -- was: Spotify -hl.unbind("SUPER + SHIFT + G") -- was: Signal --- The ssh/mosh command and tmux keymaps live in ~/.config/kitty/goliath.conf --- (kitty cannot take --config from a `launch` action, hence a separate kitty --- process, same trick as SUPER + T / SUPER + A). kitty-goliath is the app-id --- looknfeel.lua's terminal blur rule expects. -o.bind("SUPER + SHIFT + G", "Goliath", { launch = "kitty --class=kitty-goliath --title=goliath --config ~/.config/kitty/goliath.conf" }) - --- ─── Screenshots ──────────────────────────────────────────────────────────── - -hl.unbind("SUPER + S") -- was: toggle scratchpad (now SUPER + CTRL + S) -hl.unbind("SUPER + SHIFT + S") -- was: Google Maps -o.bind("SUPER + S", "Screenshot region", "omarchy-capture-screenshot region") -o.bind("SUPER + SHIFT + S", "Screenshot window", "omarchy-capture-screenshot windows") --- Monitor capture moved off SUPER + CTRL + S when the scratchpad took that key. -o.bind("SUPER + SHIFT + ALT + S", "Screenshot monitor", "omarchy-capture-screenshot fullscreen") - --- ─── Session ──────────────────────────────────────────────────────────────── - -hl.unbind("SUPER + SHIFT + E") -- was: Email (Fastmail is on SUPER + CTRL + ALT + E) -o.bind("SUPER + SHIFT + E", "System menu", "omarchy-menu toggle system") -o.bind("SUPER + SHIFT + Q", "System menu", "omarchy-menu toggle system") - --- ─── Dictation ────────────────────────────────────────────────────────────── - -o.bind("SUPER + F24", "Dictate to Hermes", "voxtype record toggle --profile hermes") - --- ─── Menus, in place of vicinae ───────────────────────────────────────────── --- Same keys as the niri config, pointed at the Omarchy menus. - --- Mod+Space (vicinae toggle) needs no line: SUPER + SPACE is already the --- Omarchy menu. SUPER + ALT + SPACE is the apps menu. - -hl.unbind("SUPER + SHIFT + SPACE") -- was: toggle top bar -hl.unbind("SUPER + P") -- was: pseudo window -hl.unbind("SUPER + SPACE") -- was: pseudo window - --- Omarchy's SUPER + SPACE is ALT + SPACE, so the key is free in Omarchy. --- o.bind("ALT + SPACE", "Toggle Launcher", "omarchy-menu toggle launcher") - --- Mod+Shift+Return was the vicinae window switcher. ScrollOverview on --- ALT + TAB below takes that job, so SUPER + SHIFT + RETURN keeps its default --- job of opening the browser. --- --- flea --default: begin. Written by `flea --default`; `flea --default off` removes the block whole. -hl.unbind("SUPER + SHIFT + F") -o.bind("SUPER + SHIFT + F", "File manager", { launch = 'flea --gui' }) -hl.unbind("SUPER + ALT + SHIFT + F") -o.bind("SUPER + ALT + SHIFT + F", "File manager (cwd)", { launch = 'flea --gui "$(omarchy-cmd-terminal-cwd)"' }) --- flea --default: end. - --- flea --picker: begin. Written by `flea --picker`; `flea --picker off` removes the block whole. -o.window("com.thisisgm.flea.picker", { tag = "+floating-window" }) --- flea --picker: end. - --- niri-style: SUPER + F maximizes (Omarchy's SUPER + ALT + F "Full width"), --- SUPER + SHIFT + F goes true fullscreen. Kept below the flea blocks so it --- wins over the file-manager bind `flea --default` writes onto --- SUPER + SHIFT + F; flea stays on SUPER + ALT + SHIFT + F, Nautilus on --- SUPER + CTRL + ALT + F. -hl.unbind("SUPER + F") -- was: full screen -o.bind("SUPER + F", "Maximize", hl.dsp.window.fullscreen({ mode = "maximized" })) -hl.unbind("SUPER + SHIFT + F") -- was: file manager (flea --gui) -o.bind("SUPER + SHIFT + F", "Full screen", hl.dsp.window.fullscreen({ mode = "fullscreen" })) diff --git a/dot_config/hypr/dot_luarc.json b/dot_config/hypr/dot_luarc.json deleted file mode 100644 index afb4466..0000000 --- a/dot_config/hypr/dot_luarc.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "workspace": { - "library": [ - "/usr/share/hypr/stubs" - ], - "checkThirdParty": false - }, - "diagnostics": { - "globals": ["hl", "o"] - } -} diff --git a/dot_config/hypr/hyprland.lua b/dot_config/hypr/hyprland.lua deleted file mode 100644 index 8051648..0000000 --- a/dot_config/hypr/hyprland.lua +++ /dev/null @@ -1,97 +0,0 @@ --- Learn how to configure Hyprland: https://wiki.hypr.land/Configuring/Start/ - --- Omarchy's bootstrap keeps path setup out of this user config. -dofile((os.getenv("OMARCHY_PATH") or "/usr/share/omarchy") .. "/default/hypr/bootstrap.lua") - --- Disable all Omarchy default bindings. Add your own in hypr/bindings.lua. --- omarchy_default_bindings = false --- --- Or disable only bindings for Omarchy's preinstalled apps/web apps while --- keeping core window-manager bindings: --- omarchy_preinstalled_bindings = false - --- Load Omarchy defaults. -require("default.hypr.omarchy") - --- Put your personal overrides in these files. They're loaded after Omarchy's --- defaults so package updates can improve the defaults without rewriting your --- ~/.config/hypr files. -require("hypr.monitors") -require("hypr.input") -require("hypr.bindings") -require("hypr.looknfeel") -require("hypr.autostart") - --- Toggle config flags dynamically. -require("default.hypr.toggles") - --- Add any other personal Hyprland configuration below. --- o.window("qemu", { workspace = "5" }) - --- Pin workspaces to monitors: 1-4 on the Studio Display, 5-8 on the laptop --- panel; 1 and 5 are what each shows on connect. Persistent so empty ones --- stay on their monitor (the bar's workspace dots list them per monitor). --- Matched on EDID description for the external display so it survives --- landing on a different DP connector after re-docking. -for id = 1, 8 do - hl.workspace_rule({ - workspace = tostring(id), - monitor = id <= 4 and "desc:Apple Computer Inc StudioDisplay 0x984262A7" or "eDP-1", - default = id == 1 or id == 5, - persistent = true, - }) -end - --- Always open these apps on a fixed workspace and follow them there. Classes --- come from `hyprctl clients` -- the desktop files' StartupWMClass hints --- disagree with reality for Beeper (claims BeeperTexts, actually reports --- Beeper). Add " silent" to a workspace prop to place a window without --- switching the view to it. -o.window([[^brave-www\.tldraw\.com__-Default$]], { workspace = "3" }) - --- tldraw-offline gets workspace 5 to itself on the laptop panel, fullscreen. -o.window([[^tldraw-offline$]], { workspace = "5", fullscreen = true }) - --- Scratch workspaces, toggled by ~/.local/bin/omarchy-toggle-scratch, which --- also starts any resident that is missing and picks the monitor. Pinning --- the residents here means they land on their workspace no matter who starts --- them; "silent" leaves the reveal to the script. Under the scrolling layout --- each resident gets its own column, in the order they appear. --- --- SUPER + A / SUPER + CTRL + S: Tern; SUPER + SHIFT + A: Claude Desktop. --- Each alone on its own workspace, Studio Display. Tern has no per-window --- class flag, so every Tern window lands on the scratchpad. -o.window([[^so\.stencil\.tern$]], { workspace = "special:scratchpad silent" }) -o.window([[^com\.anthropic\.Claude$]], { workspace = "special:claude silent" }) --- SUPER + CTRL + ALT + E / M: Fastmail and Beeper, each alone on the --- focused monitor. -o.window([[^com\.fastmail\.Fastmail$]], { workspace = "special:fastmail silent" }) -o.window([[^Beeper$]], { workspace = "special:beeper silent" }) --- SUPER + CTRL + H: Google Home (Brave web app), on the focused monitor. -o.window([[^brave-home\.google\.com__.*]], { workspace = "special:home silent" }) --- SUPER + CTRL + L: LM Studio, on the focused monitor. -o.window([[^ai\.elementlabs\.lmstudio$]], { workspace = "special:lmstudio silent" }) - --- SUPER + CTRL + ALT + Y / SUPER + SHIFT + Y: the YouTube web app, summoned --- by ~/.local/bin/omarchy-summon. Not a scratch workspace: a floating, --- pinned window parked in the bottom-left corner at 30% of the monitor on --- both axes, inset by general:gaps_out -- the same fit ~/.local/bin/omarchy-pip --- applies (SUPER + SHIFT + T, and the summon after a monitor move); keep the --- fraction and inset in sync. Chromium derives the class from the app URL --- and the host spelling has varied (youtube.com vs www.youtube.com) once a --- video plays, so match the family. Its picture-in-picture overlay shares --- the class; the "negative:" title match keeps it out so Omarchy's pip rule --- (float + pin, top right) still applies. Rule regexes are RE2 full matches: --- no lookahead, and a pattern must cover the whole string. -o.window( - { class = [[brave-(www\.)?youtube\.com__.*]], title = [[negative:.*Picture.?in.?[Pp]icture.*]] }, - { - float = true, - pin = true, - size = { "(monitor_w*0.3)", "(monitor_h*0.3)" }, - -- Spelled from monitor_h, not window_h: move is evaluated against the - -- size Chromium asked for, not the one the size rule imposes, and that - -- put the window top-left. - move = { "10", "(monitor_h*0.7-10)" }, - } -) diff --git a/dot_config/hypr/hyprsunset.conf b/dot_config/hypr/hyprsunset.conf deleted file mode 100644 index a3ba208..0000000 --- a/dot_config/hypr/hyprsunset.conf +++ /dev/null @@ -1,14 +0,0 @@ -# Makes hyprsunset do nothing to the screen by default -# Without this, the default applies some tint to the monitor -profile { - time = 07:00 - identity = true -} - -# To enable auto switch to nightlight, add to your .config/hypr/autostart.lua: -# o.launch_on_start("hyprsunset") -# and use the following: -# profile { -# time = 20:00 -# temperature = 4000 -# } diff --git a/dot_config/hypr/input.lua b/dot_config/hypr/input.lua deleted file mode 100644 index e7a17dc..0000000 --- a/dot_config/hypr/input.lua +++ /dev/null @@ -1,132 +0,0 @@ --- Keep only your personal input overrides here. Uncommented settings below --- replace Omarchy's defaults. - --- Key repeat: Omarchy's 250ms delay kept, rate raised 40 -> 50Hz. 200 / 50 was --- tried and felt too fast; the "typing lag" it was meant to fix turned out to be the --- Pilot W-Corne's firmware (55d4:0461, Vial/QMK over a 2.4GHz dongle) --- resolving its MT(LGUI,SPC) / MT(LCTL,SPC) thumb keys as holds the moment --- another key went down. Fixed on the board itself: Vial QMK Settings -> --- Tap-Hold -> "Ignore Mod Tap Interrupt" (qsid 8 bit 1), tapping term 150ms. --- --- The rest of the keystroke path was checked and is already optimal: the --- dongle advertises bInterval=1 (1000Hz polling), udev pins power/control=on --- (no USB autosuspend), nothing polls its raw-HID interface, WiFi sits on --- 5GHz, and render:new_render_scheduling is off (no triple-buffer frame). --- Remaining latency is the 60Hz Studio Display refresh and the fcitx5 --- input-method hop (see omarchy-fcitx5.service), neither an input option. -hl.config({ - input = { - repeat_delay = 250, - repeat_rate = 50, - - -- niri has no focus-follows-mouse: hovering gives a window pointer focus - -- (scroll goes there) but keyboard focus moves only on click. Also keeps - -- the scrolling tape from jumping when the cursor brushes a neighbour. - follow_mouse = 2, - - -- niri: touchpad { natural-scroll; tap; }. Tap-to-click is libinput's - -- default already. - touchpad = { - natural_scroll = true, - }, - }, -}) - --- niri's built-in touchpad gestures: three fingers sideways scroll the tape, --- up/down switch workspace. -hl.gesture({ fingers = 3, direction = "horizontal", action = "scroll_move" }) -hl.gesture({ fingers = 3, direction = "vertical", action = "workspace" }) - --- Keyboard layout and options. --- See https://wiki.hypr.land/Configuring/Basics/Variables/#input --- hl.config({ --- input = { --- -- Use multiple keyboard layouts and switch between them with Left Alt + Right Alt. --- kb_layout = "us,dk,eu", --- kb_options = "compose:caps,shift:both_capslock_cancel,grp:alts_toggle", --- --- -- Use a specific keyboard variant if needed (e.g. intl for international keyboards). --- kb_variant = "intl", --- --- -- Change speed of keyboard repeat. --- repeat_rate = 40, --- repeat_delay = 250, --- --- -- Start with numlock on by default. --- numlock_by_default = true, --- --- -- Increase sensitivity for mouse/trackpad (default: 0). --- sensitivity = 0.35, --- --- -- Turn off mouse acceleration (default: adaptive). --- accel_profile = "flat", --- --- touchpad = { --- -- Use natural (inverse) scrolling. --- natural_scroll = true, --- --- -- Use two-finger clicks for right-click instead of lower-right corner. --- clickfinger_behavior = true, --- --- -- Control the speed of your scrolling. --- scroll_factor = 0.4, --- --- -- Enable the touchpad while typing. --- disable_while_typing = false, --- --- -- Left-click-and-drag with three fingers. --- drag_3fg = 1, --- }, --- }, --- }) - --- App-specific touchpad scroll speeds. --- o.window("(Alacritty|kitty|foot)", { scroll_touchpad = 1.5 }) --- o.window("com.mitchellh.ghostty", { scroll_touchpad = 0.2 }) - --- Touchpad gestures live in the override block at the top of this file. - --- Tablets / pens. --- Hyprland maps a tablet across the *whole* monitor layout by default --- (input.tablet.output is empty), so a pen stretches over eDP-1 + the external --- display at once. Pin each tablet to a single output instead. --- Device names come from `hyprctl devices` (the "Tablet" entry, not "Tablet Pad"). - --- Built-in digitizer of the Flow Z13: it physically *is* the laptop panel. --- Pen and finger are separate devices; the finger one is the "Touch" entry. -hl.device({ name = "elan9008:00-04f3:43c7-stylus", output = "eDP-1" }) --- Unbound, Hyprland maps a touch onto whichever monitor is *focused* --- (onTouchDown falls back to the focused monitor when the device has no --- output), so a tap on the panel landed on the Studio Display. Bound, the tap --- focuses eDP-1 and then the window under the finger. -hl.device({ name = "elan9008:00-04f3:43c7", output = "eDP-1" }) --- --- Palm rejection while writing is libinput's job, not Hyprland's: with the --- pen in proximity it drops touches on the paired touchscreen (same --- LIBINPUT_DEVICE_GROUP) -- *all* of them only if the pen reports no tilt; --- with tilt it drops just a 200x250mm rectangle whose side is guessed from --- the tilt sign, and this pen reports ABS_TILT_X/Y, so a resting palm kept --- landing as taps and scrolls. /etc/libinput/local-overrides.quirks (not --- chezmoi-managed; the Flow Z13 stylus section) strips the tilt axes, which --- flips arbitration to ignore-all. Cost: no tilt in drawing apps. The 90ms --- re-enable after the pen leaves proximity is hard-coded in libinput. - --- Wacom Intuos BT S: pinned to the Studio Display, matched on EDID description --- so it survives a different DP connector after re-docking. With that display --- absent, Hyprland maps across the whole layout, which undocked is just eDP-1. --- --- The tablet is 152x95mm (16:10) and the display is 16:9, so the active area is --- cropped to a 152x85.5mm (16:9) band to keep strokes undistorted while still --- reaching every pixel. The band starts at the top edge, leaving the bottom --- 9.5mm of the tablet as dead space (the pen there parks at the screen bottom). -hl.device({ - name = "wacom-intuos-bt-s-pen", - output = "desc:Apple Computer Inc StudioDisplay 0x984262A7", - active_area_size = { 152, 85.5 }, - active_area_position = { 0, 0 }, -}) - --- Left-handed use rotates the tablet 180 degrees: left_handed = true - --- The 4 ExpressKeys ("Tablet Pad") cannot be bound from Hyprland; only apps --- that implement the tablet-v2 pad protocol (e.g. Krita) see them. diff --git a/dot_config/hypr/looknfeel.lua b/dot_config/hypr/looknfeel.lua deleted file mode 100644 index 229dfe9..0000000 --- a/dot_config/hypr/looknfeel.lua +++ /dev/null @@ -1,143 +0,0 @@ --- Change the default Omarchy look'n'feel. --- --- Load order is Omarchy defaults -> current theme's hyprland.lua -> this file --- (see $OMARCHY_PATH/default/hypr/omarchy.lua), so whatever is set here is the --- last writer and wins over the theme. That is the point of this file: a theme --- picks colours, the compositor's feel stays ours. - --- Flat by default, glass for terminals only. --- --- Stock quattro is rounding 0, blur off, shadow off --- ($OMARCHY_PATH/default/hypr/looknfeel.lua); themes that ship a hyprland.lua --- turn all three on for every window (Cyberdream and Spectra both did), which --- on this box is a bad trade: blur over an eDP panel plus a 5K Studio Display --- is real frame time on an iGPU sharing system memory, and Chromium/Electron --- windows cannot paint a transparent background, so fading them just shows --- wallpaper where page background should be. --- --- Blur has to be enabled globally to exist at all -- there is no positive --- `blur` window rule, only `no_blur`, and kitty's own `background_blur` (the --- ext-background-effect-v1 protocol, which Hyprland 0.56 does implement) is a --- no-op while decoration:blur:enabled is false. So: switch it on here, then --- opt every window out again except the terminals below. -hl.config({ - general = { - -- Scrolling (niri-style tape) instead of Omarchy's dwindle. Per-workspace - -- layouts saved by omarchy-hyprland-workspace-layout-toggle (SUPER + W; - -- ~/.local/state/omarchy/workspace-layouts/*.lua) still win for the - -- workspaces they name. - layout = "scrolling", - }, - - decoration = { - rounding = 0, - - -- Backdrop behind every scratch (special) workspace: the desktop under it - -- is darkened by this fraction. - dim_special = 0.33, - - blur = { - enabled = true, - -- Cheaper than the themes' size 6 / 3 passes; with only terminals - -- blurred this is a handful of quads per frame, not the whole screen. - size = 5, - passes = 2, - brightness = 0.8, - contrast = 1.1, - vibrancy = 0.15, - noise = 0.01, - new_optimizations = true, - popups = false, - }, - - shadow = { - enabled = false, - }, - }, - - group = { - groupbar = { - -- Square tab plates, to match rounding = 0 above. - gradient_rounding = 0, - }, - }, -}) - --- Omarchy tags every mapped window `default-opacity` and fades it to --- 0.985 / 0.96 ($OMARCHY_PATH/default/hypr/windows.lua); that stock fade is --- kept. Rules are last-match-wins, so this only opts every window out of the --- blur enabled above -- the few percent of wallpaper that shows through an --- inactive window is the same as stock, where blur is off entirely. -o.window({ tag = "default-opacity" }, { no_blur = true }) - --- The exception: terminals carry their own alpha (kitty's --- `background_opacity`, 0.9 in ~/.config/kitty/kitty.conf), so they are the one --- surface where blurring the backdrop buys anything. Full class list because --- the kitty hosts run under their own app-ids (kitty-herdr, kitty-tmux, --- kitty-goliath) and Omarchy tags nothing as `terminal`. -o.window( - "^(kitty(-.*)?|Alacritty|com\\.mitchellh\\.ghostty|foot|org\\.codeberg\\.dnkl\\.foot|wezterm)$", - { no_blur = false } -) - --- Themes are also free to re-enable the workspace slide (Spectra sets --- `workspaces` with its "flow" bezier); Omarchy's default is off. Restate it. --- workspacesIn/workspacesOut are not overridden anywhere, so they inherit this. -hl.animation({ leaf = "workspaces", enabled = false }) - --- Slow, constant rotation of the active-border gradient (the theme's --- hyprland_active_border; Cyberdream's is accent -> cyan). `loop` restarts --- the angle each turn so it never eases or stops; speed is deciseconds per --- revolution, so 100 = one lap every 10 s. Costs a redraw of the border each --- frame while a window is mapped. -hl.animation({ leaf = "borderangle", enabled = true, speed = 100, bezier = "linear", style = "loop" }) - --- https://wiki.hypr.land/Configuring/Basics/Variables/#general --- hl.config({ --- general = { --- -- No gaps between windows or borders. --- gaps_in = 0, --- gaps_out = 0, --- border_size = 0, --- --- -- Change to niri-like side-scrolling layout. --- layout = "scrolling", --- }, --- }) - --- https://wiki.hypr.land/Configuring/Basics/Variables/#animations --- hl.config({ --- animations = { --- -- Disable all animations. --- enabled = false, --- }, --- }) - --- https://wiki.hypr.land/Configuring/Basics/Variables/#layout --- hl.config({ --- layout = { --- -- Avoid overly wide single-window layouts on wide screens. --- single_window_aspect_ratio = { 1, 1 }, --- }, --- }) - --- Scrolling layout, matched to niri's layout block --- (~/.config/niri/config.d/20-layout-and-overview.kdl). Wins over Omarchy's --- column_width = 0.49. -hl.config({ - scrolling = { - -- default-column-width { proportion 0.5; } - column_width = 0.5, - -- preset-column-widths; SUPER + R / SUPER + SHIFT + R cycle these - -- (colresize +conf / -conf via omarchy-cycle-window-size). - explicit_column_widths = "0.333, 0.5, 0.667", - -- center-focused-column "never": scroll only as far as needed to fit the - -- focused column. SUPER + C centers on demand. - focus_fit_method = 1, - -- niri keeps a lone column at its own width instead of filling the screen. - fullscreen_on_one_column = false, - -- niri stops at the first/last column instead of wrapping around. - wrap_focus = false, - wrap_swapcol = false, - }, -}) diff --git a/dot_config/hypr/monitors.lua b/dot_config/hypr/monitors.lua deleted file mode 100644 index 24f1cfe..0000000 --- a/dot_config/hypr/monitors.lua +++ /dev/null @@ -1,19 +0,0 @@ --- See https://wiki.hypr.land/Configuring/Basics/Monitors/ --- List current monitors and supported resolutions with: hyprctl monitors all - -local omarchy_gdk_scale = 3 -local omarchy_monitor_scale = 3.2 - -hl.env("GDK_SCALE", tostring(omarchy_gdk_scale)) -hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale }) - --- Laptop panel (eDP-1) on the left, Apple Studio Display on the right. --- Logical widths at scale 2: 2560/2 = 1280, so DP-4 starts at x=1280. -hl.monitor({ output = "eDP-1", mode = "2560x1600@180", position = "0x0", scale = 2 }) -hl.monitor({ output = "DP-4", mode = "5120x2880@60", position = "1280x0", scale = 2 }) - --- Configure a specific monitor. --- hl.monitor({ output = "DP-2", mode = "2560x1440@144", position = "0x0", scale = 1 }) - --- Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°). --- hl.monitor({ output = "DP-2", mode = "preferred", position = "auto", scale = 1, transform = 1 }) diff --git a/dot_config/hypr/xdph.conf b/dot_config/hypr/xdph.conf deleted file mode 100644 index 63b66be..0000000 --- a/dot_config/hypr/xdph.conf +++ /dev/null @@ -1,4 +0,0 @@ -screencopy { - allow_token_by_default = true - custom_picker_binary = hyprland-preview-share-picker -} diff --git a/dot_config/niri b/dot_config/niri new file mode 160000 index 0000000..97a309b --- /dev/null +++ b/dot_config/niri @@ -0,0 +1 @@ +Subproject commit 97a309bbe3af518b871c796b9a2bf886ce5ad844 diff --git a/dot_config/niri/config.kdl b/dot_config/niri/config.kdl deleted file mode 100644 index 08726e8..0000000 --- a/dot_config/niri/config.kdl +++ /dev/null @@ -1,195 +0,0 @@ -// ============================================================================ -// NIRI CONFIGURATION - Base for iNiR (ii) -// ============================================================================ -// Minimal base config - customize to your needs -// Wiki: https://github.com/YaLTeR/niri/wiki/Configuration:-Introduction -// ============================================================================ - - -hotkey-overlay { - skip-at-startup -} - -screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png" - -include "config.d/10-input-and-cursor.kdl" - -include "config.d/20-layout-and-overview.kdl" - -include "config.d/30-window-rules.kdl" - -include "config.d/40-environment.kdl" - -include "config.d/50-startup.kdl" - -include "config.d/60-animations.kdl" - -include "config.d/70-binds.kdl" - -include "config.d/80-layer-rules.kdl" - -include "config.d/90-outputs.kdl" - -// ============================================================================ -// Layer rules added by iNiR (required for backdrop in overview) -// ============================================================================ - -input { - keyboard { - xkb { - layout "us" - } - repeat-delay 400 - repeat-rate 50 - } - touchpad { - natural-scroll - tap - tap-button-map "left-right-middle" - } - - mod-key "Super" - mod-key-nested "Alt" -} - -// ============================================================================ -// LAYOUT -// ============================================================================ - -layout { - background-color "transparent" - default-column-width { proportion 0.5; } - - preset-column-widths { - proportion 0.33333 - proportion 0.5 - proportion 0.66667 - } - - focus-ring { - width 1.5 - active-color "#7fc8ff" - inactive-color "transparent" - } - - border { - off - width 1.5 - active-color "#ffc87f" - inactive-color "transparent" - urgent-color "#9b0000" - } - - shadow { - off - softness 30 - spread 5 - offset x=0 y=5 - color "#0007" - } - - tab-indicator { - place-within-column - hide-when-single-tab - position "left" // Can be "left", "right", "top", or "bottom" - } - -} - -gestures { - hot-corners { - off - } -} - -cursor { - xcursor-theme "capitaine-cursors-light" - xcursor-size 24 - hide-when-typing -} - -overview { - zoom 0.4 - workspace-shadow { off; } -} -// ============================================================================ -// WINDOW RULES -// ============================================================================ - -window-rule { - geometry-corner-radius 8 - clip-to-geometry true -} - -// ============================================================================ -// ANIMATIONS -// ============================================================================ -// Tuned to complement quickshell's expressive Material motion curves -// QS uses ~500ms for main movements, ~400ms enter, ~200ms exit - -animations { - workspace-switch { - spring damping-ratio=0.78 stiffness=1350 epsilon=0.0001 - } - window-open { - spring damping-ratio=0.82 stiffness=1125 epsilon=0.0001 - } - window-close { - spring damping-ratio=0.88 stiffness=2025 epsilon=0.0001 - } - horizontal-view-movement { - spring damping-ratio=0.80 stiffness=1238 epsilon=0.0001 - } - window-movement { - spring damping-ratio=0.85 stiffness=1463 epsilon=0.0001 - } - window-resize { - spring damping-ratio=0.88 stiffness=1575 epsilon=0.0001 - } - config-notification-open-close { - spring damping-ratio=0.90 stiffness=1800 epsilon=0.0001 - } - screenshot-ui-open { - spring damping-ratio=0.85 stiffness=1688 epsilon=0.0001 - } -} - -// ============================================================================ -// ENVIRONMENT -// ============================================================================ - -environment { - XDG_CURRENT_DESKTOP "niri" - XDG_MENU_PREFIX "plasma-" // Required for Dolphin/KDE app file associations - QT_QPA_PLATFORM "wayland" - ELECTRON_OZONE_PLATFORM_HINT "auto" - QT_LOGGING_RULES "quickshell.dbus.properties=false" - - // Qt theming: kde platform reads colors from kdeglobals (requires plasma-integration pkg) - // The installer falls back to qt6ct only if plasma-integration is not installed - QT_QPA_PLATFORMTHEME "kde" - QT_STYLE_OVERRIDE "Darkly" - - // Quickshell Python virtual environment - INIR_VENV "$HOME/.local/state/quickshell/.venv" - ILLOGICAL_IMPULSE_VIRTUAL_ENV "$HOME/.local/state/quickshell/.venv" -} - -// ============================================================================ -// STARTUP — commands live in config.d/50-startup.kdl -// ============================================================================ - -// Noctalia v5: allows notification actions and window activation from Noctalia. -debug { - honor-xdg-activation-with-invalid-serial -} - - -// ============================================================================ -// KEYBINDINGS -// ============================================================================ - - -include "./noctalia.kdl" - -prefer-no-csd diff --git a/dot_config/niri/exact_config.d/10-input-and-cursor.kdl b/dot_config/niri/exact_config.d/10-input-and-cursor.kdl deleted file mode 100644 index d7cb00f..0000000 --- a/dot_config/niri/exact_config.d/10-input-and-cursor.kdl +++ /dev/null @@ -1,44 +0,0 @@ -// Outputs (example - disabled by default) -// Run `niri msg outputs` inside a niri session to see connector names and modes. -// Then edit and uncomment this block to pin a specific monitor layout. - -// ============================================================================ -// INPUT -// ============================================================================ - -input { - keyboard { - xkb { - layout "us" - } - repeat-delay 400 - repeat-rate 50 - } - touchpad { - natural-scroll - tap - tap-button-map "left-right-middle" - accel-speed 1.0 - } - - tablet { - map-to-output "eDP-1" - } - - touch { - map-to-output "eDP-1" - } - - mod-key "Super" - mod-key-nested "Alt" -} - -gestures { - -} - -cursor { - xcursor-theme "capitaine-cursors-light" - xcursor-size 24 - hide-when-typing -} diff --git a/dot_config/niri/exact_config.d/20-layout-and-overview.kdl b/dot_config/niri/exact_config.d/20-layout-and-overview.kdl deleted file mode 100644 index a19ca5f..0000000 --- a/dot_config/niri/exact_config.d/20-layout-and-overview.kdl +++ /dev/null @@ -1,57 +0,0 @@ -layout { - center-focused-column "never" - background-color "transparent" - default-column-width { proportion 0.5; } - - preset-column-widths { - proportion 0.33333 - proportion 0.5 - proportion 0.66667 - } - - focus-ring { - width 1.5 - active-color "#7fc8ff" - inactive-color "transparent" - } - - border { - off - width 1.5 - active-color "#ffc87f" - inactive-color "transparent" - urgent-color "#9b0000" - } - - shadow { - off - softness 30 - spread 5 - offset x=0 y=5 - color "#0007" - } - - tab-indicator { - place-within-column - hide-when-single-tab - position "left" // Can be "left", "right", "top", or "bottom" - } - - -} - -gestures { - hot-corners { - } -} - -cursor { - xcursor-theme "capitaine-cursors-light" - xcursor-size 24 - hide-when-typing -} - -overview { - zoom 0.4 - workspace-shadow { off; } -} diff --git a/dot_config/niri/exact_config.d/30-window-rules.kdl b/dot_config/niri/exact_config.d/30-window-rules.kdl deleted file mode 100644 index d12feb0..0000000 --- a/dot_config/niri/exact_config.d/30-window-rules.kdl +++ /dev/null @@ -1,103 +0,0 @@ -// ============================================================================ -// WINDOW RULES -// ============================================================================ - -window-rule { - geometry-corner-radius 10 - clip-to-geometry true -} - -window-rule { - background-effect { - blur true - xray false - } -} - -// Noctalia v5: floating settings window. -window-rule { - match app-id="dev.noctalia.Noctalia" - open-floating true - default-column-width { fixed 1080; } - default-window-height { fixed 920; } -} - -blur { - passes 4 - offset 5.0 - noise 0.02 - saturation 2.0 -} - -window-rule { - match app-id="Folo" - match app-id="Spotify" - match app-id="zen" - match app-id="brave-origin" - match app-id="gemini-desktop" - match app-id="claude-desktop" - opacity 0.9 - open-floating false - draw-border-with-background false - background-effect { - blur true - xray false - } - open-focused true -} - -window-rule { - match app-id="kitty" - match app-id="zed" - match app-id="obsidian" - match app-id="Beeper" - match app-id="chromium" - match app-id="com.mitchellh.ghostty" - opacity 0.9 - open-floating false - draw-border-with-background false - open-focused true - background-effect { - blur true - xray false - } -} - -window-rule { - match app-id="org.gnome.Nautilus" - match app-id="com.gabm.satty" - open-floating true - open-focused true - draw-border-with-background false - default-column-width { proportion 0.5; } -} - - -window-rule { - match title="Picture-in-Picture" app-id="zen" - match title="Picture in picture" - open-floating true - open-focused false - opacity 1.0 - - // default-floating-position x=28 y=28 relative-to="top-right" - default-floating-position x=24 y=24 relative-to="top-right" - open-on-output "eDP-1" - // open-on-output "HDMI-A-1" - // open-on-output "Apple Computer Inc StudioDisplay 0x984262A7" -} - -window-rule { - match app-id="zed" - match app-id="obsidian" - match app-id="sticky-notest-canvas" - match title="Sticky Notes" - match app-id="vacuumtube" - match app-id="Fladder" - match app-id="kitty" - match app-id="kitty-herdr" - match app-id="kitty-tmux" - - open-on-output "Apple Computer Inc StudioDisplay 0x984262A7" -} - diff --git a/dot_config/niri/exact_config.d/40-environment.kdl b/dot_config/niri/exact_config.d/40-environment.kdl deleted file mode 100644 index 1ffe0bc..0000000 --- a/dot_config/niri/exact_config.d/40-environment.kdl +++ /dev/null @@ -1,22 +0,0 @@ -// ============================================================================ -// ENVIRONMENT -// ============================================================================ - -environment { - XDG_CURRENT_DESKTOP "niri" - XDG_MENU_PREFIX "plasma-" // Required for Dolphin/KDE app file associations - QT_QPA_PLATFORM "wayland" - ELECTRON_OZONE_PLATFORM_HINT "auto" - QT_LOGGING_RULES "quickshell.dbus.properties=false" - - // Qt theming: kde platform reads colors from kdeglobals (requires plasma-integration pkg) - // The installer falls back to qt6ct only if plasma-integration is not installed - QT_QPA_PLATFORMTHEME "kde" - QT_STYLE_OVERRIDE "Darkly" - - // Quickshell Python virtual environment - INIR_VENV "$HOME/.local/state/quickshell/.venv" - ILLOGICAL_IMPULSE_VIRTUAL_ENV "$HOME/.local/state/quickshell/.venv" -} - - diff --git a/dot_config/niri/exact_config.d/50-startup.kdl b/dot_config/niri/exact_config.d/50-startup.kdl deleted file mode 100644 index 7154a9c..0000000 --- a/dot_config/niri/exact_config.d/50-startup.kdl +++ /dev/null @@ -1,11 +0,0 @@ -// ============================================================================ -// STARTUP -// ============================================================================ - -// Import XDG_MENU_PREFIX to systemd for Dolphin/KDE app file associations -spawn-at-startup "bash" "-c" "systemctl --user import-environment XDG_MENU_PREFIX && kbuildsycoca6" -spawn-at-startup "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" -spawn-at-startup "noctalia" -spawn-at-startup "niri-dynamic-workspaces" "daemon" -spawn-at-startup "vicinae" "server" -spawn-at-startup "bash" "-c" "wl-paste --watch cliphist store &" diff --git a/dot_config/niri/exact_config.d/60-animations.kdl b/dot_config/niri/exact_config.d/60-animations.kdl deleted file mode 100644 index ed2a530..0000000 --- a/dot_config/niri/exact_config.d/60-animations.kdl +++ /dev/null @@ -1,32 +0,0 @@ -// ============================================================================ -// ANIMATIONS -// ============================================================================ -// Tuned to complement quickshell's expressive Material motion curves -// QS uses ~500ms for main movements, ~400ms enter, ~200ms exit - -animations { - workspace-switch { -spring damping-ratio=1.0 stiffness=4000 epsilon=0.0001 - } - window-open { - spring damping-ratio=1.0 stiffness=5000 epsilon=0.0001 - } - window-close { - spring damping-ratio=1.0 stiffness=6000 epsilon=0.0001 - } - horizontal-view-movement { - spring damping-ratio=1.0 stiffness=4500 epsilon=0.0001 - } - window-movement { - spring damping-ratio=1.0 stiffness=5000 epsilon=0.0001 - } - window-resize { - spring damping-ratio=1.0 stiffness=5500 epsilon=0.0001 - } - config-notification-open-close { - spring damping-ratio=1.0 stiffness=5000 epsilon=0.0001 - } - screenshot-ui-open { - spring damping-ratio=1.0 stiffness=5000 epsilon=0.0001 - } -} diff --git a/dot_config/niri/exact_config.d/70-binds.kdl b/dot_config/niri/exact_config.d/70-binds.kdl deleted file mode 100644 index 34292dc..0000000 --- a/dot_config/niri/exact_config.d/70-binds.kdl +++ /dev/null @@ -1,156 +0,0 @@ -// ============================================================================ -// KEYBINDINGS -// ============================================================================ - - -binds { - // System - Mod+Tab repeat=false { toggle-overview; } - Mod+Shift+E { quit; } - Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } - - // ii Overview (daemon) - Mod+Space repeat=false { spawn "vicinae" "toggle"; } - Mod+Shift+Space repeat=false { spawn "vicinae" "vicinae://launch/core/search-emojis"; } - Mod+Shift+Return repeat=false { spawn "vicinae" "vicinae://launch/wm/switch-windows"; } - Mod+BackSpace { focus-window-previous; } - - // ii Clipboard - Mod+P { spawn "vicinae" "vicinae://launch/clipboard/history"; } - Mod+Ctrl+R { spawn "noctalia" "msg" "plugin" "prdlk/ostt:recorder" "focused" "toggle"; } - - // ii Region tools - // Goliath: mosh + tmux and the tmux keymaps live in ~/.config/kitty/goliath.conf - Mod+Shift+G { spawn-sh "kitty --class=kitty-goliath --title=goliath --config ~/.config/kitty/goliath.conf"; } - Mod+S { spawn "dot-screenshot" "region"; } - Mod+Shift+S { spawn "dot-screenshot" "window"; } - Mod+Ctrl+S { spawn "dot-screenshot" "monitor-focused"; } - Mod+Ctrl+Shift+S { spawn "dot-screenshot" "monitor-all"; } - // v4: Mod+Period { spawn-sh "qs -c noctalia-shell ipc call controlCenter toggle"; } - // v4: Mod+Comma { spawn-sh "qs -c noctalia-shell ipc call settings toggle"; } - Mod+Period { spawn-sh "noctalia msg panel-toggle control-center"; } - Mod+Comma { spawn-sh "noctalia msg settings-toggle"; } - - Super+Ctrl+A { spawn "vicinae" "vicinae://launch/applications/com.anthropic.Claude"; } - Super+Ctrl+G { spawn "vicinae" "vicinae://launch/applications/gemini-desktop"; } - Super+Alt+Ctrl+H { spawn "niri-launch-ai"; } - Super+Alt+Ctrl+J { spawn "niri-launch-terminal"; } - Super+Alt+Ctrl+K { spawn "niri-launch-browser"; } - Super+Alt+Ctrl+O { spawn "niri-launch" "obsidian"; } - Super+Alt+Ctrl+W { spawn "vicinae" "vicinae://launch/applications/tldraw_offline"; } - Super+Alt+Ctrl+E { spawn "vicinae" "vicinae://launch/applications/com.fastmail.Fastmail"; } - Super+Alt+Ctrl+B { spawn "vicinae" "vicinae://launch/applications/beeper"; } - Super+Alt+Ctrl+G { spawn "vicinae" "vicinae://launch/applications/com.mitchellh.ghostty"; } - Super+Alt+Ctrl+L { spawn "vicinae" "vicinae://launch/applications/WebApp-Linear3312"; } - Super+Alt+Ctrl+M { spawn "vicinae" "vicinae://launch/applications/beeper"; } - Super+Alt+Ctrl+T { spawn "vicinae" "vicinae://launch/applications/todoist"; } - Super+Alt+Ctrl+N { spawn "noctalia" "msg" "panel-open" "noctalia/notes:panel"; } - Super+Alt+Ctrl+F { spawn "vicinae" "vicinae://launch/applications/org.gnome.Nautilus"; } - Super+Alt+Ctrl+Space { spawn "vicinae" "vicinae://launch/applications/io.github.faridjaff.StickyNotesCanvas"; } - Super+Alt+Ctrl+Return { spawn "vicinae" "vicinae://launch/wm/switch-windows"; } - - Super+Shift+Alt+Ctrl+W { spawn "niri-dynamic-workspaces" "switch" "w"; } - Super+Shift+Alt+Ctrl+H { spawn "niri-dynamic-workspaces" "switch" "h"; } - Super+Alt+Ctrl+Y { spawn "niri-launch-webapp"; } - Super+Alt+Ctrl+X { spawn "niri-dynamic-workspaces" "switch" "x"; } - - // ─── Monitors ─── (Vertical) - Mod+Left { focus-monitor-left; } - Mod+Up { focus-monitor-up; } - Mod+Right { focus-monitor-right; } - Mod+Shift+Down { move-column-to-monitor-right; } - Mod+Shift+Up { move-column-to-monitor-left; } - - // ─── Layout ─── - Mod+R { switch-preset-column-width; } - Mod+Shift+R { switch-preset-window-height; } - Mod+Shift+F { maximize-column; } - Mod+F { expand-column-to-available-width; } - Super+C { center-column; } - Mod+Ctrl+C { center-visible-columns; } - Mod+Ctrl+F { fullscreen-window; } - Mod+Ctrl+O { toggle-window-floating; } - - // ─── Window Sizing: hjkl ─── - Alt+Shift+H { set-column-width "-10%"; } - Alt+Shift+J { set-window-height "-10%"; } - Alt+Shift+K { set-window-height "+10%"; } - Alt+Shift+L { set-column-width "+10%"; } - - - - // Window management - Mod+Q repeat=false { spawn "/home/prad/.local/bin/niri-smart-close"; } - - // Focus - Mod+H { focus-column-left-or-last; } - Mod+L { focus-column-right-or-first; } - Mod+J { focus-window-or-workspace-down; } - Mod+K { focus-window-or-workspace-up; } - - // Workspaces - Mod+Shift+J { move-column-to-workspace-down; } - Mod+Shift+K { move-column-to-workspace-up; } - - // Monitors - Super+O { focus-monitor-next; } - Super+Ctrl+J { focus-monitor-next; } - Super+Ctrl+K { focus-monitor-previous; } - Super+Shift+O { move-column-to-monitor-next; } - Mod+Ctrl+Shift+J { move-column-to-monitor-next; } - Mod+Ctrl+Shift+K { move-column-to-monitor-previous; } - - // Columns - Super+Ctrl+H { focus-column-first; } - Super+Ctrl+L { focus-column-last; } - Super+Ctrl+Shift+H { move-column-to-first; } - Super+Ctrl+Shift+L { move-column-to-last; } - - // Tabs - Mod+W { toggle-column-tabbed-display; } - Mod+Shift+H { spawn "/home/prad/.local/bin/niri-smart-move" "left"; } - Mod+Shift+L { spawn "/home/prad/.local/bin/niri-smart-move" "right"; } - - // Screenshots (native) - Print { screenshot; } - Ctrl+Print { screenshot-screen; } - Alt+Print { screenshot-window; } - - // ======================================================================== - // HARDWARE KEYS - Audio, Brightness, Media - // ======================================================================== - // These use noctalia IPC so the OSD (On Screen Display) shows feedback - - Mod+F24 { spawn "voxtype" "record" "toggle" "--profile" "hermes"; } - - // ─── Media Controls ─── - // v4: XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume increase"; } - // v4: XF86AudioLowerVolume allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume decrease"; } - // v4: XF86AudioMute allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume muteOutput"; } - // v4: XF86AudioMicMute allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call volume muteInput"; } - // v4: XF86AudioNext allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media next"; } - // v4: XF86AudioPrev allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media previous"; } - // v4: XF86AudioPlay allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media playPause"; } - // v4: XF86AudioPause allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call media playPause"; } - XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; } - XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; } - XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; } - XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; } - XF86AudioNext allow-when-locked=true { spawn-sh "noctalia msg media next"; } - XF86AudioPrev allow-when-locked=true { spawn-sh "noctalia msg media previous"; } - XF86AudioPlay allow-when-locked=true { spawn-sh "noctalia msg media toggle"; } - XF86AudioPause allow-when-locked=true { spawn-sh "noctalia msg media toggle"; } - - // ─── Brightness Controls ─── - // v4: XF86MonBrightnessUp allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call brightness increase"; } - // v4: XF86MonBrightnessDown allow-when-locked=true { spawn-sh "qs -c noctalia-shell ipc call brightness decrease"; } - XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; } - XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; } - - // Power / Session - // v4: Mod+Shift+Q { spawn-sh "qs -c noctalia-shell ipc call sessionMenu toggle"; } - Mod+Shift+Q hotkey-overlay-title="Session Menu: noctalia session" { spawn-sh "noctalia msg panel-toggle session"; } - -} - - diff --git a/dot_config/niri/exact_config.d/80-layer-rules.kdl b/dot_config/niri/exact_config.d/80-layer-rules.kdl deleted file mode 100644 index fee5ce8..0000000 --- a/dot_config/niri/exact_config.d/80-layer-rules.kdl +++ /dev/null @@ -1,34 +0,0 @@ - - - -/* - Noctalia v5: disable xray on all our surfaces so blur looks more realistic. - Noctalia publishes blur regions automatically when ext-background-effects is available. -*/ -layer-rule { - match namespace="^noctalia-(bar-[^\"]+|notification|dock|panel|attached-panel|osd)$" - background-effect { - xray false - //blur false - } -} - -// Option 2 (Stationary Wallpaper): place the regular wallpaper on the backdrop. -layer-rule { - match namespace="^noctalia-wallpaper" - place-within-backdrop true -} - -// Set transparent workspace background color so you see the backdrop at all times. -layout { - background-color "transparent" -} - -// Optionally, disable the workspace shadows in the overview. -overview { - workspace-shadow { - off - } -} - - diff --git a/dot_config/niri/exact_config.d/90-outputs.kdl b/dot_config/niri/exact_config.d/90-outputs.kdl deleted file mode 100644 index 482966f..0000000 --- a/dot_config/niri/exact_config.d/90-outputs.kdl +++ /dev/null @@ -1,47 +0,0 @@ -// ============================================================================ -// OUTPUTS -// ============================================================================ -// -// // Apple Display -// output "Apple Computer Inc StudioDisplay 0x984262A7" { -// position x=0 y=0 -// scale 1.5 -// layout { -// center-focused-column "never" -// always-center-single-column true -// gaps 8 -// default-column-width { -// proportion 0.75 -// } -// preset-column-widths { -// proportion 0.25 -// proportion 0.5 -// proportion 0.75 -// } -// } -// } -// -// -// -output "DP-5" { - off -} -// -// -// output "DP-4" { -// off -// } -// ============================================================================ -// OUTPUTS -// ============================================================================ -// The Studio Display exposes a phantom second connector (DP-4/5/6, varies per -// boot) whose only mode is 640x480. Connector name and EDID both shift, so it -// can't be matched in config — this script finds it by mode signature instead. -// spawn-at-startup "/home/prad/.config/niri/scripts/kill-phantom-display.fish" - - -include "91-internal-display.kdl" -// include "92-ultrawide.kdl" -include "93-apple-display.kdl" -include "94-portable-hdmi.kdl" -// include "95-portable-usbc.kdl" diff --git a/dot_config/niri/exact_config.d/91-internal-display.kdl b/dot_config/niri/exact_config.d/91-internal-display.kdl deleted file mode 100644 index 132c56f..0000000 --- a/dot_config/niri/exact_config.d/91-internal-display.kdl +++ /dev/null @@ -1,69 +0,0 @@ - -// Internal Display -output "Tianma Microelectronics Ltd. TL134ADXP03 Unknown" { - position x=0 y=0 - scale 1.5 - variable-refresh-rate on-demand=true - layout { - always-center-single-column true - center-focused-column "never" - gaps 8 - default-column-width { proportion 1.0; } - preset-column-widths { - proportion 0.5 - proportion 1.0 - } - } -} - -workspace "1" { - open-on-output "Tianma Microelectronics Ltd. TL134ADXP03 Unknown" -} - -window-rule { - match app-id="chrome-youtube.com__-Default" - match app-id="chromium" - - draw-border-with-background false - - open-focused true - open-maximized true - open-on-workspace "1" -} - -workspace "2" { - open-on-output "Tianma Microelectronics Ltd. TL134ADXP03 Unknown" -} - -window-rule { - match app-id="org.gnome.Calendar" - match app-id="discord" - match app-id="slack" - match app-id="com-fastmail-fastmail" - match app-id="gemini-desktop" - match app-id="Beeper" - match app-id="com.anthropic.Claude" - match app-id="Hermes" - match app-id="todoist" - - draw-border-with-background false - - open-focused true - open-maximized true - open-on-workspace "1" -} - -workspace "3" { - open-on-output "Tianma Microelectronics Ltd. TL134ADXP03 Unknown" -} - -window-rule { - match app-id="WebApp-CloudflarePersonal7594" - match app-id="WebApp-CloudflareWalletbase8881" - - draw-border-with-background false - - open-focused true - open-maximized true - open-on-workspace "1" -} diff --git a/dot_config/niri/exact_config.d/92-ultrawide.kdl b/dot_config/niri/exact_config.d/92-ultrawide.kdl deleted file mode 100644 index 777249d..0000000 --- a/dot_config/niri/exact_config.d/92-ultrawide.kdl +++ /dev/null @@ -1,24 +0,0 @@ -// ============================================================================ -// OUTPUTS -// ============================================================================ - -output "Samsung Electric Company S34CG50 HNTY501103" { - position x=0 y=0 - mode "3440x1440@100.00" - scale 1 - variable-refresh-rate on-demand=true - layout { - center-focused-column "never" - always-center-single-column true - gaps 16 - default-column-width { - proportion 0.3333 - } - preset-column-widths { - proportion 0.3333 - proportion 0.5 - proportion 0.6667 - } - } -} - diff --git a/dot_config/niri/exact_config.d/93-apple-display.kdl b/dot_config/niri/exact_config.d/93-apple-display.kdl deleted file mode 100644 index 136e039..0000000 --- a/dot_config/niri/exact_config.d/93-apple-display.kdl +++ /dev/null @@ -1,23 +0,0 @@ -// ============================================================================ -// OUTPUTS -// ============================================================================ - -// Apple Display -output "Apple Computer Inc StudioDisplay 0x984262A7" { - scale 1.75 - layout { - center-focused-column "never" - always-center-single-column true - gaps 8 - default-column-width { - proportion 0.5 - } - preset-column-widths { - proportion 0.25 - proportion 0.3333 - proportion 0.5 - proportion 0.6667 - } - } -} - diff --git a/dot_config/niri/exact_config.d/94-portable-hdmi.kdl b/dot_config/niri/exact_config.d/94-portable-hdmi.kdl deleted file mode 100644 index 321c925..0000000 --- a/dot_config/niri/exact_config.d/94-portable-hdmi.kdl +++ /dev/null @@ -1,22 +0,0 @@ -// ============================================================================ -// OUTPUTS -// ============================================================================ - -// Portable Display #1 -output "PNP(AOP) 16PM1QB 14490001D3X00" { - transform "90" - layout { - always-center-single-column true - center-focused-column "never" - gaps 2 - default-column-width { - proportion 1.0 - } - preset-column-widths { - proportion 0.5 - proportion 1.0 - } - } -} - - diff --git a/dot_config/niri/exact_config.d/95-portable-usbc.kdl b/dot_config/niri/exact_config.d/95-portable-usbc.kdl deleted file mode 100644 index 2c1c831..0000000 --- a/dot_config/niri/exact_config.d/95-portable-usbc.kdl +++ /dev/null @@ -1,20 +0,0 @@ -// ============================================================================ -// OUTPUTS -// ============================================================================ - -output "ASUSTek COMPUTER INC ASUS MB16AC M8LMTF195749" { - position x=0 y=0 - layout { - always-center-single-column true - center-focused-column "never" - gaps 2 - default-column-width { - proportion 1.0 - } - preset-column-widths { - proportion 0.5 - proportion 1.0 - } - } -} - diff --git a/dot_config/niri/noctalia.kdl b/dot_config/niri/noctalia.kdl deleted file mode 100644 index 28d5427..0000000 --- a/dot_config/niri/noctalia.kdl +++ /dev/null @@ -1,35 +0,0 @@ -layout { - - focus-ring { - active-color "#a398b3" - inactive-color "#1e1c21" - urgent-color "#fd4663" - } - - border { - active-color "#a398b3" - inactive-color "#1e1c21" - urgent-color "#fd4663" - } - - shadow { - color "#1e1c2170" - } - - tab-indicator { - active-color "#a398b3" - inactive-color "#4a4158" - urgent-color "#fd4663" - } - - insert-hint { - color "#a398b380" - } -} - -recent-windows { - highlight { - active-color "#a398b3" - urgent-color "#fd4663" - } -} diff --git a/dot_config/niri/scripts/executable_kill-phantom-display.fish b/dot_config/niri/scripts/executable_kill-phantom-display.fish deleted file mode 100755 index aecb043..0000000 --- a/dot_config/niri/scripts/executable_kill-phantom-display.fish +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env fish -# Turn off the phantom Studio Display leg (DP-4/5/6, varies per boot). -# Its signature is a single 640x480 mode — connector name and EDID are unreliable. -# ponytail: one-shot with retry at startup; doesn't handle mid-session hotplug — -# switch to a `niri msg event-stream` watcher if that starts biting. -for i in (seq 10) - set -l phantoms (niri msg -j outputs 2>/dev/null | jq -r ' - to_entries[] - | select((.value.modes | length) == 1 - and .value.modes[0].width == 640 - and .value.modes[0].height == 480) - | .key') - if test -n "$phantoms" - for out in $phantoms - niri msg output $out off - end - exit 0 - end - sleep 1 -end diff --git a/dot_config/niri/scripts/executable_ndw-route-workspace.sh b/dot_config/niri/scripts/executable_ndw-route-workspace.sh deleted file mode 100755 index 0e76e78..0000000 --- a/dot_config/niri/scripts/executable_ndw-route-workspace.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash -# ndw-route-workspace.sh -# Routes a niri-dynamic-workspaces workspace to the correct monitor by -# resolving the Apple Studio Display's connector at runtime. -# -# Inputs: NDW_WORKSPACE_KEY env var (set by ndw on_create), or $1. -# Exits silently on unknown keys so it's safe to call for all workspaces. - -set -euo pipefail - -KEY="${NDW_WORKSPACE_KEY:-${1:-}}" -[ -z "$KEY" ] && exit 0 - -INTERNAL="HDMI-A-1" - -# Resolve the external Apple Studio Display connector. -# Match by make+model; fall back to eDP-1 if not currently connected. -resolve_external() { - niri msg --json outputs | jq -r ' - to_entries - | map(select( - .value.make == "Apple Computer Inc" - and .value.model == "StudioDisplay" - )) - | .[0].key // empty - ' -} - -case "$KEY" in - y|g|m|x|z|p|l|a) - target="$INTERNAL" - ;; - b|f|s|w|c|d|o) - target="$(resolve_external)" - [ -z "$target" ] && target="$INTERNAL" # external not connected - ;; - *) - exit 0 - ;; -esac - -exec niri msg action move-workspace-to-monitor "$target" diff --git a/dot_config/niri/scripts/executable_niri-floating-sidebar.sh b/dot_config/niri/scripts/executable_niri-floating-sidebar.sh deleted file mode 100755 index c4900be..0000000 --- a/dot_config/niri/scripts/executable_niri-floating-sidebar.sh +++ /dev/null @@ -1,367 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -#============================================================================= -# Niri Sidebar Manager -#============================================================================= -# This script manages floating windows in the Niri window manager, -# organizing them into a toggleable sidebar. -#============================================================================= - -### --- DIMENSION SETTINGS --- ### -readonly WIN_W=550 # Floating window width -readonly BASE_SLOTS=4 # Default number of slots in the sidebar -readonly GAP_BETWEEN=15 # Gap between windows -readonly BOTTOM_MARGIN=50 # Bottom screen margin -readonly TOP_MARGIN=30 # Top screen margin -readonly SIDE_MARGIN=20 # Side screen margin -readonly VISIBLE_SLIVER=70 # Pixels visible when sidebar is hidden - -### --- STATE FILES --- ### -# Get current workspace ID -WORKSPACE_ID=$(niri msg --json workspaces | jq -r '.[] | select(.is_focused).id') - -# File paths for state tracking -readonly FLAG_FILE="/tmp/niri.toggle.${WORKSPACE_ID}.floating" -readonly STATE_FILE="/tmp/niri.toggle.${WORKSPACE_ID}.state" -readonly ORDER_STATE_FILE="/tmp/niri.toggle.${WORKSPACE_ID}.order" -readonly HIDE_STATE_FILE="/tmp/niri.toggle.${WORKSPACE_ID}.hide_state" - -### --- SCREEN INFO --- ### -readonly SCREEN_W=$(niri msg --json outputs | jq -r 'to_entries[0].value.logical.width') -readonly SCREEN_H=$(niri msg --json outputs | jq -r 'to_entries[0].value.logical.height') - -#============================================================================= -# FUNCTION: get_focused_window -# Description: Returns JSON info of the currently focused window -#============================================================================= -get_focused_window() { - niri msg --json windows | jq -r '.[] | select(.is_focused)' -} - -#============================================================================= -# FUNCTION: ensure_files_exist -# Description: Creates necessary state files if they don't exist -#============================================================================= -ensure_files_exist() { - touch "$FLAG_FILE" "$STATE_FILE" "$HIDE_STATE_FILE" "$ORDER_STATE_FILE" - - if [ ! -s "$HIDE_STATE_FILE" ]; then - echo "visible" >"$HIDE_STATE_FILE" - fi - - if [ ! -s "$ORDER_STATE_FILE" ]; then - echo "bottom-up" >"$ORDER_STATE_FILE" - fi -} - -#============================================================================= -# FUNCTION: get_floating_windows -# Description: Gets a list of floating window IDs in the current workspace -#============================================================================= -get_floating_windows() { - niri msg --json windows | - jq -r ".[] | select(.is_floating==true and .workspace_id==$WORKSPACE_ID) | .id" -} - -#============================================================================= -# FUNCTION: cleanup_state_file -# Description: Removes closed windows from the state file -# Parameters: -# $1 - List of currently active floating windows -#============================================================================= -cleanup_state_file() { - local actual_floating="$1" - - if [ ! -s "$STATE_FILE" ]; then - return - fi - - local tmp_state - tmp_state=$(mktemp) - - while IFS= read -r line; do - local id_in_file - id_in_file=$(echo "$line" | cut -d: -f1) - - if echo "$actual_floating" | grep -q "^${id_in_file}$"; then - echo "$line" >>"$tmp_state" - fi - done <"$STATE_FILE" - - mv "$tmp_state" "$STATE_FILE" -} - -#============================================================================= -# FUNCTION: calculate_window_dimensions -# Description: Calculates dynamic window height and X position -# Parameters: -# $1 - Window count -# Returns: Sets WIN_H and X global variables -#============================================================================= -calculate_window_dimensions() { - local count="$1" - local slots="$BASE_SLOTS" - - # Increase slots if window count exceeds default - if [ "$count" -gt "$BASE_SLOTS" ]; then - slots="$count" - fi - - # Calculate available vertical space - local total_gaps_space=$(((slots - 1) * GAP_BETWEEN)) - local available_h=$((SCREEN_H - TOP_MARGIN - BOTTOM_MARGIN - total_gaps_space)) - - # Export calculated dimensions - WIN_H=$((available_h / slots)) - X=$((SCREEN_W - WIN_W - SIDE_MARGIN)) -} - -#============================================================================= -# FUNCTION: position_window -# Description: Moves and resizes a specific window -# Parameters: -# $1 - Window ID -# $2 - X position -# $3 - Y position -#============================================================================= -position_window() { - local id="$1" - local x="$2" - local y="$3" - - niri msg action set-window-width "$WIN_W" --id "$id" 2>/dev/null || true - niri msg action set-window-height "$WIN_H" --id "$id" 2>/dev/null || true - niri msg action move-floating-window --id "$id" --x "$x" --y "$y" 2>/dev/null || true -} - -#============================================================================= -# FUNCTION: reorder_sidebar -# Description: Syncs state and updates all window positions on screen -#============================================================================= -reorder_sidebar() { - local actual_floating - actual_floating=$(get_floating_windows) - - cleanup_state_file "$actual_floating" - - local sorted_ids - sorted_ids=$(grep -Ff <(echo "$actual_floating") "$STATE_FILE" 2>/dev/null | cut -d: -f1 || true) - - local count - count=$(echo "$sorted_ids" | grep -c . || echo 0) - - if [ "$count" -eq 0 ]; then - >"$FLAG_FILE" - echo "visible" >"$HIDE_STATE_FILE" - return - fi - - calculate_window_dimensions "$count" - - local order - order=$(cat "$ORDER_STATE_FILE" 2>/dev/null || echo "bottom-up") - - >"$FLAG_FILE" - local index=0 - - while IFS= read -r id; do - [ -z "$id" ] && continue - - local pos_y - if [ "$order" = "top-down" ]; then - pos_y=$((TOP_MARGIN + index * (WIN_H + GAP_BETWEEN))) - else - pos_y=$((SCREEN_H - BOTTOM_MARGIN - WIN_H - index * (WIN_H + GAP_BETWEEN))) - fi - - position_window "$id" "$X" "$pos_y" - echo "${id}:${X}:${pos_y}" >>"$FLAG_FILE" - - index=$((index + 1)) - done <<<"$sorted_ids" - - echo "visible" >"$HIDE_STATE_FILE" -} - -#============================================================================= -# FUNCTION: toggle_float -# Description: Toggles focused window between sidebar and tiling mode -#============================================================================= -toggle_float() { - local focused_json - focused_json=$(get_focused_window) - - local focused_id - focused_id=$(echo "$focused_json" | jq -r '.id') - - if [ -z "$focused_id" ] || [ "$focused_id" = "null" ]; then - echo "Error: No focused window" - return 1 - fi - - if grep -q "^$focused_id:" "$STATE_FILE" 2>/dev/null; then - # Restore to tiling mode - local old_dim - old_dim=$(grep "^$focused_id:" "$STATE_FILE") - - local old_w old_h - old_w=$(echo "$old_dim" | cut -d: -f2) - old_h=$(echo "$old_dim" | cut -d: -f3) - - # Remove from state - sed -i "/^$focused_id:/d" "$STATE_FILE" - - # Action: Move to tiling - niri msg action move-window-to-tiling - - # Restore original dimensions - [ "$old_w" != "null" ] && niri msg action set-column-width "$old_w" 2>/dev/null || true - [ "$old_h" != "null" ] && niri msg action set-window-height "$old_h" 2>/dev/null || true - - reorder_sidebar - echo "✓ Window removed from sidebar" - else - # Add to sidebar - local orig_w orig_h - orig_w=$(echo "$focused_json" | jq -r '.layout.window_size[0] // 800') - orig_h=$(echo "$focused_json" | jq -r '.layout.window_size[1] // 600') - - # Save original size - echo "$focused_id:$orig_w:$orig_h" >>"$STATE_FILE" - - # Action: Move to floating - niri msg action move-window-to-floating - - # Refresh sidebar - reorder_sidebar - - # Keep focus on the window - niri msg action focus-window --id "$focused_id" 2>/dev/null || true - - echo "✓ Window added to sidebar" - fi -} - -#============================================================================= -# FUNCTION: toggle_hide -# Description: Hides/Shows the entire sidebar by pushing windows off-screen -#============================================================================= -toggle_hide() { - - # Save current hide state - local previous_state - previous_state=$(cat "$HIDE_STATE_FILE" 2>/dev/null || echo "visible") - - # Reorder sidebar to fix any desync without breaking hide/show state - local actual_floating - actual_floating=$(get_floating_windows) - - if [ -n "$actual_floating" ]; then - reorder_sidebar - # reorder_sidebar forces visible, restore previous state - echo "$previous_state" >"$HIDE_STATE_FILE" - fi - - if [ ! -s "$FLAG_FILE" ]; then - echo "No floating windows detected" - return 0 - fi - - local current_state - current_state=$(cat "$HIDE_STATE_FILE") - - if [ "$current_state" = "visible" ]; then - # Hide: push windows off-screen - while IFS=: read -r id x y; do - [ -z "$id" ] && continue - local new_x=$((SCREEN_W - VISIBLE_SLIVER)) - niri msg action move-floating-window --id "$id" --x "$new_x" --y "$y" 2>/dev/null || true - done <"$FLAG_FILE" - - echo "hidden" >"$HIDE_STATE_FILE" - echo "✓ Sidebar hidden" - else - # Show: restore original positions - while IFS=: read -r id x y; do - [ -z "$id" ] && continue - niri msg action move-floating-window --id "$id" --x "$x" --y "$y" 2>/dev/null || true - done <"$FLAG_FILE" - - echo "visible" >"$HIDE_STATE_FILE" - echo "✓ Sidebar visible" - fi -} - -#============================================================================= -# FUNCTION: flip_sidebar_order -# Description: Flip the order of the sidebar -#============================================================================= - -flip_sidebar_order() { - local current - current=$(cat "$ORDER_STATE_FILE" 2>/dev/null || echo "bottom-up") - - if [ "$current" = "bottom-up" ]; then - echo "top-down" >"$ORDER_STATE_FILE" - else - echo "bottom-up" >"$ORDER_STATE_FILE" - fi - - reorder_sidebar - echo "✓ Sidebar order flipped" -} - -#============================================================================= -# FUNCTION: show_usage -# Description: Displays help information -#============================================================================= -show_usage() { - cat </dev/null 2>&1 || true -[ "$(win)" != "$w0" ] && exit 0 - -# 2) occupied workspace in that direction (skip the empty trailing one) -wss=$(niri msg --json workspaces) -wins=$(niri msg --json windows) -cwsid=$(jq -r 'map(select(.is_focused)) | .[0].id' <<<"$wss") -real_neighbor=$(jq -n --argjson wss "$wss" --argjson wins "$wins" \ - --argjson cwsid "$cwsid" --arg dir "$dir" ' - ($wss[] | select(.id==$cwsid)) as $c - | [ $wss[] - | select(.output==$c.output) - | select(if $dir=="down" then .idx>$c.idx else .idx<$c.idx end) - | .id as $wid - | select([$wins[] | select(.workspace_id==$wid)] | length > 0) ] - | length > 0') - -if [ "$real_neighbor" = "true" ]; then - niri msg action "focus-workspace-$dir" >/dev/null 2>&1 || true - exit 0 -fi - -# 3) adjacent monitor… or wrap to the far-end monitor -o0=$(out); niri msg action "focus-monitor-$dir" >/dev/null 2>&1 || true -[ "$(out)" != "$o0" ] && exit 0 -while :; do - prev=$(out) - niri msg action "focus-monitor-$opp" >/dev/null 2>&1 || true - [ "$(out)" = "$prev" ] && break -done diff --git a/dot_config/niri/scripts/executable_niri-move.sh b/dot_config/niri/scripts/executable_niri-move.sh deleted file mode 100755 index e279201..0000000 --- a/dot_config/niri/scripts/executable_niri-move.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# Cascade move: column → workspace (incl. empty trailing) → monitor (cycles) -# usage: niri-move.sh up|down -set -euo pipefail -dir="${1:?usage: niri-move.sh up|down}" -opp=$([ "$dir" = down ] && echo up || echo down) - -cur=$(niri msg --json focused-window) -[ "$cur" = "null" ] && exit 0 - -out() { niri msg --json focused-output | jq -r '.name // "none"'; } -sig() { niri msg --json focused-window | jq -rc '[.workspace_id, (.layout.pos_in_scrolling_layout // null)]'; } - -# 1) reorder within the column -s0=$(sig); niri msg action "move-window-$dir" >/dev/null 2>&1 || true -[ "$(sig)" != "$s0" ] && exit 0 - -# 2) workspace in that direction (including the empty trailing one) -s0=$(sig); niri msg action "move-window-to-workspace-$dir" >/dev/null 2>&1 || true -[ "$(sig)" != "$s0" ] && exit 0 - -# 3) adjacent monitor… or wrap to the far-end monitor -o0=$(out); niri msg action "move-window-to-monitor-$dir" >/dev/null 2>&1 || true -[ "$(out)" != "$o0" ] && exit 0 -while :; do - prev=$(out) - niri msg action "move-window-to-monitor-$opp" >/dev/null 2>&1 || true - [ "$(out)" = "$prev" ] && break -done diff --git a/dot_config/symlink_television.tmpl b/dot_config/symlink_television.tmpl deleted file mode 100644 index f1675a5..0000000 --- a/dot_config/symlink_television.tmpl +++ /dev/null @@ -1 +0,0 @@ -{{ .chezmoi.sourceDir }}/television diff --git a/dot_config/symlink_yazi.tmpl b/dot_config/symlink_yazi.tmpl deleted file mode 100644 index d59a515..0000000 --- a/dot_config/symlink_yazi.tmpl +++ /dev/null @@ -1 +0,0 @@ -{{ .chezmoi.sourceDir }}/yazi diff --git a/dot_config/tmux-palette/commands.json b/dot_config/tmux-palette/commands.json deleted file mode 100644 index a9454ea..0000000 --- a/dot_config/tmux-palette/commands.json +++ /dev/null @@ -1,115 +0,0 @@ -[ - { - "icon": "", - "title": "Lazygit", - "shortcut": "Ctrl+Shift+G", - "description": "popup in the pane's directory", - "category": "Tools", - "aliases": ["lg"], - "action": { "tmux": "display-popup -E -w 90% -h 90% -d '#{pane_current_path}' lazygit" } - }, - { - "icon": "", - "title": "Yazi", - "shortcut": "Ctrl+Shift+F", - "description": "new window in the pane's directory", - "category": "Tools", - "aliases": ["fm"], - "action": { "tmux": "new-window -c '#{pane_current_path}' 'exec yazi'" } - }, - { - "icon": "", - "title": "btop", - "description": "resource monitor in a popup", - "category": "Tools", - "aliases": ["top", "htop"], - "action": { "popup": "btop" } - }, - { - "icon": "󰡨", - "title": "Lazydocker", - "description": "popup in the pane's directory", - "category": "Tools", - "aliases": ["dd"], - "action": { "tmux": "display-popup -E -w 90% -h 90% -d '#{pane_current_path}' lazydocker" } - }, - { - "icon": "", - "title": "mandible", - "description": "CLI reference for a tool, in a popup", - "category": "Tools", - "aliases": ["man"], - "action": { "popup": "~/.local/bin/mandible-pick" } - }, - { - "icon": "", - "title": "television", - "description": "tv channel picker in a new window", - "category": "Tools", - "aliases": ["tv"], - "action": { "tmux": "new-window -c '#{pane_current_path}' 'exec tv channels'" } - }, - { - "icon": "", - "title": "gitframe", - "description": "git diff viewer in a new window", - "category": "Tools", - "aliases": ["gf"], - "action": { "tmux": "new-window -c '#{pane_current_path}' 'exec gitframe'" } - }, - { - "icon": "", - "title": "Neovim Split", - "description": "nvim to the left, 60%", - "category": "Tools", - "aliases": ["nv"], - "action": { "tmux": "split-window -h -b -l 60% -c '#{pane_current_path}' 'exec nvim'" } - }, - { - "icon": "", - "title": "omp", - "description": "omp sessions: this session's agent, every running one, quit", - "category": "Tools", - "aliases": ["agent", "ai"], - "action": { "palette": "omp" } - }, - { - "icon": "", - "title": "Shell History (atuin)", - "description": "atuin-pick in a split below", - "category": "Tools", - "aliases": ["hist"], - "action": { "tmux": "split-window -v -l 25% -c '#{pane_current_path}' 'exec atuin-pick'" } - }, - { - "icon": "", - "title": "Project Tasks", - "description": "pj: install, dev, make, uv, scripts", - "category": "Tools", - "shortcut": "Ctrl+Shift+P", - "aliases": ["pj", "run"], - "action": { "palette": "tasks" } - }, - { - "icon": "󱂬", - "title": "Sessions (sessionx)", - "description": "fuzzy switch, create, rename, kill", - "category": "Sessions", - "shortcut": "Ctrl+Shift+O", - "action": { "tmux": "run-shell '~/.config/tmux/plugins/tmux-sessionx/scripts/sessionx.sh'" } - }, - { - "icon": "", - "title": "Save Sessions", - "description": "tmux-resurrect snapshot now", - "category": "Sessions", - "action": { "tmux": "run-shell '~/.config/tmux/plugins/tmux-resurrect/scripts/save.sh'" } - }, - { - "icon": "", - "title": "Restore Sessions", - "description": "tmux-resurrect: last snapshot", - "category": "Sessions", - "action": { "tmux": "run-shell '~/.config/tmux/plugins/tmux-resurrect/scripts/restore.sh'" } - } -] diff --git a/dot_config/tmux-palette/hidden.json b/dot_config/tmux-palette/hidden.json deleted file mode 100644 index 6ec4785..0000000 --- a/dot_config/tmux-palette/hidden.json +++ /dev/null @@ -1 +0,0 @@ -["Switch Theme..."] diff --git a/dot_config/tmux-palette/palettes/omp.json b/dot_config/tmux-palette/palettes/omp.json deleted file mode 100644 index 983084b..0000000 --- a/dot_config/tmux-palette/palettes/omp.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "omp", - "command": "~/.local/bin/pj-palette --omp", - "grouped": true, - "emptyText": "No omp sessions" -} diff --git a/dot_config/tmux-palette/palettes/tasks.json b/dot_config/tmux-palette/palettes/tasks.json deleted file mode 100644 index 585df1e..0000000 --- a/dot_config/tmux-palette/palettes/tasks.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "title": "Project Tasks", - "command": "~/.local/bin/pj-palette", - "grouped": true, - "emptyText": "No tasks in this project" -} diff --git a/dot_config/tmux-palette/shortcuts.json b/dot_config/tmux-palette/shortcuts.json deleted file mode 100644 index bd64d2c..0000000 --- a/dot_config/tmux-palette/shortcuts.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "Split Horizontal": "Ctrl+Shift+L", - "Split Vertical": "Ctrl+Shift+J", - "Close Pane": "Ctrl+Shift+X", - "Zoom / Unzoom": "Ctrl+Shift+Z", - "Enter Copy Mode": "Ctrl+Shift+PgUp", - "New Window": "Ctrl+Shift+T", - "Next Window": "Ctrl+Shift+K", - "Previous Window": "Ctrl+Shift+H", - "Rename Window": "Ctrl+Shift+R", - "Close Window": "Ctrl+Shift+W", - "Choose Session": "Ctrl+Shift+S", - "New Session": "Ctrl+Shift+N", - "Detach": "Ctrl+Shift+Q", - "Reload Config": "Ctrl+Shift+Alt+," -} diff --git a/dot_config/tmux-palette/theme.json b/dot_config/tmux-palette/theme.json deleted file mode 100644 index dfdeef4..0000000 --- a/dot_config/tmux-palette/theme.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "bg": "#16181a", - "panel": "#1e2124", - "selected": "#243348", - "fg": "#ffffff", - "muted": "#7b8496", - "accent": "#5ea1ff" -} diff --git a/dot_config/tmux/executable_tab-label.sh b/dot_config/tmux/executable_tab-label.sh deleted file mode 100755 index e24888e..0000000 --- a/dot_config/tmux/executable_tab-label.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -# ~/.config/tmux/tab-label.sh — the non-editor tab label, kitty tab_bar.py's -# rule: the repo the pane's cwd belongs to (dir name if no repo, ~ at home). -# Editors (the open file) are handled in tmux.conf's automatic-rename-format. -# Args: $1 pane_current_path $2 window_id - -path=$1 window=$2 - -if [[ $path == "$HOME" ]]; then - label='~' -else - dir=$path - while [[ -n $dir && ! -e $dir/.git ]]; do dir=${dir%/*}; done - root=${dir:-$path} - label=${root##*/} -fi -printf '%s' "$label" - -# tmux runs #() jobs async and only re-checks a window's name on pane output, -# so after a `cd` the tab would keep the old label until the next keystroke. -# Re-arming automatic-rename makes tmux re-check now and pick up this output. -if [[ -n $window && $(tmux display -p -t "$window" '#W' 2>/dev/null) != *"${label:0:26}"* ]]; then - tmux set -w -t "$window" automatic-rename on >/dev/null 2>&1 & -fi diff --git a/dot_config/tmux/tmux-nerd-font-window-name.yml b/dot_config/tmux/tmux-nerd-font-window-name.yml deleted file mode 100644 index e9c1982..0000000 --- a/dot_config/tmux/tmux-nerd-font-window-name.yml +++ /dev/null @@ -1,28 +0,0 @@ -config: - fallback-icon: "󰣙" # show when no definition is found - multi-pane-icon: "" # show when window has multiple panes (blank by default) - show-name: false # the label comes from automatic-rename-format in tmux.conf (cwd, as in kitty) - icon-position: "left" # show the icon to the "left" or "right" of the window name (defaults to left) -icons: - mprocs: "󰄪" - mm: "" - macmon: "" - make: "" - zsh: "󰞷" - nvim: "" - devbox: "" - psql: "" - yazi: "" - lazygit: "" - gh: "" - tv: "" - docker: "󰡨" - bun: "" - node: "" - npm: "" - pnpm: "" - go: "" - bunx: "󰄪" - claude: "󱜙" - omp: "" - gitframe: "" diff --git a/dot_config/tmux/tmux.conf b/dot_config/tmux/tmux.conf deleted file mode 100644 index a4773a0..0000000 --- a/dot_config/tmux/tmux.conf +++ /dev/null @@ -1,229 +0,0 @@ -# Prefix: ctrl+b (Ghostty's ctrl+shift chords send it as \x02). ctrl+space -# is not a prefix: it opens tmux-palette (root table, see Plugins). -set -g prefix C-b -set -gu prefix2 -unbind -q C-Space -bind -N "Send prefix" C-b send-prefix - -set-option -g renumber-windows on -set -g base-index 1 -setw -g pane-base-index 1 - -# Config and help -bind -N "Reload configuration" q source-file ~/.config/tmux/tmux.conf \; display "Configuration reloaded" -bind -N "Show Tmux keybindings" ? display-popup -E -w 80% -h 70% -T "Tmux keybindings" "if command -v omarchy-menu-tmux-keybindings >/dev/null; then omarchy-menu-tmux-keybindings --print; else tmux list-keys -N; fi | less -R" - -# Vi mode for copy -setw -g mode-keys vi -bind -N "Begin selection" -T copy-mode-vi v send -X begin-selection -bind -N "Copy selection" -T copy-mode-vi y send -X copy-selection-and-cancel -bind -N "Search scrollback" / copy-mode \; command-prompt -p "search up:" "send -X search-backward '%%'" - -# Pane Controls -bind -N "Split pane vertically" -n M-Enter split-window -v -c "#{pane_current_path}" -bind -N "Split pane horizontally" -n M-S-Enter split-window -h -c "#{pane_current_path}" -bind -N "Kill pane" -n M-Escape kill-pane - -bind -N "Split pane vertically" h split-window -v -c "#{pane_current_path}" -bind -N "Split pane horizontally" v split-window -h -c "#{pane_current_path}" -bind -N "Kill pane" x kill-pane - -bind -N "Focus pane left" -n C-M-Left select-pane -L -bind -N "Focus pane right" -n C-M-Right select-pane -R -bind -N "Focus pane up" -n C-M-Up select-pane -U -bind -N "Focus pane down" -n C-M-Down select-pane -D - -# ctrl+h/j/k/l: vim-aware pane navigation, the tmux half of nvim's -# config.pane_nav. In an nvim/vim/fzf pane the key is forwarded so nvim moves -# between its own splits and, at its outer edge, hands off with -# `tmux select-pane -t $TMUX_PANE`; elsewhere tmux moves directly. "Is vim" is -# smart-splits' @pane-is-vim pane option or the pane's foreground command, read -# as a format (no ps fork per keypress). Ghostty passes these keys through -# (keybind = clear); prefix + ctrl+l is the clear-screen escape hatch. -bind -N "Focus pane left (vim-aware)" -n C-h if -F '#{||:#{@pane-is-vim},#{m/r:^(n?vim|vim|fzf)$,#{pane_current_command}}}' 'send-keys C-h' 'select-pane -L' -bind -N "Focus pane down (vim-aware)" -n C-j if -F '#{||:#{@pane-is-vim},#{m/r:^(n?vim|vim|fzf)$,#{pane_current_command}}}' 'send-keys C-j' 'select-pane -D' -bind -N "Focus pane up (vim-aware)" -n C-k if -F '#{||:#{@pane-is-vim},#{m/r:^(n?vim|vim|fzf)$,#{pane_current_command}}}' 'send-keys C-k' 'select-pane -U' -bind -N "Focus pane right (vim-aware)" -n C-l if -F '#{||:#{@pane-is-vim},#{m/r:^(n?vim|vim|fzf)$,#{pane_current_command}}}' 'send-keys C-l' 'select-pane -R' -bind -N "Focus pane left" -T copy-mode-vi C-h select-pane -L -bind -N "Focus pane down" -T copy-mode-vi C-j select-pane -D -bind -N "Focus pane up" -T copy-mode-vi C-k select-pane -U -bind -N "Focus pane right" -T copy-mode-vi C-l select-pane -R -bind -N "Clear screen" C-l send-keys C-l - -bind -N "Resize pane left" -n C-M-S-Left resize-pane -L 5 -bind -N "Resize pane down" -n C-M-S-Down resize-pane -D 5 -bind -N "Resize pane up" -n C-M-S-Up resize-pane -U 5 -bind -N "Resize pane right" -n C-M-S-Right resize-pane -R 5 - -# Window navigation -bind -N "Rename window" r command-prompt -I "#W" "rename-window -- '%%'" -bind -N "Create window" c new-window -c "#{pane_current_path}" -bind -N "Kill window" k kill-window - -bind -N "Switch to window 1" -n M-1 select-window -t 1 -bind -N "Switch to window 2" -n M-2 select-window -t 2 -bind -N "Switch to window 3" -n M-3 select-window -t 3 -bind -N "Switch to window 4" -n M-4 select-window -t 4 -bind -N "Switch to window 5" -n M-5 select-window -t 5 -bind -N "Switch to window 6" -n M-6 select-window -t 6 -bind -N "Switch to window 7" -n M-7 select-window -t 7 -bind -N "Switch to window 8" -n M-8 select-window -t 8 -bind -N "Switch to window 9" -n M-9 select-window -t 9 - -bind -N "Previous window" -n M-Left select-window -t -1 -bind -N "Next window" -n M-Right select-window -t +1 -bind -N "Move window left" -n M-S-Left swap-window -t -1 \; select-window -t -1 -bind -N "Move window right" -n M-S-Right swap-window -t +1 \; select-window -t +1 - -# Session controls -bind -N "Rename session" R command-prompt -I "#S" "rename-session -- '%%'" -bind -N "Create session" C new-session -c "#{pane_current_path}" -bind -N "Kill session" K kill-session -bind -N "Previous session" P switch-client -p -bind -N "Next session" N switch-client -n - -bind -N "Previous session" -n M-Up switch-client -p -bind -N "Next session" -n M-Down switch-client -n - -# General -set -g default-terminal "tmux-256color" -set -ag terminal-overrides ",*:RGB" -set -g mouse on -set -g base-index 1 -setw -g pane-base-index 1 -set -g renumber-windows on -set -g history-limit 50000 -set -g escape-time 0 -set -g focus-events on -# Yazi inside tmux: OSC 52 clipboard, image passthrough, and the outer -# TERM/TERM_PROGRAM so yazi detects Ghostty/kitty graphics. Never bind M-[: -# tmux would eat the ESC [ of yazi's terminal-query replies. -set -g set-clipboard on -set -g allow-passthrough on -set -ga update-environment TERM -set -ga update-environment TERM_PROGRAM -setw -g aggressive-resize on -# Killing a session switches only to a *detached* one, else detaches: with -# one session per Ghostty window, `off` would land on (and mirror) a session -# another window is showing. -set -g detach-on-destroy no-detached -set -g extended-keys on -set -g extended-keys-format csi-u -set -ag terminal-features "xterm-kitty:extkeys" -# shift+enter (Ghostty sends ESC[13;2u): pass it through as ESC[13;2u for -# coding agents (omp, claude) to insert a newline. With extended-keys `on`, -# tmux would flatten it to a plain Enter for any app that never asked for -# extended keys. -bind -N "Shift+Enter as CSI-u" -n S-Enter send-keys -H 1b 5b 31 33 3b 32 75 -set -as terminal-features ",*:clipboard" -set -sg escape-time 10 - -# Status bar -set -g status-position top -set -g status-interval 5 -set -g status-left-length 30 -set -g status-right-length 50 -set -g window-status-separator "" -set -gw automatic-rename on -# #{window_icon} is filled in by tmux-nerd-font-window-name (icons from -# tmux-nerd-font-window-name.yml); the label follows kitty's tab_bar.py. An -# editor shows the file from the title nvim sets (" | ", see -# nvim's astrocore custom_title), read straight from #{pane_title} so a buffer -# switch renames the tab at once; otherwise tab-label.sh prints the repo of the -# pane's cwd (an async #() job; it re-arms automatic-rename when the tab is -# stale, so a `cd` relabels without waiting for more pane output). -set -gw automatic-rename-format '#{window_icon} #{=/27/…:#{?#{&&:#{m/r:^(n?vim|vim|nvim-qt|hx|helix)$,#{pane_current_command}},#{m/r:^[^/|]+ \| ,#{pane_title}}},#{s/ \| .*$//:pane_title},#(~/.config/tmux/tab-label.sh #{q:pane_current_path} #{window_id})}}' -set -g set-titles on -# The terminal (Ghostty) window title is the session name: one session per -# Ghostty window, so compositor groups/tabs list sessions, not host:window. -set -g set-titles-string '#S' - -# Theme — kitty's powerline/angled tab bar: the current window is an -# accent-tinted plate (accent mixed 20% into the background) with the accent -# as its text, the rest sit flush with the background in muted text. Fixed -# cyberdream palette, shared with Ghostty, nvim, yazi and television so every -# machine (Linux, mac, goliath) looks the same. -set -g @tab-bg "#16181a" -set -g @tab-fg "#7b8496" -set -g @tab-active-bg "#243348" -set -g @tab-active-fg "#5ea1ff" - -set -g status-style "bg=default,fg=#{@tab-fg}" -# bg=default inside a tab format means "the window-status-*-style bg", not the -# terminal's, so these must stay default for the tabs to be transparent. Set -# explicitly: a config reload never clears a value a removed plugin left -# behind (tmux-dotbar painted window-status-style bg=#0B0E14). -set -g window-status-style default -set -g window-status-current-style default -set -g window-status-last-style default -set -g window-status-activity-style default -set -g window-status-bell-style default -# Tabs start right after the session pill (status-justify left; a reload -# would otherwise keep a stale value such as dotbar's absolute-centre), and -# the pill's arrow points into the first tab's plate. -set -g status-justify left -set -g status-left "#[fg=#{@tab-bg},bg=#{@tab-active-fg},bold] #S #[fg=#{@tab-active-fg},nobold]#{?#{==:#{active_window_index},#{base-index}},#[bg=#{@tab-active-bg}],#[bg=default]}" -set -g status-right "#[fg=#{@tab-active-fg}]#{?pane_in_mode,COPY ,}#{?client_prefix,PREFIX ,}#{?window_zoomed_flag,ZOOM ,}#[fg=#{@tab-fg}]#h " -# Inactive tabs are bg=default so the terminal's transparency shows through, -# as in kitty (tab_bar_background none). kitty's separator rule: a solid -#  into a differently colored neighbour, thin  between two inactive -# tabs, none after the last. The arrow into the current tab is painted in -# @tab-bg, the window background (Ghostty's cyberdream background, the same -# hex), so it blends into the window. (Plain  is -# one of Ghostty's built-in sprites and fills the whole cell even with -# adjust-cell-height; inverse glyphs such as  come from the font and -# leave gaps.) -set -g window-status-format "#[fg=#{@tab-fg},bg=default] #I #W #{?next_window_active,#[fg=#{@tab-bg}#,bg=#{@tab-active-bg}],#{?window_end_flag,,}}" -set -g window-status-current-format "#[fg=#{@tab-active-fg},bg=#{@tab-active-bg},bold] #I #W #[fg=#{@tab-active-bg},bg=default,nobold]" -set -g pane-border-style "fg=brightblack" -set -g pane-active-border-style "fg=#{@tab-active-fg}" -set -g message-style "bg=default,fg=#{@tab-active-fg}" -set -g message-command-style "bg=default,fg=#{@tab-active-fg}" -set -g mode-style "bg=#{@tab-active-bg},fg=#{@tab-active-fg}" -setw -g clock-mode-colour blue - -# Plugins (tpm, cloned by .chezmoiexternal.toml). prefix + I installs, -# prefix + U updates, prefix + alt + u removes unlisted ones. -set -g @plugin 'tmux-plugins/tpm' -set -g @plugin 'tmux-plugins/tmux-sensible' -set -g @plugin 'joshmedeski/tmux-nerd-font-window-name' -set -g @plugin 'tmux-plugins/tmux-resurrect' -set -g @plugin 'tmux-plugins/tmux-continuum' -set -g @plugin 'omerxx/tmux-sessionx' -set -g @plugin 'eduwass/tmux-palette' - -# tmux-palette: Raycast-style command palette on ctrl+space (no prefix; needs -# bun). User config (commands ported from kitty, cyberdream theme, Ghostty -# shortcut labels) lives in ~/.config/tmux-palette/. -set -g @palette-key 'C-Space' -# pj's task runner as a palette (pj-palette): quick actions + project tasks, -# one-offs in a bottom split, dev servers / compose up in a background -# : session popup. prefix + t (Ghostty ctrl+shift+p / +space). -bind -N "Project tasks (pj)" t run-shell "~/.config/tmux/plugins/tmux-palette/bin/tmux-palette.sh tasks" - -# Direct launchers, the kitty ctrl+shift chords (Ghostty sends prefix + key). -# Programs are exec'd so the tab icon is the program's. -bind -N "Yazi in a new window" y new-window -c "#{pane_current_path}" "exec yazi" -bind -N "Neovim in a new window" e new-window -c "#{pane_current_path}" "exec nvim" -bind -N "Lazygit popup" g display-popup -E -w 90% -h 90% -d "#{pane_current_path}" lazygit -# omp in a background session :omp shown in a popup (pj-palette --bg, -# listed under Running in the tasks palette). Inside any such popup, prefix + a -# hides it instead, so ctrl+shift+a toggles. -bind -N "omp popup (toggle)" a if -F "#{@pj_task}" detach-client \ - 'run-shell -b "~/.local/bin/pj-palette --bg #{q:session_name}:omp #{q:pane_current_path} omp"' - -# sessionx: fuzzy session switcher/creator on prefix + o (Ghostty -# ctrl+shift+o). A query with no match goes to zoxide; uses fzf --tmux. -set -g @sessionx-bind 'o' -set -g @sessionx-zoxide-mode 'on' -set -g @sessionx-fzf-builtin-tmux 'on' - -# Persistence: continuum saves every 10 min (resurrect: prefix + C-s save, -# prefix + C-r restore) and restores the last save when the server starts, -# i.e. the first Ghostty window after login or reboot. -set -g @resurrect-capture-pane-contents 'on' -set -g @continuum-save-interval '10' -set -g @continuum-restore 'on' - -# Keep at the very bottom. -run '~/.config/tmux/plugins/tpm/tpm' diff --git a/dot_config/tmux/executable_niri-title.sh b/dot_local/bin/executable_tmux-niri-title similarity index 87% rename from dot_config/tmux/executable_niri-title.sh rename to dot_local/bin/executable_tmux-niri-title index c59c886..e4ade42 100644 --- a/dot_config/tmux/executable_niri-title.sh +++ b/dot_local/bin/executable_tmux-niri-title @@ -1,6 +1,6 @@ #!/bin/sh -# ~/.config/tmux/niri-title.sh -# Builds the context segment for tmux set-titles-string (consumed by Niri). +# ~/.local/bin/tmux-niri-title — POSIX sh, runs on Linux and macOS. +# Builds the context segment for tmux set-titles-string (e.g. a Niri title). # Priority: ssh target > nvim file > git branch > cwd basename # Args: $1 pane_current_command $2 pane_current_path $3 pane_tty $4 pane_title diff --git a/run_onchange_after_install-yazi-plugins.sh.tmpl b/run_onchange_after_install-yazi-plugins.sh.tmpl index 01f9163..41ed347 100755 --- a/run_onchange_after_install-yazi-plugins.sh.tmpl +++ b/run_onchange_after_install-yazi-plugins.sh.tmpl @@ -1,8 +1,9 @@ #!/bin/sh -# Install the yazi plugins pinned in yazi/package.toml whenever it changes. -# ~/.config/yazi links to the source dir, so they land in yazi/plugins/ -# (gitignored, except the vendored bunny.yazi). -# package.toml hash: {{ include "yazi/package.toml" | sha256sum }} +# Install the yazi plugins pinned in ~/.config/yazi/package.toml whenever it +# changes. ~/.config/yazi is a git-repo external (prdlk/yazi); plugins land in +# its plugins/ dir (gitignored there, except the vendored bunny.yazi). +{{- $pkg := joinPath .chezmoi.homeDir ".config/yazi/package.toml" }} +# package.toml hash: {{ if stat $pkg }}{{ include $pkg | sha256sum }}{{ end }} set -eu command -v ya >/dev/null 2>&1 || exit 0 [ -f "${XDG_CONFIG_HOME:-$HOME/.config}/yazi/package.toml" ] || exit 0 diff --git a/television/cable/.keep b/television/cable/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/television/cable/agents.toml b/television/cable/agents.toml deleted file mode 100644 index 0be8893..0000000 --- a/television/cable/agents.toml +++ /dev/null @@ -1,67 +0,0 @@ -[metadata] -name = "agents" -description = """ -AI coding agent CLIs found on PATH. Enter starts the agent's TUI in the current -directory. -""" -requirements = [] - -# Entries are "\t\t". Only agents -# whose binary resolves on PATH are listed; add a row to the table to support -# another one. The launch command may carry flags (claude, as in `ai`). -[source] -command = ''' -while IFS='|' read -r bin cmd desc; do - command -v "$bin" >/dev/null 2>&1 && - printf '%-13s %s\t%s\t%s\n' "$bin" "$desc" "$cmd" "$bin" -done <<'EOF' -omp|omp|oh-my-pi coding agent -claude|claude --dangerously-skip-permissions|Claude Code (Anthropic) -codex|codex|Codex CLI (OpenAI) -opencode|opencode|OpenCode (sst) -crush|crush|Crush (Charm) -pi|pi|pi coding agent -cursor-agent|cursor-agent|Cursor Agent CLI -copilot|copilot|GitHub Copilot CLI -gemini|gemini|Gemini CLI (Google) -agy|agy|Antigravity CLI (Google) -grok|grok|Grok CLI (xAI) -muse|muse|Muse Code (Meta) -ori|ori|Ori (OpenRouter) -hermes|hermes|Hermes Agent (Nous Research) -amp|amp|Amp (Sourcegraph) -droid|droid|Droid (Factory) -qwen|qwen|Qwen Code (Alibaba) -kimi|kimi|Kimi CLI (Moonshot) -goose|goose|goose (Block) -aider|aider|aider -auggie|auggie|Auggie (Augment Code) -kiro-cli|kiro-cli|Kiro CLI (AWS) -cn|cn|Continue CLI -fractal|fractal|fractal -EOF -''' -shell = "bash" -display = "{split:\\t:0}" -output = "{split:\\t:1}" - -[preview] -command = ''' -p=$(command -v '{split:\t:2}') -printf 'command %s\npath %s\n' '{split:\t:1}' "$p" -r=$(readlink -f "$p") -[ "$r" != "$p" ] && printf 'resolves %s\n' "$r" -# ~/.local/bin wrappers install the agent through mise on first run. -tool=$(grep -o 'mise x "[^"]*"' "$r" 2>/dev/null | cut -d'"' -f2) -[ -n "$tool" ] && printf 'mise %s\n' "$tool" -''' -shell = "bash" - -[keybindings] -enter = "actions:launch" - -[actions.launch] -description = "Start the agent's TUI" -command = "{split:\\t:1}" -shell = "bash" -mode = "execute" diff --git a/television/cable/alias.toml b/television/cable/alias.toml deleted file mode 100644 index 62862cb..0000000 --- a/television/cable/alias.toml +++ /dev/null @@ -1,17 +0,0 @@ -[metadata] -name = "alias" -description = "A channel to select from shell aliases" - -[source] -# you may need to adjust the command depending on your shell -command = "$SHELL -ic 'alias'" -output = "{split:=:0}" - -[preview] -command = "$SHELL -ic 'alias' | grep -E '^(alias )?{split:=:0}='" - -[ui.preview_panel] -border_type = "none" -scrollbar = false -padding = { left = 2, right = 1, top = 0, bottom = 0 } -size = 30 diff --git a/television/cable/bash-history.toml b/television/cable/bash-history.toml deleted file mode 100644 index 8dc8d58..0000000 --- a/television/cable/bash-history.toml +++ /dev/null @@ -1,9 +0,0 @@ -[metadata] -name = "bash-history" -description = "A channel to select from your bash history" -requirements = ["bash"] - -[source] -command = "sed '1!G;h;$!d' ${HISTFILE:-${HOME}/.bash_history} | awk '!seen[$0]++'" -no_sort = true -frecency = false diff --git a/television/cable/brew-packages.toml b/television/cable/brew-packages.toml deleted file mode 100644 index 548f5f4..0000000 --- a/television/cable/brew-packages.toml +++ /dev/null @@ -1,30 +0,0 @@ -[metadata] -name = "brew-packages" -description = "List and manage Homebrew packages" -requirements = ["brew"] - -[source] -command = [ - { name = "Formulae", run = "brew list --formula" }, - { name = "Casks", run = "brew list --cask" }, -] - -[preview] -command = "brew info '{}'" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-u = "actions:upgrade" -ctrl-d = "actions:uninstall" - -[actions.upgrade] -description = "Upgrade the selected package" -command = "brew upgrade {}" -mode = "execute" - -[actions.uninstall] -description = "Uninstall the selected package" -command = "brew uninstall {}" -mode = "execute" diff --git a/television/cable/cargo-commands.toml b/television/cable/cargo-commands.toml deleted file mode 100644 index fde3b8d..0000000 --- a/television/cable/cargo-commands.toml +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -name = "cargo-commands" -description = "List available cargo commands and extensions" -requirements = ["cargo"] - -[source] -command = "cargo --list 2>/dev/null | tail -n +2 | awk '{print $1}'" - -[preview] -command = "cargo {} --help 2>/dev/null | head -50" - -[ui] -layout = "portrait" -preview_panel = { size = 60, border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[keybindings] -enter = "actions:run" - -[actions.run] -description = "Run the selected cargo command" -command = "cargo {}" -mode = "execute" diff --git a/television/cable/cargo-crates.toml b/television/cable/cargo-crates.toml deleted file mode 100644 index 99302d6..0000000 --- a/television/cable/cargo-crates.toml +++ /dev/null @@ -1,17 +0,0 @@ -[metadata] -name = "cargo-crates" -description = "List installed cargo crates" -requirements = ["cargo"] - -[source] -command = "cargo install --list 2>/dev/null | grep -v '^ ' | sed 's/:$//'" -display = "{split: :0} {split: :1}" -output = "{split: :0}" - -[preview] -command = "cargo install --list 2>/dev/null | sed -n '/^{split: :0} /,/^[^ ]/p' | head -20" - -[actions.uninstall] -description = "Uninstall the selected crate" -command = "cargo uninstall '{split: :0}'" -mode = "execute" diff --git a/television/cable/channels.toml b/television/cable/channels.toml deleted file mode 100644 index 6ad4c69..0000000 --- a/television/cable/channels.toml +++ /dev/null @@ -1,19 +0,0 @@ -[metadata] -name = "channels" -description = "Select a television channel" -requirements = ["tv", "bat"] - -[source] -command = ["tv list-channels"] - -[preview] -command = "bat -pn --color always ${TELEVISION_CONFIG:-${XDG_CONFIG_HOME:-$HOME/.config}/television}/cable/{}.toml" -shell = "bash" - -[keybindings] -enter = "actions:channel-enter" - -[actions.channel-enter] -description = "Enter a television channel" -command = "tv {} --inline" -mode = "execute" diff --git a/television/cable/crontab.toml b/television/cable/crontab.toml deleted file mode 100644 index 0d3c4d4..0000000 --- a/television/cable/crontab.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "crontab" -description = "List and manage crontab entries" - -[source] -command = "crontab -l 2>/dev/null | grep -v '^#' | grep -v '^$'" -no_sort = true -frecency = false - -[preview] -command = '''echo 'Schedule: {split: :..5}' && echo '' && echo 'Command:' && echo '{split: :5..}' ''' - -[ui] -layout = "portrait" -preview_panel = { size = 30, border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[actions.edit] -description = "Open crontab for editing" -command = "crontab -e" -mode = "execute" diff --git a/television/cable/dirs.toml b/television/cable/dirs.toml deleted file mode 100644 index 515d000..0000000 --- a/television/cable/dirs.toml +++ /dev/null @@ -1,26 +0,0 @@ -[metadata] -name = "dirs" -description = "A channel to select from directories" -requirements = ["fd"] - -[source] -command = [ - { name = "Default", run = "fd -t d" }, - { name = "Hidden", run = "fd -t d --hidden" }, -] - -[preview] -command = "ls -la --color=always '{}'" - -[keybindings] -shortcut = "f2" - -[actions.cd] -description = "Open a shell in the selected directory" -command = "cd {} && $SHELL" -mode = "execute" - -[actions.goto_parent_dir] -description = "Re-opens tv in the parent directory" -command = "tv dirs .. --inline" -mode = "execute" diff --git a/television/cable/docker-compose.toml b/television/cable/docker-compose.toml deleted file mode 100644 index 2379dcc..0000000 --- a/television/cable/docker-compose.toml +++ /dev/null @@ -1,32 +0,0 @@ -[metadata] -name = "docker-compose" -description = "Manage Docker Compose services" -requirements = ["docker"] - -[source] -command = "docker compose ps --format '{{.Name}}\t{{.Service}}\t{{.Status}}'" -display = "{split:\t:1} ({split:\t:2})" -output = "{split:\t:1}" - -[preview] -command = "docker compose logs --tail=30 --no-log-prefix '{split:\t:1}'" - -[actions.up] -description = "Start the selected service" -command = "docker compose up -d '{split:\t:1}'" -mode = "fork" - -[actions.down] -description = "Stop and remove the selected service" -command = "docker compose down '{split:\t:1}'" -mode = "fork" - -[actions.restart] -description = "Restart the selected service" -command = "docker compose restart '{split:\t:1}'" -mode = "fork" - -[actions.logs] -description = "Follow logs of the selected service" -command = "docker compose logs -f '{split:\t:1}'" -mode = "execute" diff --git a/television/cable/docker-containers.toml b/television/cable/docker-containers.toml deleted file mode 100644 index a5f2953..0000000 --- a/television/cable/docker-containers.toml +++ /dev/null @@ -1,56 +0,0 @@ -[metadata] -name = "docker-containers" -description = "List and manage Docker containers" -requirements = ["docker", "jq"] - -[source] -command = [ - { name = "Running", run = "docker ps --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}'" }, - { name = "All", run = "docker ps -a --format '{{.Names}}\\t{{.Image}}\\t{{.Status}}'" }, -] -display = "{split:\\t:0} ({split:\\t:2})" -output = "{split:\\t:0}" - -[preview] -command = "docker inspect '{split:\\t:0}' | jq -C '.[0] | {Name, State, Config: {Image: .Config.Image, Cmd: .Config.Cmd}, NetworkSettings: {IPAddress: .NetworkSettings.IPAddress}}'" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-s = "actions:start" -f2 = "actions:stop" -ctrl-r = "actions:restart" -ctrl-l = "actions:logs" -ctrl-e = "actions:exec" -ctrl-d = "actions:remove" - -[actions.start] -description = "Start the selected container" -command = "docker start '{split:\\t:0}'" -mode = "fork" - -[actions.stop] -description = "Stop the selected container" -command = "docker stop '{split:\\t:0}'" -mode = "fork" - -[actions.restart] -description = "Restart the selected container" -command = "docker restart '{split:\\t:0}'" -mode = "fork" - -[actions.logs] -description = "Follow logs of the selected container" -command = "docker logs -f '{split:\\t:0}'" -mode = "execute" - -[actions.exec] -description = "Execute shell in the selected container" -command = "docker exec -it '{split:\\t:0}' /bin/sh" -mode = "execute" - -[actions.remove] -description = "Remove the selected container" -command = "docker rm '{split:\\t:0}'" -mode = "execute" diff --git a/television/cable/docker-images.toml b/television/cable/docker-images.toml deleted file mode 100644 index a7948ab..0000000 --- a/television/cable/docker-images.toml +++ /dev/null @@ -1,34 +0,0 @@ -[metadata] -name = "docker-images" -description = "A channel to select from Docker images" -requirements = ["docker", "jq"] - -[source] -command = "docker images --format '{{.Repository}}:{{.Tag}} {{.ID}}'" -output = "{split: :-1}" - -[preview] -command = "docker image inspect '{split: :-1}' | jq -C" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-r = "actions:run" -ctrl-d = "actions:remove" -ctrl-s = "actions:shell" - -[actions.run] -description = "Run a container from the selected image" -command = "docker run -it '{split: :-1}'" -mode = "execute" - -[actions.shell] -description = "Run a shell in the selected image" -command = "docker run -it '{split: :-1}' /bin/sh" -mode = "execute" - -[actions.remove] -description = "Remove the selected image" -command = "docker rmi '{split: :-1}'" -mode = "execute" diff --git a/television/cable/docker-networks.toml b/television/cable/docker-networks.toml deleted file mode 100644 index b57b2c5..0000000 --- a/television/cable/docker-networks.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "docker-networks" -description = "List and manage Docker networks" -requirements = ["docker", "jq"] - -[source] -command = "docker network ls --format '{{.Name}}\t{{.Driver}}\t{{.Scope}}'" -display = "{split:\t:0} ({split:\t:1}, {split:\t:2})" -output = "{split:\t:0}" - -[preview] -command = "docker network inspect '{split:\t:0}' | jq -C '.[0] | {Name, Driver, Scope, IPAM, Containers: (.Containers // {} | to_entries | map({name: .value.Name, ipv4: .value.IPv4Address}))}'" - -[ui] -layout = "portrait" - -[actions.remove] -description = "Remove the selected network" -command = "docker network rm '{split:\t:0}'" -mode = "execute" diff --git a/television/cable/docker-volumes.toml b/television/cable/docker-volumes.toml deleted file mode 100644 index 03b8e6f..0000000 --- a/television/cable/docker-volumes.toml +++ /dev/null @@ -1,25 +0,0 @@ -[metadata] -name = "docker-volumes" -description = "List and manage Docker volumes" -requirements = ["docker", "jq"] - -[source] -command = "docker volume ls --format '{{.Name}}\t{{.Driver}}'" -display = "{split:\t:0} ({split:\t:1})" -output = "{split:\t:0}" - -[preview] -command = "docker volume inspect '{split:\t:0}' | jq -C '.[0]'" - -[ui] -layout = "portrait" - -[actions.remove] -description = "Remove the selected volume" -command = "docker volume rm '{split:\t:0}'" -mode = "execute" - -[actions.inspect] -description = "Inspect the selected volume in a pager" -command = "docker volume inspect '{split:\t:0}' | jq -C '.[0]' | less -R" -mode = "execute" diff --git a/television/cable/dotfiles.toml b/television/cable/dotfiles.toml deleted file mode 100644 index 10d21de..0000000 --- a/television/cable/dotfiles.toml +++ /dev/null @@ -1,19 +0,0 @@ -[metadata] -name = "dotfiles" -description = "A channel to select from your user's dotfiles" -requirements = ["fd", "bat"] - -[source] -command = "fd -t f . $HOME/.config" - -[preview] -command = "bat -n --color=always '{}'" - -[keybindings] -enter = "actions:edit" - -[actions.edit] -description = "Edit the selected dotfile" -command = "${EDITOR:-vim} {}" -shell = "bash" -mode = "execute" diff --git a/television/cable/downloads.toml b/television/cable/downloads.toml deleted file mode 100644 index 939e218..0000000 --- a/television/cable/downloads.toml +++ /dev/null @@ -1,31 +0,0 @@ -[metadata] -name = "downloads" -description = "Browse recent files in Downloads folder" -requirements = ["fd", "bat"] - -[source] -command = "fd -t f . ~/Downloads 2>/dev/null | head -200" - -[preview] -command = "bat -n --color=always '{}' 2>/dev/null || file '{}'" -env = { BAT_THEME = "ansi" } - -[keybindings] -enter = "actions:open" -ctrl-d = "actions:delete" -ctrl-m = "actions:move" - -[actions.open] -description = "Open the selected file with default application" -command = "xdg-open {} 2>/dev/null || open {}" -mode = "fork" - -[actions.delete] -description = "Delete the selected file" -command = "rm -i {}" -mode = "execute" - -[actions.move] -description = "Move the selected file to current directory" -command = "mv {} ." -mode = "fork" diff --git a/television/cable/env.toml b/television/cable/env.toml deleted file mode 100644 index c654b2f..0000000 --- a/television/cable/env.toml +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -name = "env" -description = "A channel to select from environment variables" - -[source] -command = "printenv" -output = "{split:=:1..}" # output the value - -[preview] -command = "echo '{split:=:1..}'" - -[ui] -layout = "portrait" -preview_panel = { size = 20, header = "{split:=:0}", border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[keybindings] -shortcut = "f3" - -[actions.name] -description = "Output the variable name instead of the value" -command = "echo '{split:=:0}'" -mode = "execute" diff --git a/television/cable/files.toml b/television/cable/files.toml deleted file mode 100644 index 35c0d27..0000000 --- a/television/cable/files.toml +++ /dev/null @@ -1,33 +0,0 @@ -[metadata] -name = "files" -description = "A channel to select files and directories" -requirements = ["fd", "bat", "mtime-sort"] - -# Most recently modified first; tv ranks matches and frecency on top. -[source] -command = [ - { name = "Default", run = "fd -t f | mtime-sort" }, - { name = "Hidden", run = "fd -t f -H | mtime-sort" }, -] -shell = "bash" - -[preview] -command = "bat -n --color=always '{}'" -env = { BAT_THEME = "ansi" } - -# ctrl-e (edit) and ctrl-h (goto_parent_dir) are bound in config.toml. -[keybindings] -shortcut = "f1" -[actions.edit] -description = "Opens the selected entries in nvim" -# Redirect to the tty: the fish ctrl-t binding runs tv inside a command -# substitution, so stdout is a pipe there. -command = "nvim {} /dev/tty" -shell = "bash" -# use `mode = "fork"` if you want to return to tv afterwards -mode = "execute" - -[actions.goto_parent_dir] -description = "Re-opens tv in the parent directory" -command = "tv files .. --inline" -mode = "execute" diff --git a/television/cable/fish-history.toml b/television/cable/fish-history.toml deleted file mode 100644 index 792ee02..0000000 --- a/television/cable/fish-history.toml +++ /dev/null @@ -1,9 +0,0 @@ -[metadata] -name = "fish-history" -description = "A channel to select from your fish history" -requirements = ["fish"] - -[source] -command = "fish -c 'history'" -no_sort = true -frecency = false diff --git a/television/cable/fonts.toml b/television/cable/fonts.toml deleted file mode 100644 index 561c91d..0000000 --- a/television/cable/fonts.toml +++ /dev/null @@ -1,16 +0,0 @@ -[metadata] -name = "fonts" -description = "List installed system fonts" -requirements = ["fc-list"] - -[source] -command = "fc-list --format='%{family}\n' | sort -uf" - -[preview] -command = "fc-list '{}' --format='%{file}\n%{style}\n%{family}\n' | head -20" - -[ui.preview_panel] -border_type = "none" -scrollbar = false -padding = { left = 2, right = 1, top = 0, bottom = 0 } -size = 70 diff --git a/television/cable/gh-issues.toml b/television/cable/gh-issues.toml deleted file mode 100644 index cae57f6..0000000 --- a/television/cable/gh-issues.toml +++ /dev/null @@ -1,47 +0,0 @@ -[metadata] -name = "gh-issues" -description = "List GitHub issues for the current repo" -requirements = ["gh", "jq"] - -[source] -command = '''gh issue list --state open --limit 100 --json number,title,createdAt,author,labels | jq -r 'sort_by(.createdAt) | reverse | .[] | " \u001b[32m#\(.number)\u001b[39m \(.title) \u001b[33m@\(.author.login)\u001b[39m" + (if (.labels | length) > 0 then " " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] | join(" ")) else "" end)' -''' -ansi = true -output = "{strip_ansi|split:#:1|split: :0}" - -[ui] -layout = "portrait" -preview_panel = { header = '{strip_ansi|split:#:1|split: :0}', border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[preview] -command = '''gh issue view '{strip_ansi|split:#:1|split: :0}' --json number,title,body,state,author,createdAt,updatedAt,labels,assignees | jq -r ' -" " + .title, -" #" + (.number | tostring), -"", -" \u001b[36mStatus:\u001b[39m \u001b[32m" + .state + "\u001b[39m", -" \u001b[36mAuthor:\u001b[39m \u001b[33m" + .author.login + "\u001b[39m", -" \u001b[36mCreated:\u001b[39m " + (.createdAt | fromdateiso8601 | (now - .) | if . < 3600 then (./60|floor|tostring) + " minutes ago" elif . < 86400 then (./3600|floor|tostring) + " hours ago" else (./86400|floor|tostring) + " days ago" end), -" \u001b[36mUpdated:\u001b[39m " + (.updatedAt | fromdateiso8601 | (now - .) | if . < 3600 then (./60|floor|tostring) + " minutes ago" elif . < 86400 then (./3600|floor|tostring) + " hours ago" else (./86400|floor|tostring) + " days ago" end), -(if (.labels | length) > 0 then " \u001b[36mLabels:\u001b[39m " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] | join(" ")) else "" end), -(if (.assignees | length) > 0 then " \u001b[36mAssignees:\u001b[39m " + ([.assignees[].login] | join(", ")) else "" end), -"", -" \u001b[90m────────────────────────────────────────────────────────────\u001b[39m", -"", -(.body // "")' -''' - -[actions.open] -description = "Open the issue in the browser" -command = "gh issue view {strip_ansi|split:#:1|split: :0} --web" -mode = "fork" - -[actions.close] -description = "Close the selected issue" -command = "gh issue close {strip_ansi|split:#:1|split: :0}" -mode = "fork" - -[actions.comment] -description = "Add a comment to the selected issue" -command = "gh issue comment {strip_ansi|split:#:1|split: :0}" -mode = "execute" - diff --git a/television/cable/gh-prs.toml b/television/cable/gh-prs.toml deleted file mode 100644 index 2ac73c5..0000000 --- a/television/cable/gh-prs.toml +++ /dev/null @@ -1,52 +0,0 @@ -[metadata] -name = "gh-prs" -description = "List GitHub PRs for the current repo" -requirements = ["gh", "jq"] - -[source] -command = '''gh pr list --state open --limit 100 --json number,title,createdAt,author,labels | jq -r 'sort_by(.createdAt) | reverse | .[] | " \u001b[32m#\(.number)\u001b[39m \(.title) \u001b[33m@\(.author.login)\u001b[39m" + (if (.labels | length) > 0 then " " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] | join(" ")) else "" end)' -''' -output = '{strip_ansi|split:#:1|split: :0}' -ansi = true - -[ui] -layout = "portrait" - -[preview] -command = '''gh pr view '{strip_ansi|split:#:1|split: :0}' --json number,title,body,state,headRefName,baseRefName,author,createdAt,updatedAt,mergeable,changedFiles,additions,deletions,labels,assignees,reviewDecision,headRepository,headRepositoryOwner | jq -r ' -" " + .title, -" #" + (.number | tostring), -"", -" \u001b[36mStatus:\u001b[39m \u001b[32m" + .state + "\u001b[39m " + .baseRefName + " ← " + .headRefName, -" \u001b[36mRepo:\u001b[39m \u001b[34m" + (.headRepositoryOwner.login) + "/" + (.headRepository.name) + "\u001b[39m", -" \u001b[36mAuthor:\u001b[39m \u001b[33m" + .author.login + "\u001b[39m", -" \u001b[36mCreated:\u001b[39m " + (.createdAt | fromdateiso8601 | (now - .) | if . < 3600 then (./60|floor|tostring) + " minutes ago" elif . < 86400 then (./3600|floor|tostring) + " hours ago" else (./86400|floor|tostring) + " days ago" end), -" \u001b[36mUpdated:\u001b[39m " + (.updatedAt | fromdateiso8601 | (now - .) | if . < 3600 then (./60|floor|tostring) + " minutes ago" elif . < 86400 then (./3600|floor|tostring) + " hours ago" else (./86400|floor|tostring) + " days ago" end), -(if (.labels | length) > 0 then " \u001b[36mLabels:\u001b[39m " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] | join(" ")) else "" end), -" \u001b[36mMerge Status:\u001b[39m " + (if .mergeable == "MERGEABLE" then "\u001b[32m✓ Clean\u001b[39m" elif .mergeable == "CONFLICTING" then "\u001b[31m✗ Dirty\u001b[39m" else "\u001b[33m? Unknown\u001b[39m" end), -" \u001b[36mChanges:\u001b[39m " + (.changedFiles | tostring) + " files \u001b[32m+" + (.additions | tostring) + "\u001b[39m \u001b[31m-" + (.deletions | tostring) + "\u001b[39m", -"", -" \u001b[90m────────────────────────────────────────────────────────────\u001b[39m", -"", -(.body // "")' -''' - -[actions.open] -description = "Open the PR in the browser" -command = "gh pr view {strip_ansi|split:#:1|split: :0} --web" -mode = "execute" - -[actions.checkout] -description = "Checkout the PR branch locally" -command = "gh pr checkout {strip_ansi|split:#:1|split: :0}" -mode = "execute" - -[actions.merge] -description = "Merge the selected PR" -command = "gh pr merge {strip_ansi|split:#:1|split: :0}" -mode = "execute" - -[actions.diff] -description = "View the PR diff" -command = "gh pr diff {strip_ansi|split:#:1|split: :0} | less" -mode = "execute" diff --git a/television/cable/ghq-repos.toml b/television/cable/ghq-repos.toml deleted file mode 100644 index a153050..0000000 --- a/television/cable/ghq-repos.toml +++ /dev/null @@ -1,87 +0,0 @@ -[metadata] -name = "ghq-repos" -description = """ -ghq repositories (plus the chezmoi source tree) and Obsidian vaults, newest -git activity first. Enter prints the directory; the gho shell function (ctrl-o -in fish, zsh and bash) cds into it. -""" -requirements = ["ghq", "fd", "git", "serie", "onefetch", "mtime-sort"] - -# Entries are "\t": the name is what you fuzzy-match, the -# path is what enter prints. ctrl-s cycles repos → vaults. -[source] -command = [ - { name = "Repos", run = ''' -root=$(ghq root) -{ - # Checkouts living outside ghq root, listed first so they win over a ghq - # clone of the same repo: chezmoi's source (github.com/prdlk/dotfiles) and - # the nvim config (github.com/prdlk/nvim). - c=$HOME/.local/share/chezmoi - [ -d "$c/.git" ] && printf 'github.com/prdlk/dotfiles\t%s\n' "$c" - n=$HOME/.config/nvim - [ -d "$n/.git" ] && printf 'github.com/prdlk/nvim\t%s\n' "$n" - ghq list | awk -v r="$root" '{ print $0 "\t" r "/" $0 }' -} | awk -F '\t' '!seen[$1]++' | mtime-sort --repo -''' }, - { name = "Vaults", run = ''' -v=$HOME/Documents/Obsidian -fd -H -t d -d 3 '^\.obsidian$' "$v" -x dirname | - awk -v r="$v/" '{ print substr($0, length(r) + 1) "\t" $0 }' | - mtime-sort -''' }, -] -shell = "bash" -display = "{split:\\t:0}" -output = "{split:\\t:1}" - -# Two previews, ctrl-f cycles: commit graph (default), then onefetch. serie -# itself cannot draw here -- it is a fullscreen TUI that paints the graph with -# kitty images and has no print mode -- so ctrl-g (history) opens it. -[preview] -command = [ - ''' -d='{split:\t:1}' -if [ -e "$d/.git" ]; then - git -C "$d" log --graph --all --color=always --date=relative -n 300 \ - --format='%C(yellow)%h%C(reset) %C(blue)%<(12,trunc)%ad%C(reset) %s%C(auto)%d' 2>&1 -else - eza --tree --level 2 --color=always "$d" 2>/dev/null || ls -la "$d" -fi -''', - ''' -d='{split:\t:1}' -if [ -e "$d/.git" ]; then - onefetch --no-art "$d" 2>&1 -else - eza --tree --level 2 --color=always "$d" 2>/dev/null || ls -la "$d" -fi -''', -] -shell = "bash" - -# ctrl-e (edit) is bound globally in config.toml. -[keybindings] -ctrl-b = "actions:browse" -ctrl-g = "actions:history" - -[actions.edit] -description = "Open the repository in nvim" -# /dev/tty: the gho wrapper captures tv's stdout to read the picked path. -command = "cd '{split:\\t:1}' && nvim . /dev/tty" -shell = "bash" -mode = "execute" - -[actions.browse] -description = "Open the repository's web page (gop)" -command = "cd '{split:\\t:1}' && gop >/dev/null 2>&1" -shell = "bash" -mode = "fork" - -[actions.history] -description = "Browse the commit graph in serie" -# Fork: quitting serie (q) returns to the picker. /dev/tty for the same reason -# as edit; serie also needs a real tty to detect kitty graphics. -command = "cd '{split:\\t:1}' && [ -e .git ] && serie /dev/tty" -shell = "bash" -mode = "fork" diff --git a/television/cable/git-branch.toml b/television/cable/git-branch.toml deleted file mode 100644 index d1e2032..0000000 --- a/television/cable/git-branch.toml +++ /dev/null @@ -1,37 +0,0 @@ -[metadata] -name = "git-branch" -description = "A channel to select from git branches" -requirements = ["git"] - -[source] -command = "git --no-pager branch --all --format=\"%(refname:short)\"" -output = "{split: :0}" - -[preview] -command = "git show -p --stat --pretty=fuller --color=always '{0}'" - -[keybindings] -enter = "actions:checkout" -ctrl-d = "actions:delete" -ctrl-m = "actions:merge" -ctrl-r = "actions:rebase" - -[actions.checkout] -description = "Checkout the selected branch" -command = "git checkout '{0}'" -mode = "execute" - -[actions.delete] -description = "Delete the selected branch" -command = "git branch -d '{0}'" -mode = "execute" - -[actions.merge] -description = "Merge the selected branch into current branch" -command = "git merge '{0}'" -mode = "execute" - -[actions.rebase] -description = "Rebase current branch onto the selected branch" -command = "git rebase '{0}'" -mode = "execute" diff --git a/television/cable/git-deletions.toml b/television/cable/git-deletions.toml deleted file mode 100644 index bb047c9..0000000 --- a/television/cable/git-deletions.toml +++ /dev/null @@ -1,24 +0,0 @@ -[metadata] -name = "git-deletions" -description = "A channel to list files which were deleted from the Git repository" -requirements = ["git", "rg", "bat"] - -[source] -command = "git log --diff-filter=D --summary | rg 'delete mode \\d+' -r '' --trim" - -[preview] -command = ["git show \"$(git rev-list -n1 HEAD -- '{}')^:{}\" | bat -n --color always --file-name '{}'", "git show --summary \"$(git rev-list -n1 HEAD -- '{}')\""] - -[keybindings] -enter = "actions:print_commit" -ctrl-r = "actions:restore_file" - -[actions.print_commit] -description = "Print the latest commit where file was deleted" -command = "echo \"$(git rev-list -n1 HEAD -- {})\"" -mode = "execute" - -[actions.restore_file] -description = "Restore the selected file" -command = "git checkout \"$(git rev-list -n1 HEAD -- {})^\" -- {}" - diff --git a/television/cable/git-diff.toml b/television/cable/git-diff.toml deleted file mode 100644 index fd44677..0000000 --- a/television/cable/git-diff.toml +++ /dev/null @@ -1,34 +0,0 @@ -[metadata] -name = "git-diff" -description = "A channel to select files from git diff commands" -requirements = ["git"] - -[source] -command = "git diff --name-only HEAD" - -[preview] -command = "git diff HEAD --color=always -- '{}'" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-s = "actions:stage" -ctrl-r = "actions:restore" -ctrl-e = "actions:edit" - -[actions.stage] -description = "Stage the selected file" -command = "git add {}" -mode = "fork" - -[actions.restore] -description = "Discard changes in the selected file" -command = "git restore {}" -mode = "fork" - -[actions.edit] -description = "Open the selected file in editor" -command = "${EDITOR:-vim} {}" -shell = "bash" -mode = "execute" diff --git a/television/cable/git-files.toml b/television/cable/git-files.toml deleted file mode 100644 index e51a20f..0000000 --- a/television/cable/git-files.toml +++ /dev/null @@ -1,35 +0,0 @@ -[metadata] -name = "git-files" -description = """ -Files tracked in the current git repository, most recently modified first -(all files under the cwd outside a repo). Enter opens the selection in nvim; -bound to ctrl-e in fish, zsh and bash. -""" -requirements = ["git", "fd", "bat", "mtime-sort"] - -[source] -command = [ - { name = "Tracked", run = ''' -if top=$(git rev-parse --show-toplevel 2>/dev/null); then - git -c core.quotePath=false ls-files -- "$top" -else - fd -t f -fi | mtime-sort -''' }, - { name = "All", run = "fd -t f -H -E .git | mtime-sort" }, -] -shell = "bash" - -[preview] -command = "bat -n --color=always '{}'" -env = { BAT_THEME = "ansi" } - -# ctrl-e (edit) is bound globally in config.toml. -[keybindings] -enter = "actions:edit" - -[actions.edit] -description = "Opens the selected entries in nvim" -command = "nvim {} /dev/tty" -shell = "bash" -mode = "execute" diff --git a/television/cable/git-log.toml b/television/cable/git-log.toml deleted file mode 100644 index 9f80a9f..0000000 --- a/television/cable/git-log.toml +++ /dev/null @@ -1,34 +0,0 @@ -[metadata] -name = "git-log" -description = "A channel to select from git log entries" -requirements = ["git"] - -[source] -command = "git log --graph --pretty=format:'%C(yellow)%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --color=always" -output = "{strip_ansi|split: :1}" -ansi = true -no_sort = true -frecency = false - -[preview] -command = "git show -p --stat --pretty=fuller --color=always '{strip_ansi|split: :1}' | head -n 1000" - -[keybindings] -ctrl-y = "actions:cherry-pick" -ctrl-r = "actions:revert" -ctrl-o = "actions:checkout" - -[actions.cherry-pick] -description = "Cherry-pick the selected commit" -command = "git cherry-pick '{strip_ansi|split: :1}'" -mode = "execute" - -[actions.revert] -description = "Revert the selected commit" -command = "git revert '{strip_ansi|split: :1}'" -mode = "execute" - -[actions.checkout] -description = "Checkout the selected commit" -command = "git checkout '{strip_ansi|split: :1}'" -mode = "execute" diff --git a/television/cable/git-reflog.toml b/television/cable/git-reflog.toml deleted file mode 100644 index e16dff1..0000000 --- a/television/cable/git-reflog.toml +++ /dev/null @@ -1,28 +0,0 @@ -[metadata] -name = "git-reflog" -description = "A channel to select from git reflog entries" -requirements = ["git"] - -[source] -command = "git reflog --decorate --color=always" -output = "{0|strip_ansi}" -ansi = true -no_sort = true -frecency = false - -[preview] -command = "git show -p --stat --pretty=fuller --color=always '{0|strip_ansi}'" - -[keybindings] -ctrl-o = "actions:checkout" -ctrl-r = "actions:reset" - -[actions.checkout] -description = "Checkout the selected reflog entry" -command = "git checkout '{0|strip_ansi}'" -mode = "execute" - -[actions.reset] -description = "Reset --hard to the selected reflog entry" -command = "git reset --hard '{0|strip_ansi}'" -mode = "execute" diff --git a/television/cable/git-remotes.toml b/television/cable/git-remotes.toml deleted file mode 100644 index 08ce83e..0000000 --- a/television/cable/git-remotes.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "git-remotes" -description = "List and manage git remotes" -requirements = ["git"] - -[source] -command = "git remote" - -[preview] -command = "git remote show '{}'" - -[actions.fetch] -description = "Fetch from the selected remote" -command = "git fetch {}" -mode = "execute" - -[actions.remove] -description = "Remove the selected remote" -command = "git remote remove {}" -mode = "execute" diff --git a/television/cable/git-repos.toml b/television/cable/git-repos.toml deleted file mode 100644 index a67421a..0000000 --- a/television/cable/git-repos.toml +++ /dev/null @@ -1,31 +0,0 @@ -[metadata] -name = "git-repos" -requirements = ["fd", "git"] -description = """ -A channel to select from git repositories on your local machine. - -This channel uses `fd` to find directories that contain a `.git` subdirectory, and then allows you to preview the git log of the selected repository. -""" - -[source] -# this is a macos version of the command. While perfectly usable on linux, you may want to tweak it a bit. -command = "fd -g .git -HL -t d -d 10 --prune ~ -E 'Library' -E 'Application Support' --exec dirname '{}'" -display = "{split:/:-1}" - -[preview] -command = "cd '{}'; git log -n 200 --pretty=medium --all --graph --color" - -[keybindings] -enter = "actions:cd" -ctrl-e = "actions:edit" - -[actions.cd] -description = "Open a new shell in the selected repository" -command = "cd {} && $SHELL" -mode = "execute" - -[actions.edit] -description = "Open the repository in editor" -command = "${EDITOR:-vim} {}" -shell = "bash" -mode = "execute" diff --git a/television/cable/git-stash.toml b/television/cable/git-stash.toml deleted file mode 100644 index bcd6719..0000000 --- a/television/cable/git-stash.toml +++ /dev/null @@ -1,37 +0,0 @@ -[metadata] -name = "git-stash" -description = "Browse and manage git stash entries" -requirements = ["git"] - -[source] -command = "git stash list --color=always" -ansi = true -output = "{strip_ansi|split:\\::0}" -no_sort = true -frecency = false - -[preview] -command = "git stash show -p --color=always '{strip_ansi|split:\\::0}'" - -[ui] -layout = "portrait" - -[keybindings] -enter = "actions:apply" -ctrl-p = "actions:pop" -ctrl-d = "actions:drop" - -[actions.apply] -description = "Apply the selected stash" -command = "git stash apply '{strip_ansi|split:\\::0}'" -mode = "execute" - -[actions.pop] -description = "Pop the selected stash (apply and remove)" -command = "git stash pop '{strip_ansi|split:\\::0}'" -mode = "execute" - -[actions.drop] -description = "Drop the selected stash" -command = "git stash drop '{strip_ansi|split:\\::0}'" -mode = "execute" diff --git a/television/cable/git-submodules.toml b/television/cable/git-submodules.toml deleted file mode 100644 index 1680b71..0000000 --- a/television/cable/git-submodules.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "git-submodules" -description = "List and manage git submodules" -requirements = ["git"] - -[source] -command = "git submodule status | awk '{print $2}'" - -[preview] -command = "git -C '{}' log --oneline -10 --color=always" - -[actions.update] -description = "Update the selected submodule" -command = "git submodule update --init --recursive {}" -mode = "execute" - -[actions.sync] -description = "Sync the selected submodule URL" -command = "git submodule sync {}" -mode = "execute" diff --git a/television/cable/git-tags.toml b/television/cable/git-tags.toml deleted file mode 100644 index 8230fa3..0000000 --- a/television/cable/git-tags.toml +++ /dev/null @@ -1,26 +0,0 @@ -[metadata] -name = "git-tags" -description = "Browse and checkout git tags" -requirements = ["git"] - -[source] -command = "git tag --sort=-creatordate" -no_sort = true -frecency = false - -[preview] -command = "git show --color=always '{}'" - -[keybindings] -enter = "actions:checkout" -ctrl-d = "actions:delete" - -[actions.checkout] -description = "Checkout the selected tag" -command = "git checkout {}" -mode = "execute" - -[actions.delete] -description = "Delete the selected tag" -command = "git tag -d {}" -mode = "execute" diff --git a/television/cable/git-worktrees.toml b/television/cable/git-worktrees.toml deleted file mode 100644 index 4d8010c..0000000 --- a/television/cable/git-worktrees.toml +++ /dev/null @@ -1,24 +0,0 @@ -[metadata] -name = "git-worktrees" -description = "List and switch between git worktrees" -requirements = ["git"] - -[source] -command = "git worktree list --porcelain | grep '^worktree' | cut -d' ' -f2-" - -[preview] -command = "cd '{}' && git log --oneline -10 --color=always && echo && git status --short" - -[keybindings] -enter = "actions:cd" -ctrl-d = "actions:remove" - -[actions.cd] -description = "Change to the selected worktree" -command = "cd {} && $SHELL" -mode = "execute" - -[actions.remove] -description = "Remove the selected worktree" -command = "git worktree remove {}" -mode = "execute" diff --git a/television/cable/images.toml b/television/cable/images.toml deleted file mode 100644 index 53d5b1c..0000000 --- a/television/cable/images.toml +++ /dev/null @@ -1,21 +0,0 @@ -[metadata] -name = "images" -description = "Browse image files with preview" -requirements = ["fd", "chafa"] - -[source] -command = [ - { name = "Default", run = "fd -t f -e png -e jpg -e jpeg -e gif -e webp -e bmp -e svg ." }, - { name = "Hidden", run = "fd -t f -e png -e jpg -e jpeg -e gif -e webp -e bmp -e svg -H ." }, -] - -[preview] -command = "chafa -s 80x40 '{}' 2>/dev/null || file '{}'" - -[keybindings] -enter = "actions:open" - -[actions.open] -description = "Open the selected image with default viewer" -command = "xdg-open {} 2>/dev/null || open {}" -mode = "fork" diff --git a/television/cable/jobs.toml b/television/cable/jobs.toml deleted file mode 100644 index 540a1bc..0000000 --- a/television/cable/jobs.toml +++ /dev/null @@ -1,57 +0,0 @@ -[metadata] -name = "jobs" -description = """ -The current fish shell's background jobs (stopped or running). tv runs in a -child process and cannot see the shell's job table, so the ctrl-z binding -(_jobs_bind) writes it to the file named by $TV_JOBS; enter prints the job id -and the binding runs `fg %`; ctrl-d kills the job. Opened any other way, -the list is empty. -""" -requirements = ["ps"] - -# Record: "% ", job id, process group (tab separated). -# Newest job first, the order fish's `jobs` prints. -[source] -command = '[ -n "$TV_JOBS" ] && [ -r "$TV_JOBS" ] && cat "$TV_JOBS"' -shell = "bash" -display = "{split:\\t:0}" -output = "{split:\\t:1}" - -[preview] -command = ''' -pg='{split:\t:2}' -# No other braces in this script: tv would read them as templates. procps -# `ps -g` matches sessions, not process groups, so filter on pgid by hand. -pids=$(ps -e -o pgid=,pid= --sort=start_time | while read -r g p; do [ "$g" = "$pg" ] && echo "$p"; done) -if [ -z "$pids" ]; then - echo "process group $pg is gone" - exit 0 -fi -first=$(echo "$pids" | head -n1) -printf '\033[1mcwd\033[0m %s\n' "$(readlink "/proc/$first/cwd" 2>/dev/null || echo '?')" -printf '\033[1mstarted\033[0m %s\n\n' "$(ps -o lstart= -p "$first" | sed 's/^ *//')" -# STAT T = stopped (ctrl-z), S/R = running in the background. -ps -o pid,stat,etime,pcpu,rss,args --forest -p "$(echo $pids | tr ' ' ,)" -''' -shell = "bash" - -[keybindings] -ctrl-d = ["actions:kill", "reload_source"] - -# SIGTERM to the whole process group, then SIGCONT: a stopped job holds TERM -# until it runs again. The row leaves $TV_JOBS only once the group is gone -# (up to 1 s), so reload_source keeps a job that ignored TERM. No braces: tv -# would read them as templates. -[actions.kill] -description = "Kill the job (SIGTERM to its process group)" -command = ''' -pg='{split:\t:2}' -kill -TERM -- "-$pg" 2>/dev/null -kill -CONT -- "-$pg" 2>/dev/null -for i in 1 2 3 4 5 6 7 8 9 10; do kill -0 -- "-$pg" 2>/dev/null || break; sleep 0.1; done -if ! kill -0 -- "-$pg" 2>/dev/null && [ -w "$TV_JOBS" ]; then - awk -F '\t' -v g="$pg" '$3 != g' "$TV_JOBS" >"$TV_JOBS.new" && mv "$TV_JOBS.new" "$TV_JOBS" -fi -''' -shell = "bash" -mode = "fork" diff --git a/television/cable/journal.toml b/television/cable/journal.toml deleted file mode 100644 index 5161d0b..0000000 --- a/television/cable/journal.toml +++ /dev/null @@ -1,24 +0,0 @@ -[metadata] -name = "journal" -description = "Browse systemd journal log identifiers and their logs" -requirements = ["journalctl"] - -[source] -command = "journalctl --field SYSLOG_IDENTIFIER 2>/dev/null | sort -f" - -[preview] -command = "journalctl -b --no-pager -o short-iso -n 50 SYSLOG_IDENTIFIER='{}' 2>/dev/null" - -[ui] -layout = "portrait" -preview_panel = { size = 70, border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[actions.logs] -description = "Follow live logs for the selected identifier" -command = "journalctl -f SYSLOG_IDENTIFIER={}" -mode = "execute" - -[actions.full] -description = "View all logs for the selected identifier in a pager" -command = "journalctl -b --no-pager -o short-iso SYSLOG_IDENTIFIER={} | less" -mode = "fork" diff --git a/television/cable/just-recipes.toml b/television/cable/just-recipes.toml deleted file mode 100644 index 69b2fd2..0000000 --- a/television/cable/just-recipes.toml +++ /dev/null @@ -1,18 +0,0 @@ -[metadata] -name = "just-recipes" -description = "A channel to select recipes from Justfiles" -requirements = ["just"] - -[source] -command = ["just --summary | tr '[:blank:]' '\n'"] - -[preview] -command = "just -s {}" - -[keybindings] -f5 = "actions:execute-recipe" - -[actions.execute-recipe] -description = "Execute a justfile recipe" -command = "just {}" -mode = "execute" diff --git a/television/cable/kitty-days.toml b/television/cable/kitty-days.toml deleted file mode 100644 index d4b19e9..0000000 --- a/television/cable/kitty-days.toml +++ /dev/null @@ -1,75 +0,0 @@ -[metadata] -name = "kitty-days" -description = """ -Daily kitty sessions saved by ~/.config/kitty/day_session.py, last modified -first. The preview lists each tab's windows (cwd, the program restored in it) -with the tail of its saved scrollback. Enter opens the day in a new kitty. -""" -requirements = ["kitty", "python3", "mtime-sort"] - -# Entries are " week of tabs\t". -[source] -command = ''' -for f in "$HOME"/.local/share/kitty-sessions/*/*.kitty-session; do - [ -e "$f" ] || continue - day=$(basename "$f" .kitty-session) - printf '%s %s week of %s %s tabs\t%s\n' "$day" "$(date -d "$day" +%a)" \ - "$(basename "$(dirname "$f")")" "$(grep -c '^new_tab' "$f")" "$f" -done | mtime-sort -''' -shell = "bash" -display = "{split:\\t:0}" -output = "{split:\\t:1}" - -# The script avoids braces: tv would read them as templates. -[preview] -command = ''' -python3 - '{split:\t:1}' <<'PY' -import json, os, shlex, sys - -FLAG = 'kitty-unserialize-data=' -home = os.path.expanduser('~') -tab, cwd = 0, '' -for line in open(sys.argv[1]).read().splitlines(): - word, _, rest = line.partition(' ') - if word == 'new_tab': - tab += 1 - print('\x1b[1mtab %d\x1b[m' % tab) - elif word == 'cd': - cwd = shlex.split(rest)[0] - elif word == 'launch': - args = shlex.split(rest) - data = json.loads(args.pop(0)[len(FLAG):]) if args and args[0].startswith(FLAG) else dict() - wcwd = next((a.partition('=')[2] for a in args if a.startswith('--cwd=')), cwd) - cmd = [a for a in args if not a.startswith('-')] # kitty writes every option as --opt=value - dump, program = '', shlex.join(cmd) - for step in data.get('cmd_at_shell_startup', '').split('; '): - if step.startswith('cat '): - dump = shlex.split(step)[1] - elif step: - program = step - print(' \x1b[36m%s\x1b[m %s' % (wcwd.replace(home, '~', 1), program)) - if dump and os.path.exists(dump): - for l in open(dump, errors='replace').read().splitlines()[-6:]: - print(' ' + l + '\x1b[m') -PY -''' -shell = "bash" - -# ctrl-e (edit) is bound globally in config.toml. -[keybindings] -enter = "actions:open" - -# Today's file, while no running kitty owns it, comes back as the live day -# (saved again); any other day is a read-only snapshot. -[actions.open] -description = "Open the day in a new kitty" -command = "setsid -f kitty --session '{split:\\t:1}' >/dev/null 2>&1" -shell = "bash" -mode = "execute" - -[actions.edit] -description = "Open the session file in nvim" -command = "nvim '{split:\\t:1}' /dev/tty" -shell = "bash" -mode = "execute" diff --git a/television/cable/make-targets.toml b/television/cable/make-targets.toml deleted file mode 100644 index dbf78aa..0000000 --- a/television/cable/make-targets.toml +++ /dev/null @@ -1,18 +0,0 @@ -[metadata] -name = "make-targets" -description = "List and run Makefile targets" -requirements = ["make", "awk"] - -[source] -command = "make -pRrq 2>/dev/null | awk -F: '/^[a-zA-Z0-9][^$#\\/\\t=]*:([^=]|$)/ {split($1,a,\" \"); print a[1]}' | sort -u | grep -v '^Makefile$'" - -[preview] -command = "awk '/^{}[[:space:]]*:/{found=1} found{print; if(/^[^\\t]/ && NR>1 && !/^{}[[:space:]]*:/) exit}' Makefile" - -[keybindings] -enter = "actions:run" - -[actions.run] -description = "Run the selected make target" -command = "make {}" -mode = "execute" diff --git a/television/cable/man-pages.toml b/television/cable/man-pages.toml deleted file mode 100644 index 6a20097..0000000 --- a/television/cable/man-pages.toml +++ /dev/null @@ -1,25 +0,0 @@ -[metadata] -name = "man-pages" -description = "Browse and preview system manual pages" -requirements = ["apropos", "man"] - -[source] -# List all man pages using apropos -command = "apropos ." - -[preview] -# Show the man page for the selected entry -command = "man '{0}'" -env = { "MANWIDTH" = "80" } - -[keybindings] -enter = "actions:open" - -[actions.open] -description = "Open the selected man page in the system pager" -command = "man '{0}'" -mode = "execute" - -[ui] -layout = "portrait" -preview_panel = { header = "{0}", border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } diff --git a/television/cable/mounts.toml b/television/cable/mounts.toml deleted file mode 100644 index 531aa70..0000000 --- a/television/cable/mounts.toml +++ /dev/null @@ -1,19 +0,0 @@ -[metadata] -name = "mounts" -description = "List mounted filesystems" -requirements = ["df", "awk"] - -[source] -command = "df -h --output=target,fstype,size,used,avail,pcent 2>/dev/null | tail -n +2" -display = "{split: :0}" - -[preview] -command = "df -h '{}' && echo && ls -la '{}' 2>/dev/null | head -20" - -[keybindings] -enter = "actions:cd" - -[actions.cd] -description = "Open a shell in the selected mount point" -command = "cd {} && $SHELL" -mode = "execute" diff --git a/television/cable/node-packages.toml b/television/cable/node-packages.toml deleted file mode 100644 index 89cee7a..0000000 --- a/television/cable/node-packages.toml +++ /dev/null @@ -1,21 +0,0 @@ -[metadata] -name = "node-packages" -description = "Browse local node_modules dependencies" -requirements = ["node"] - -[source] -command = "ls -d node_modules/*/ 2>/dev/null | sed 's|node_modules/||;s|/$||' | grep -v '^\\.'" -output = "{}" - -[preview] -command = "cat 'node_modules/{}/package.json' 2>/dev/null | jq -C '{name, version, description, license, homepage, main}'" - -[actions.readme] -description = "View the package README" -command = "cat node_modules/{}/README.md 2>/dev/null | less" -mode = "execute" - -[actions.homepage] -description = "Open the package homepage" -command = "node -e \"const p=require('./node_modules/{}/package.json'); const u=p.homepage||'https://www.npmjs.com/package/'+p.name; require('child_process').exec('xdg-open '+u)\"" -mode = "fork" diff --git a/television/cable/npm-packages.toml b/television/cable/npm-packages.toml deleted file mode 100644 index 6d26a9e..0000000 --- a/television/cable/npm-packages.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "npm-packages" -description = "List globally installed npm packages" -requirements = ["npm"] - -[source] -command = "npm list -g --depth=0 --parseable 2>/dev/null | tail -n +2 | xargs -I{} basename {}" - -[preview] -command = "npm info '{}' 2>/dev/null | head -30" - -[actions.uninstall] -description = "Uninstall the selected global package" -command = "npm uninstall -g {}" -mode = "execute" - -[actions.update] -description = "Update the selected global package" -command = "npm update -g {}" -mode = "execute" diff --git a/television/cable/npm-scripts.toml b/television/cable/npm-scripts.toml deleted file mode 100644 index ab80f6d..0000000 --- a/television/cable/npm-scripts.toml +++ /dev/null @@ -1,25 +0,0 @@ -[metadata] -name = "npm-scripts" -description = "List and run npm scripts from package.json" -requirements = ["jq"] - -[source] -command = "jq -r '.scripts | to_entries[] | \"\\(.key)\\t\\(.value)\"' package.json 2>/dev/null" -display = "{split:\\t:0}" - -[preview] -command = "jq -r '.scripts[\"{split:\\t:0}\"]' package.json" - -[ui.preview_panel] -border_type = "none" -scrollbar = false -padding = { left = 2, right = 1, top = 0, bottom = 0 } -size = 30 - -[keybindings] -enter = "actions:run" - -[actions.run] -description = "Run the selected npm script" -command = "npm run '{split:\\t:0}'" -mode = "execute" diff --git a/television/cable/nu-history.toml b/television/cable/nu-history.toml deleted file mode 100644 index f6d9899..0000000 --- a/television/cable/nu-history.toml +++ /dev/null @@ -1,9 +0,0 @@ - -[metadata] -name = "nu-history" -description = "A channel to select from your nu history" - -[source] -command = "nu -c 'open $nu.history-path | lines | uniq | reverse | to text'" -no_sort = true -frecency = false diff --git a/television/cable/obsidian.toml b/television/cable/obsidian.toml deleted file mode 100644 index a065dc5..0000000 --- a/television/cable/obsidian.toml +++ /dev/null @@ -1,66 +0,0 @@ -[metadata] -name = "obsidian" -description = """ -Obsidian vaults under ~/Documents/Obsidian, most recently modified first. -Enter opens the vault in Obsidian; vaults Obsidian has never opened are -registered in obsidian.json first. -""" -requirements = ["fd", "jq", "eza", "obsidian", "xdg-open", "mtime-sort"] - -# Entries are "\t": the name is what you fuzzy-match, the -# path is what the actions use. -[source] -command = ''' -v=$HOME/Documents/Obsidian -fd -H -t d -d 3 '^\.obsidian$' "$v" -x dirname | - awk -v r="$v/" '{ print substr($0, length(r) + 1) "\t" $0 }' | - mtime-sort -''' -shell = "bash" -display = "{split:\\t:0}" -output = "{split:\\t:1}" - -[preview] -command = "eza --tree --level 2 --color=always '{split:\\t:1}' 2>/dev/null || ls -la '{split:\\t:1}'" -shell = "bash" - -# ctrl-e (edit) is bound globally in config.toml. -[keybindings] -enter = "actions:open" - -# obsidian://open?path= only resolves vaults listed in obsidian.json, and -# Obsidian reads that file once at startup and rewrites it from memory. An -# unlisted vault is therefore added only while Obsidian is closed; while it -# runs, the vault switcher opens instead. -[actions.open] -description = "Open the vault in Obsidian" -command = ''' -d='{split:\t:1}' -cfg=${XDG_CONFIG_HOME:-$HOME/.config}/obsidian/obsidian.json -uri="obsidian://open?path=$(jq -rn --arg p "$d" '$p | @uri')" -if ! jq -e --arg p "$d" 'any(.vaults[]?; .path == $p)' "$cfg" >/dev/null 2>&1; then - # [o]: keep pgrep from matching this script's own command line. - if pgrep -f '[o]bsidian/app.asar' >/dev/null; then - msg="Vault not registered and Obsidian is running: use 'Open folder as vault' for $d" - echo "$msg" >&2 - notify-send Obsidian "$msg" 2>/dev/null - uri="obsidian://choose-vault" - else - mkdir -p "${cfg%/*}" - [ -s "$cfg" ] || echo '{}' >"$cfg" - tmp=$(mktemp "$cfg.XXXXXX") || exit 1 - jq --arg id "$(od -An -N8 -tx1 /dev/urandom | tr -d ' \n')" --arg p "$d" \ - --argjson ts "$(date +%s%3N)" '.vaults[$id] = {path: $p, ts: $ts}' \ - "$cfg" >"$tmp" && mv "$tmp" "$cfg" || rm -f "$tmp" - fi -fi -setsid -f xdg-open "$uri" >/dev/null 2>&1 -''' -shell = "bash" -mode = "execute" - -[actions.edit] -description = "Open the vault in nvim" -command = "cd '{split:\\t:1}' && nvim . /dev/tty" -shell = "bash" -mode = "execute" diff --git a/television/cable/omp-sessions.toml b/television/cable/omp-sessions.toml deleted file mode 100644 index e078403..0000000 --- a/television/cable/omp-sessions.toml +++ /dev/null @@ -1,38 +0,0 @@ -[metadata] -name = "omp-sessions" -description = """ -omp sessions of the current git repo, newest first: age, the branch HEAD was -on when the session was last written, and the title. The preview is the -conversation's message text; enter resumes the session, ctrl-n starts a new -one instead. Listing, preview, resume and new live in ~/.local/bin/omp-session, -whose launcher (ctrl-a in fish and zsh) opens this cable when it has no -session to resume on the default branch. -""" -requirements = ["omp-session", "omp"] - -# Record: display, session file (tab separated). -[source] -command = "omp-session --list" -shell = "bash" -display = "{split:\\t:0}" -output = "{split:\\t:1}" - -[preview] -command = "omp-session --preview '{split:\\t:1}'" -shell = "bash" - -[keybindings] -enter = "actions:resume" -ctrl-n = "actions:new" - -[actions.resume] -description = "Resume the session" -command = "omp-session --resume '{split:\\t:1}'" -shell = "bash" -mode = "execute" - -[actions.new] -description = "Start a new omp session" -command = "omp-session --new" -shell = "bash" -mode = "execute" diff --git a/television/cable/opencode-sessions.toml b/television/cable/opencode-sessions.toml deleted file mode 100644 index 30fe3f2..0000000 --- a/television/cable/opencode-sessions.toml +++ /dev/null @@ -1,38 +0,0 @@ -[metadata] -name = "opencode-sessions" -description = "Browse and resume OpenCode sessions" -requirements = ["opencode", "jq"] - -[source] -# Use literal strings (''') to avoid escape sequence errors -command = '''opencode session list --format json | jq -r '.[] | "\(.id)\t\(.title)\t\(.directory)"' ''' -display = "{split:\t:1} ({split:\t:2})" -output = "{split:\t:0}" - -[preview] -# We use triple single quotes so we don't have to escape the backslashes for jq or the template engine -command = '''opencode session list --format json | jq -r '.[] | select(.id == "{split:\t:0}") | "TITLE: \(.title)\nID: \(.id)\nPROJECT: \(.projectId)\nDIRECTORY: \(.directory)\nUPDATED: \((.updated / 1000) | strftime("%Y-%m-%d %H:%M:%S"))"' ''' - -[ui] -layout = "landscape" -[ui.preview_panel] -size = 60 -header = "Session: {split:\t:1}" -border_type = "none" -scrollbar = false -padding = { left = 2, right = 1, top = 0, bottom = 0 } - -[keybindings] -shortcut = "f4" -enter = "actions:resume" -ctrl-d = "actions:delete" - -[actions.resume] -description = "Resume session" -command = "opencode -s {split:\t:0}" -mode = "execute" - -[actions.delete] -description = "Delete session" -command = '''bash -c 'echo "Delete {split:\t:1}?" && read -p "[y/N]: " conf && [[ $conf == "y" ]] && opencode session delete {split:\t:0} ' ''' -mode = "execute" diff --git a/television/cable/pacman-packages.toml b/television/cable/pacman-packages.toml deleted file mode 100644 index c53a7e4..0000000 --- a/television/cable/pacman-packages.toml +++ /dev/null @@ -1,21 +0,0 @@ -[metadata] -name = "pacman-packages" -description = "List and manage installed pacman packages" -requirements = ["pacman"] - -[source] -command = "pacman -Q" -output = "{split: :0}" - -[preview] -command = "pacman -Qi '{split: :0}' 2>/dev/null" - -[actions.remove] -description = "Remove the selected package" -command = "sudo pacman -R '{split: :0}'" -mode = "execute" - -[actions.files] -description = "List files owned by the selected package" -command = "pacman -Ql '{split: :0}' | less" -mode = "execute" diff --git a/television/cable/path.toml b/television/cable/path.toml deleted file mode 100644 index ec4bec2..0000000 --- a/television/cable/path.toml +++ /dev/null @@ -1,15 +0,0 @@ -[metadata] -name = "path" -description = "Investigate PATH contents" -requirements = ["fd", "bat"] - -[source] -command = "printf '%s\n' \"$PATH\" | tr ':' '\n'" - -[preview] -command = "fd -tx -d1 . \"{}\" -X printf \"%s\n\" \"{/}\" | sort -f | bat -n --color=always" - -[actions.cd] -description = "Open a shell in the selected PATH directory" -command = "cd {} && $SHELL" -mode = "execute" diff --git a/television/cable/pdf-files.toml b/television/cable/pdf-files.toml deleted file mode 100644 index b41b01a..0000000 --- a/television/cable/pdf-files.toml +++ /dev/null @@ -1,24 +0,0 @@ -[metadata] -name = "pdf-files" -description = "Browse PDF files" -requirements = ["fd", "pdftotext"] - -[source] -command = [ - { name = "Default", run = "fd -t f -e pdf ." }, - { name = "Hidden", run = "fd -t f -e pdf -H ." }, -] - -[preview] -command = "pdftotext -l 2 -layout '{}' - 2>/dev/null | head -100 || file '{}'" - -[ui] -layout = "portrait" - -[keybindings] -enter = "actions:open" - -[actions.open] -description = "Open the selected PDF with default viewer" -command = "xdg-open {} 2>/dev/null || open {}" -mode = "fork" diff --git a/television/cable/pip-packages.toml b/television/cable/pip-packages.toml deleted file mode 100644 index 8dd88b8..0000000 --- a/television/cable/pip-packages.toml +++ /dev/null @@ -1,27 +0,0 @@ -[metadata] -name = "pip-packages" -description = "List installed Python packages" -requirements = ["pip"] - -[source] -command = "pip list --format=freeze 2>/dev/null | cut -d= -f1" - -[preview] -command = "pip show '{}'" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-u = "actions:upgrade" -ctrl-d = "actions:uninstall" - -[actions.upgrade] -description = "Upgrade the selected package" -command = "pip install --upgrade {}" -mode = "execute" - -[actions.uninstall] -description = "Uninstall the selected package" -command = "pip uninstall {}" -mode = "execute" diff --git a/television/cable/pj.toml b/television/cable/pj.toml deleted file mode 100644 index c11c654..0000000 --- a/television/cable/pj.toml +++ /dev/null @@ -1,29 +0,0 @@ -[metadata] -name = "pj" -description = """ -Project tasks from every task source between the cwd and the git toplevel -(package.json, Makefile, justfile, mise, devbox, pyproject), tasks of the most -recently modified manifest first. Enter runs the task. Discovery, preview and -run live in ~/.local/bin/pj; `pj` (ctrl-p, and down on an empty prompt in fish, -zsh and bash) opens this cable with its own scan. -""" -requirements = ["pj", "mtime-sort"] - -# Record: display, kind, target, root, runner, manifest (tab separated). -[source] -command = "pj --list 2>/dev/null" -shell = "bash" -display = "{split:\\t:0}" - -[preview] -command = "pj --preview '{split:\\t:1}' '{split:\\t:2}' '{split:\\t:3}' '{split:\\t:5}'" -shell = "bash" - -[keybindings] -enter = "actions:run" - -[actions.run] -description = "Run the selected task" -command = "pj --run '{split:\\t:1}' '{split:\\t:2}' '{split:\\t:3}' '{split:\\t:4}'" -shell = "bash" -mode = "execute" diff --git a/television/cable/ports.toml b/television/cable/ports.toml deleted file mode 100644 index 33d2e75..0000000 --- a/television/cable/ports.toml +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -name = "ports" -description = "List listening ports and associated processes" -requirements = ["ss", "awk"] - -[source] -command = "ss -tlnp 2>/dev/null | tail -n +2 | awk '{gsub(/.*:/,\"\",$4); print $4, $1, $6}' | sed 's/users:((\"//; s/\".*//'" -display = "{split: :0} ({split: :2})" - -[preview] -command = "ss -tlnp 2>/dev/null | grep ':{split: :0} ' | head -20" - -[ui.preview_panel] -border_type = "none" -scrollbar = false -padding = { left = 2, right = 1, top = 0, bottom = 0 } -size = 40 - -[actions.kill] -description = "Kill the process listening on the selected port" -command = "fuser -k {split: :0}/tcp" -mode = "execute" diff --git a/television/cable/procs.toml b/television/cable/procs.toml deleted file mode 100644 index de87ff7..0000000 --- a/television/cable/procs.toml +++ /dev/null @@ -1,38 +0,0 @@ -[metadata] -name = "procs" -description = "A channel to find and manage running processes" -requirements = ["ps", "awk"] - -[source] -command = "ps -e -o pid=,ucomm= | awk '{print $1, $2}'" -display = "{split: :1}" -output = "{split: :0}" - -[preview] -command = "ps -p '{split: :0}' -o user,pid,ppid,state,%cpu,%mem,command | fold" - -[keybindings] -ctrl-k = "actions:kill" -f2 = "actions:term" -ctrl-s = "actions:stop" -ctrl-c = "actions:cont" - -[actions.kill] -description = "Kill the selected process (SIGKILL)" -command = "kill -9 {split: :0}" -mode = "execute" - -[actions.term] -description = "Terminate the selected process (SIGTERM)" -command = "kill -15 {split: :0}" -mode = "execute" - -[actions.stop] -description = "Stop/pause the selected process (SIGSTOP)" -command = "kill -STOP {split: :0}" -mode = "fork" - -[actions.cont] -description = "Continue/resume the selected process (SIGCONT)" -command = "kill -CONT {split: :0}" -mode = "fork" diff --git a/television/cable/python-venvs.toml b/television/cable/python-venvs.toml deleted file mode 100644 index e1bc12b..0000000 --- a/television/cable/python-venvs.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "python-venvs" -description = "Find Python virtual environments" -requirements = ["find"] - -[source] -command = "find ~ -maxdepth 5 -type f -name 'pyvenv.cfg' 2>/dev/null | xargs -I{} dirname {}" - -[preview] -command = "cat '{}/pyvenv.cfg' 2>/dev/null && echo '' && echo 'Packages:' && '{}/bin/pip' list --format=columns 2>/dev/null | head -20" - -[actions.activate] -description = "Open a shell with the selected venv activated" -command = "source '{}/bin/activate' && $SHELL" -mode = "execute" - -[actions.packages] -description = "List all packages in the selected venv" -command = "'{}/bin/pip' list | less" -mode = "execute" diff --git a/television/cable/recent-files.toml b/television/cable/recent-files.toml deleted file mode 100644 index e044bf7..0000000 --- a/television/cable/recent-files.toml +++ /dev/null @@ -1,23 +0,0 @@ -[metadata] -name = "recent-files" -description = "List recently modified files (via git or filesystem)" -requirements = ["git", "bat"] - -[source] -command = [ - { name = "Recent", run = "git diff --name-only HEAD~10 HEAD 2>/dev/null || find . -type f -mtime -7 -not -path '*/.*' 2>/dev/null | head -100" }, - { name = "Last hour", run = "find . -type f -mmin -60 -not -path '*/.*' 2>/dev/null | head -100" }, -] - -[preview] -command = "bat -n --color=always '{}'" -env = { BAT_THEME = "ansi" } - -[keybindings] -enter = "actions:edit" - -[actions.edit] -description = "Open the selected file in editor" -command = "${EDITOR:-vim} {}" -shell = "bash" -mode = "execute" diff --git a/television/cable/rustup.toml b/television/cable/rustup.toml deleted file mode 100644 index 11bb7cd..0000000 --- a/television/cable/rustup.toml +++ /dev/null @@ -1,20 +0,0 @@ -[metadata] -name = "rustup" -description = "Manage Rust toolchains" -requirements = ["rustup"] - -[source] -command = "rustup toolchain list" - -[preview] -command = "rustup run '{split: :0}' rustc --version --verbose 2>/dev/null" - -[actions.default] -description = "Set the selected toolchain as default" -command = "rustup default '{split: :0}'" -mode = "execute" - -[actions.uninstall] -description = "Uninstall the selected toolchain" -command = "rustup toolchain uninstall '{split: :0}'" -mode = "execute" diff --git a/television/cable/ssh-hosts.toml b/television/cable/ssh-hosts.toml deleted file mode 100644 index 9604571..0000000 --- a/television/cable/ssh-hosts.toml +++ /dev/null @@ -1,18 +0,0 @@ -[metadata] -name = "ssh-hosts" -description = "A channel to select hosts from your SSH config" -requirements = ["grep", "tr", "cut", "awk"] - -[source] -command = "grep -E '^Host(name)? ' $HOME/.ssh/config | tr -s ' ' | cut -d' ' -f2- | tr ' ' '\n' | grep -v '^$'" - -[preview] -command = "awk '/^Host / { found=0 } /^Host (.*[[:space:]])?'{}'([[:space:]].*)?$/ { found=1 } found' $HOME/.ssh/config" - -[keybindings] -enter = "actions:connect" - -[actions.connect] -description = "SSH into the selected host" -command = "ssh {}" -mode = "execute" diff --git a/television/cable/systemd-units.toml b/television/cable/systemd-units.toml deleted file mode 100644 index fe8c6c2..0000000 --- a/television/cable/systemd-units.toml +++ /dev/null @@ -1,49 +0,0 @@ -[metadata] -name = "systemd-units" -description = "List and manage systemd services" -requirements = ["systemctl"] - -[source] -command = [ - { name = "Active", run = "systemctl list-units --type=service --no-pager --no-legend --plain" }, - { name = "All", run = "systemctl list-units --type=service --all --no-pager --no-legend --plain" }, -] -display = "{split: :0}" - -[preview] -command = "systemctl status '{split: :0}' --no-pager" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-s = "actions:start" -f2 = "actions:stop" -ctrl-r = "actions:restart" -ctrl-e = "actions:enable" -ctrl-d = "actions:disable" - -[actions.start] -description = "Start the selected service" -command = "sudo systemctl start '{split: :0}'" -mode = "execute" - -[actions.stop] -description = "Stop the selected service" -command = "sudo systemctl stop '{split: :0}'" -mode = "execute" - -[actions.restart] -description = "Restart the selected service" -command = "sudo systemctl restart '{split: :0}'" -mode = "execute" - -[actions.enable] -description = "Enable the selected service" -command = "sudo systemctl enable '{split: :0}'" -mode = "execute" - -[actions.disable] -description = "Disable the selected service" -command = "sudo systemctl disable '{split: :0}'" -mode = "execute" diff --git a/television/cable/tailscale-exit-node.toml b/television/cable/tailscale-exit-node.toml deleted file mode 100644 index 099b8ac..0000000 --- a/television/cable/tailscale-exit-node.toml +++ /dev/null @@ -1,18 +0,0 @@ -[metadata] -name = "tailscale-exit-node" -description = "A channel to select a tailscale exit node" -requirements = ["tailscale", "awk"] - -[source] -command = "tailscale exit-node list | awk '/^[[:space:]]*[0-9]+\\./ {gsub(/^[[:space:]]+/, \"\"); print $1}'" - -[preview] -command = "tailscale whois {}" - -[keybindings] -enter = "actions:connect" - -[actions.connect] -description = "Set selected host as exit node" -command = "tailscale set --exit-node={}" -mode = "execute" diff --git a/television/cable/tea-issues.toml b/television/cable/tea-issues.toml deleted file mode 100644 index fa78a2e..0000000 --- a/television/cable/tea-issues.toml +++ /dev/null @@ -1,36 +0,0 @@ -[metadata] -name = "tea-issues" -description = "List Gitea issues for the current repo" -requirements = ["tea", "jq"] - -[source] -command = '''tea issues list --output json --state open 0 then "\u001b[36mLabels:\u001b[39m " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] -| join(" ")) else empty end), -"", -"\u001b[90m────────────────────────────────────────────────────────────\u001b[39m", -"", -(.body // "") -' -''' - -[actions.close] -description = "Close the selected issue" -command = "tea issues close {strip_ansi|split:#:1|split:\t:0}" -mode = "fork" diff --git a/television/cable/tea-prs.toml b/television/cable/tea-prs.toml deleted file mode 100644 index 9f62e5e..0000000 --- a/television/cable/tea-prs.toml +++ /dev/null @@ -1,42 +0,0 @@ -[metadata] -name = "tea-prs" -description = "List Gitea PRs for the current repo" -requirements = ["tea", "jq"] - -[source] -command = '''tea pulls list --output json --state open 0 then "\u001b[36mLabels:\u001b[39m " + ([.labels[] | "\u001b[35m" + .name + "\u001b[39m"] | join(" ")) else empty end), -"\u001b[36mMergeable:\u001b[39m " + (if .mergeable then "\u001b[32m✓ Clean\u001b[39m" else "\u001b[31m✗ Dirty\u001b[39m" end), -"", -"\u001b[90m────────────────────────────────────────────────────────────\u001b[39m", -"", -(.body // "") -' -''' - -[actions.checkout] -description = "Checkout the PR branch locally" -command = "tea pulls checkout {strip_ansi|split:#:1|split:\t:0}" -mode = "execute" - -[actions.merge] -description = "Merge the selected PR" -command = "tea pulls merge {strip_ansi|split:#:1|split:\t:0}" -mode = "execute" diff --git a/television/cable/text.toml b/television/cable/text.toml deleted file mode 100644 index d7544ff..0000000 --- a/television/cable/text.toml +++ /dev/null @@ -1,29 +0,0 @@ -[metadata] -name = "text" -description = "A channel to find and select text from files" -requirements = ["rg", "bat"] - -[source] -command = [ - { name = "Default", run = "rg . --no-heading --line-number --colors 'match:fg:white' --colors 'path:fg:blue' --color=always" }, - { name = "Hidden", run = "rg . --no-heading --line-number --hidden --colors 'match:fg:white' --colors 'path:fg:blue' --color=always" }, -] -ansi = true -output = "{strip_ansi|split:\\::..2}" - -[preview] -command = "bat -n --color=always '{strip_ansi|split:\\::0}'" -env = { BAT_THEME = "ansi" } -offset = '{strip_ansi|split:\::1}' - -[ui] -preview_panel = { header = '{strip_ansi|split:\::..2}', border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[keybindings] -enter = "actions:edit" - -[actions.edit] -description = "Open file in editor at line" -command = "${EDITOR:-vim} '+{strip_ansi|split:\\::1}' '{strip_ansi|split:\\::0}'" -shell = "bash" -mode = "execute" diff --git a/television/cable/tldr.toml b/television/cable/tldr.toml deleted file mode 100644 index 884b453..0000000 --- a/television/cable/tldr.toml +++ /dev/null @@ -1,21 +0,0 @@ -[metadata] -name = "tldr" -description = "Browse and preview TLDR help pages for command-line tools" -requirements = ["tldr"] - -[source] -command = "tldr --list" - -[preview] -command = "tldr '{0}' --color always" - -[ui] -layout = "portrait" - -[keybindings] -ctrl-e = "actions:open" - -[actions.open] -description = "Open the selected TLDR page" -command = "tldr '{0}'" -mode = "execute" diff --git a/television/cable/tmux-sessions.toml b/television/cable/tmux-sessions.toml deleted file mode 100644 index 6e77d24..0000000 --- a/television/cable/tmux-sessions.toml +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -name = "tmux-sessions" -description = "List and manage tmux sessions" -requirements = ["tmux"] - -[source] -command = "tmux list-sessions -F '#{session_name}\t#{session_windows} windows\t#{session_created_string}'" -display = "{split:\t:0} ({split:\t:1})" -output = "{split:\t:0}" - -[preview] -command = "tmux capture-pane -t '{split:\t:0}' -p 2>/dev/null || echo 'No preview available'" - -[actions.attach] -description = "Attach to the selected session" -command = "tmux attach-session -t '{split:\t:0}'" -mode = "execute" - -[actions.kill] -description = "Kill the selected session" -command = "tmux kill-session -t '{split:\t:0}'" -mode = "fork" diff --git a/television/cable/tmux-windows.toml b/television/cable/tmux-windows.toml deleted file mode 100644 index 557e259..0000000 --- a/television/cable/tmux-windows.toml +++ /dev/null @@ -1,22 +0,0 @@ -[metadata] -name = "tmux-windows" -description = "List and switch between tmux windows" -requirements = ["tmux"] - -[source] -command = "tmux list-windows -a -F '#{session_name}:#{window_index}\t#{window_name}\t#{pane_current_command}'" -display = "{split:\t:0} - {split:\t:1} ({split:\t:2})" -output = "{split:\t:0}" - -[preview] -command = "tmux capture-pane -t '{split:\t:0}' -p 2>/dev/null || echo 'No preview available'" - -[actions.select] -description = "Switch to the selected window" -command = "tmux select-window -t '{split:\t:0}'" -mode = "execute" - -[actions.kill] -description = "Kill the selected window" -command = "tmux kill-window -t '{split:\t:0}'" -mode = "fork" diff --git a/television/cable/todo-comments.toml b/television/cable/todo-comments.toml deleted file mode 100644 index e3e049b..0000000 --- a/television/cable/todo-comments.toml +++ /dev/null @@ -1,26 +0,0 @@ -[metadata] -name = "todo-comments" -description = "Find TODO, FIXME, HACK, and XXX comments in codebase" -requirements = ["rg", "bat"] - -[source] -command = "rg -n --color=always '(TODO|FIXME|HACK|XXX|BUG|WARN):?'" -ansi = true -output = "{strip_ansi|split:\\::..2}" - -[preview] -command = "bat -n --color=always --highlight-line '{strip_ansi|split:\\::1}' '{strip_ansi|split:\\::0}'" -env = { BAT_THEME = "ansi" } -offset = "{strip_ansi|split:\\::1}" - -[ui] -preview_panel = { header = "{strip_ansi|split:\\::..2}", border_type = "none", scrollbar = false, padding = { left = 2, right = 1, top = 0, bottom = 0 } } - -[keybindings] -enter = "actions:edit" - -[actions.edit] -description = "Open file in editor at the comment" -command = "${EDITOR:-vim} '+{strip_ansi|split:\\::1}' '{strip_ansi|split:\\::0}'" -shell = "bash" -mode = "execute" diff --git a/television/cable/unicode.toml b/television/cable/unicode.toml deleted file mode 100644 index c96a6cf..0000000 --- a/television/cable/unicode.toml +++ /dev/null @@ -1,43 +0,0 @@ -[metadata] -name = "unicode" -description = '''Search and insert unicode characters - -The UnicodeData.txt file is included by many packages. - -In addition to: - -Alpine Linux: unicode-character-database -Arch: unicode-character-database -Debian/Ubuntu: unicode-data -Fedora / RHEL / CentOS unicode-ucd -Gentoo: app-i18n/unicode-data -NixOS: unicode/unicode-data -openSUSE: unicode-ucd - -UnicodData.txt may also aleady be provided by: - -1) Many java packages -2) Latex packages -3) Still others - -It may in some cases be necessary to alter UNICODE_FILE below. - -''' -requirements = ["awk", "perl"] - -[source] -command = ''' -UNICODE_FILE="/usr/share/unicode/ucd/UnicodeData.txt" -awk -F';' ' - $2 !~ /^/dev/null | grep -v '^:' | sort -t: -k2 -rn" -display = "{split:\\::0} ({split:\\::1}% {split:\\::2})" -output = "{split:\\::0}" - -[preview] -command = "nmcli -t -f SSID,BSSID,MODE,FREQ,SIGNAL,SECURITY,ACTIVE device wifi list 2>/dev/null | grep '^{split:\\::0}:'" - -[actions.connect] -description = "Connect to the selected network" -command = "nmcli device wifi connect '{split:\\::0}'" -mode = "execute" diff --git a/television/cable/zoxide.toml b/television/cable/zoxide.toml deleted file mode 100644 index aa69084..0000000 --- a/television/cable/zoxide.toml +++ /dev/null @@ -1,26 +0,0 @@ -[metadata] -name = "zoxide" -description = "Browse zoxide directory history" -requirements = ["zoxide"] - -[source] -command = "zoxide query -l" -no_sort = true -frecency = false - -[preview] -command = "ls -la --color=always '{}'" - -[keybindings] -enter = "actions:cd" -ctrl-d = "actions:remove" - -[actions.cd] -description = "Change to the selected directory" -command = "cd {} && $SHELL" -mode = "execute" - -[actions.remove] -description = "Remove the selected directory from zoxide" -command = "zoxide remove {}" -mode = "fork" diff --git a/television/cable/zsh-history.toml b/television/cable/zsh-history.toml deleted file mode 100644 index 6bc8f90..0000000 --- a/television/cable/zsh-history.toml +++ /dev/null @@ -1,16 +0,0 @@ -[metadata] -name = "zsh-history" -description = "A channel to select from your zsh history" -requirements = ["zsh"] - -[source] -command = "sed '1!G;h;$!d' ${HISTFILE:-${HOME}/.zsh_history}" -display = "{split:;:1..}" -output = "{split:;:1..}" -no_sort = true -frecency = false - -[actions.execute] -description = "Execute the selected command" -command = "zsh -c '{split:;:1..}'" -mode = "execute" diff --git a/television/config.toml b/television/config.toml deleted file mode 100644 index 9faebd7..0000000 --- a/television/config.toml +++ /dev/null @@ -1,256 +0,0 @@ -# CONFIGURATION FILE LOCATION ON YOUR SYSTEM: -# ------------------------------------------- -# Defaults: -# --------- -# Linux: `$HOME/.config/television/config.toml` -# macOS: `$HOME/.config/television/config.toml` -# Windows: `%LocalAppData%\television\config\config.toml` -# -# XDG dirs: -# --------- -# You may use XDG_CONFIG_HOME if set on your system. -# In that case, television will expect the configuration file to be in: -# `$XDG_CONFIG_HOME/television/config.toml` -# - -# General settings -# ---------------------------------------------------------------------------- -tick_rate = 50 -default_channel = "files" -# Shell settings -# -------------- -# Default shell used for executing commands (source, preview, actions). -# Options: bash, zsh, fish, powershell, cmd, nu -# If not specified, the shell is detected from the environment ($SHELL on Unix). -# Channel-specific shell settings override this global setting. -# shell = "bash" -# History settings -# --------------- -# Maximum number of entries to keep in the global history (default: 100) -# The history tracks search queries across all channels and sessions -# Set to 0 to disable history functionality entirely -history_size = 200 -# Whether to use global history (default: false) -# When true: history navigation shows entries from all channels -# When false: history navigation is scoped to the current channel -global_history = false - -[ui] -# How much space to allocate for the UI (in percentage of the screen) -# ┌─────────────────────────┐ -# │ Terminal screen │ -# │ ┌───────────────────┐ │ -# │ │ │ │ -# │ │ Television UI │ │ -# │ │ │ │ -# │ └───────────────────┘ │ -# │ │ -# └─────────────────────────┘ -ui_scale = 100 -# What orientation should tv be (landscape or portrait) -orientation = "landscape" -# The theme to use for the UI: themes/cyberdream-transparent.toml in this -# config dir (a builtin theme shadows a user theme of the same name). -theme = "cyberdream-transparent" - -# Minimal UI: no borders, no status bar, no scrollbar — padding alone -# separates the panels. tv 0.15 has no config key for inline -# mode (--inline / --height are CLI-only), so every call site in the shells, -# pj and the cables passes --inline. A channel that sets its own -# [ui.preview_panel] resets these fields to tv's defaults (rounded border), -# so cables leave that table alone. -[ui.input_bar] -# Where to place the input bar in the UI (top or bottom) -position = "top" -prompt = "❯" -# header = "{}" -border_type = "none" -# a blank row between the query and the results -padding = { left = 1, right = 1, top = 0, bottom = 1 } - -[ui.status_bar] -separator_open = "" -separator_close = "" -# f12 toggles it back -hidden = true - -[ui.results_panel] -border_type = "none" -padding = { left = 1, right = 1, top = 0, bottom = 0 } - -[ui.preview_panel] -# Preview panel size (percentage of screen width/height) -size = 50 -#header = "" -#footer = "" -scrollbar = false -border_type = "none" -padding = { left = 2, right = 1, top = 0, bottom = 0 } -hidden = false - -[ui.help_panel] -# Whether to split the help panel by categories -show_categories = true -hidden = true - -[ui.remote_control] -# Whether to show channel descriptions in remote control mode -show_channel_descriptions = true -# Whether to sort channels alphabetically -sort_alphabetically = true -# disabled = false - -# Theme color overrides -# --------------------- -# You can override specific colors from the selected theme by adding them here. -# This allows you to customize the appearance without creating a full theme file. -# Colors can be specified as ANSI color names (e.g., "red", "bright-blue") or -# as hex values (e.g., "#ff0000", "#1e1e2e"). -# -# Example overrides: -# [ui.theme_overrides] -# background = "#000000" -# text_fg = "#ffffff" -# selection_bg = "#444444" -# match_fg = "#ff0000" - -# Keybindings and Events -# ---------------------------------------------------------------------------- -# -[keybindings] -# Application control -# ------------------ -esc = "quit" -ctrl-c = "quit" - -# Navigation and selection -# ----------------------- -down = "select_next_entry" -ctrl-n = "select_next_entry" -ctrl-j = "select_next_entry" -up = "select_prev_entry" -ctrl-p = "select_prev_entry" -ctrl-k = "select_prev_entry" - -# History navigation -# ----------------- -ctrl-up = "select_prev_history" -ctrl-down = "select_next_history" - -# Multi-selection -# -------------- -tab = "toggle_selection_down" -backtab = "toggle_selection_up" -enter = "confirm_selection" - -# Preview panel control -# -------------------- -pagedown = "scroll_preview_half_page_down" -pageup = "scroll_preview_half_page_up" -ctrl-f = "cycle_previews" - -# Data operations -# -------------- -ctrl-y = "copy_entry_to_clipboard" -ctrl-r = "reload_source" -ctrl-s = "cycle_sources" - -# UI Features -# ---------- -ctrl-t = "toggle_remote_control" -ctrl-x = "toggle_action_picker" -ctrl-o = "toggle_preview" -# ctrl-h/ctrl-e run the current channel's actions (files: goto_parent_dir, -# edit in nvim — see cable/files.toml); `end` still jumps to input end. -ctrl-h = "actions:goto_parent_dir" -f12 = "toggle_status_bar" -ctrl-l = "toggle_layout" - -# Input field actions -# ---------------------------------------- -backspace = "delete_prev_char" -ctrl-w = "delete_prev_word" -ctrl-u = "delete_line" -delete = "delete_next_char" -left = "go_to_prev_char" -right = "go_to_next_char" -home = "go_to_input_start" -ctrl-a = "go_to_input_start" -end = "go_to_input_end" -ctrl-e = "actions:edit" - -# Shell integration -# ---------------------------------------------------------------------------- -# -# The shell integration feature allows you to use television as a picker for -# your shell commands (as well as your shell history with ). -# E.g. typing `git checkout ` will open television with a list of -# branches to choose from. - -[shell_integration] -# This specifies the default fallback channel if no other channel is matched. -fallback_channel = "files" - -[shell_integration.channel_triggers] -# Add your channel triggers here. Each key is a channel that will be triggered -# by the corresponding commands. -# Example: say you want the following commands to trigger the following channels -# when pressing : -# `git checkout` should trigger the `git-branches` channel -# `ls` should trigger the `dirs` channel -# `cat` and `cp` should trigger the `files` channel -# -# You would add the following to your configuration file: -# ``` -# [shell_integration.channel_triggers] -# "git-branches" = ["git checkout"] -# "dirs" = ["ls"] -# "files" = ["cat", "cp"] -# ``` -"alias" = ["alias", "unalias"] -"env" = ["export", "unset"] -"dirs" = ["cd", "ls", "rmdir", "z"] -"files" = [ - "cat", - "less", - "head", - "tail", - "vim", - "nano", - "bat", - "cp", - "mv", - "rm", - "touch", - "chmod", - "chown", - "ln", - "tar", - "zip", - "unzip", - "gzip", - "gunzip", - "xz", -] -"git-diff" = ["git add", "git restore"] -"git-branch" = [ - "git checkout", - "git switch", - "git branch", - "git merge", - "git rebase", - "git pull", - "git push", -] -"git-log" = ["git log", "git show"] -"docker-images" = ["docker run"] -"git-repos" = ["nvim", "code", "hx", "git clone"] - - -[shell_integration.keybindings] -# controls which key binding should trigger tv -# for shell autocomplete -"smart_autocomplete" = "ctrl-t" -# controls which keybinding should trigger tv -# for command history -"command_history" = "ctrl-r" diff --git a/television/themes/cyberdream-transparent.toml b/television/themes/cyberdream-transparent.toml deleted file mode 100644 index ef61c8d..0000000 --- a/television/themes/cyberdream-transparent.toml +++ /dev/null @@ -1,29 +0,0 @@ -# cyberdream-transparent — https://github.com/scottmckendry/cyberdream.nvim -# Same palette as the kitty, fish, atuin, bat and yazi cyberdream themes. -# Differs from tv's builtin `cyberdream` (which shadows a user theme of that -# name): no `background`, so tv draws on kitty's own translucent #16181a -# (tv 0.15 rejects `background = 'none'` and falls back to the default theme). - -# general -border_fg = '#3c4048' -text_fg = '#ffffff' -dimmed_text_fg = '#7b8496' -# input -input_text_fg = '#ffffff' -result_count_fg = '#ffbd5e' -# results -result_name_fg = '#5ea1ff' -result_line_number_fg = '#f1ff5e' -result_value_fg = '#ffffff' -selection_fg = '#5eff6c' -selection_bg = '#3c4048' -match_fg = '#5ef1ff' -# preview -preview_title_fg = '#ffaecf' -# modes -channel_mode_fg = '#16181a' -channel_mode_bg = '#5ef1ff' -remote_control_mode_fg = '#16181a' -remote_control_mode_bg = '#5eff6c' -action_picker_mode_fg = '#16181a' -action_picker_mode_bg = '#bd5eff' diff --git a/yazi/flavors/cyberdream.yazi/flavor.toml b/yazi/flavors/cyberdream.yazi/flavor.toml deleted file mode 100644 index 14313fe..0000000 --- a/yazi/flavors/cyberdream.yazi/flavor.toml +++ /dev/null @@ -1,92 +0,0 @@ -#:schema https://yazi-rs.github.io/schemas/theme.json - -[mgr] - -# tmTheme files can be found here: https://github.com/scottmckendry/cyberdream.nvim/tree/main/extras/textmate -syntect_theme = "~/.config/bat/themes/cyberdream.tmTheme" - -border_style = { fg = "#3c4048" } -cwd = { fg = "#5ef1ff" } -find_keyword = { bold = true, fg = "#5eff6c" } -find_position = { fg = "#ffffff" } -marker_copied = { bg = "#f1ff5e", fg = "#f1ff5e" } -marker_cut = { bg = "#ff6e5e", fg = "#ff6e5e" } -marker_selected = { bg = "#3c4048", fg = "#5eff6c" } -count_selected = { bg = "#5eff6c", fg = "#16181a" } -count_copied = { bg = "#f1ff5e", fg = "#16181a" } -count_cut = { bg = "#ff6e5e", fg = "#16181a" } - -[cmp] -active = { bg = "#7b8496", fg = "#bd5eff" } -border = { fg = "#5ea1ff" } -inactive = { fg = "#ffffff" } - -[tabs] -active = { bg = "#5ea1ff", fg = "#16181a" } -inactive = { bg = "#3c4048", fg = "#ffffff" } - -[filetype] -rules = [ - { fg = "#5ef1ff", mime = "image/*" }, - { fg = "#f1ff5e", mime = "video/*" }, - { fg = "#f1ff5e", mime = "audio/*" }, - { fg = "#bd5eff", mime = "application/zip" }, - { fg = "#bd5eff", mime = "application/gzip" }, - { fg = "#bd5eff", mime = "application/x-tar" }, - { fg = "#bd5eff", mime = "application/x-bzip" }, - { fg = "#bd5eff", mime = "application/x-bzip2" }, - { fg = "#bd5eff", mime = "application/x-7z-compressed" }, - { fg = "#bd5eff", mime = "application/x-rar" }, - { fg = "#bd5eff", mime = "application/xz" }, - { fg = "#5eff6c", mime = "application/doc" }, - { fg = "#5eff6c", mime = "application/pdf" }, - { fg = "#5eff6c", mime = "application/rtf" }, - { fg = "#5eff6c", mime = "application/vnd.*" }, - { bold = true, fg = "#5ea1ff", mime = "inode/directory" }, - { fg = "#ffffff", mime = "*" } -] - -[help] -desc = { fg = "#ffffff" } -footer = { fg = "#ffffff" } -hovered = { bg = "#7b8496", fg = "#ffffff" } -on = { fg = "#bd5eff" } -run = { fg = "#5ef1ff" } - -[input] -border = { fg = "#5ea1ff" } -selected = { bg = "#7b8496" } -title = { fg = "#ffffff" } -value = { fg = "#ffffff" } - -[pick] -active = { fg = "#bd5eff" } -border = { fg = "#5ea1ff" } -inactive = { fg = "#ffffff" } - -[mode] -normal_main = { bg = "#5ea1ff", bold = true, fg = "#16181a" } -select_main = { bg = "#5eff6c", bold = true, fg = "#16181a" } -unset_main = { bg = "#ff5ef1", bold = true, fg = "#16181a" } - -[status] -perm_sep = { fg = "#5ef1ff" } -perm_type = { fg = "#5ea1ff" } -perm_read = { fg = "#f1ff5e" } -perm_write = { fg = "#ff6e5e" } -perm_exec = { fg = "#5eff6c" } -progress_error = { bg = "#16181a", fg = "#ff6e5e" } -progress_label = { bg = "#16181a", fg = "#ffffff" } -progress_normal = { bg = "#16181a", fg = "#ffffff" } - -[tasks] -border = { fg = "#5ea1ff" } -hovered = { bg = "#7b8496", fg = "#ffffff" } -title = { fg = "#ffffff" } - -[which] -cand = { fg = "#5ef1ff" } -desc = { fg = "#ffffff" } -mask = { bg = "#3c4048" } -rest = { fg = "#ff5ef1" } -separator_style = { fg = "#7b8496" } diff --git a/yazi/flavors/ii-auto.yazi/flavor.toml b/yazi/flavors/ii-auto.yazi/flavor.toml deleted file mode 100644 index b9e4190..0000000 --- a/yazi/flavors/ii-auto.yazi/flavor.toml +++ /dev/null @@ -1,88 +0,0 @@ -# Auto-generated by ii wallpaper theming system -# Do not edit manually - changes will be overwritten - -[mgr] -cwd = { fg = "#FFFFFF" } -hovered = { fg = "#1D1D1D", bg = "#FFFFFF" } -preview_hovered = { underline = true } -find_keyword = { fg = "#FFF17B", italic = true } -find_position = { fg = "#D7B0FF", bg = "reset", italic = true } -marker_selected = { fg = "#00FD98", bg = "#00FD98" } -marker_copied = { fg = "#FFF17B", bg = "#FFF17B" } -marker_cut = { fg = "#FF9BAD", bg = "#FF9BAD" } -tab_active = { fg = "#1D1D1D", bg = "#1F1F1F" } -tab_inactive = { fg = "#ADAAA2", bg = "#1F1F1F" } -tab_width = 1 -border_symbol = "│" -border_style = { fg = "#8F9192" } -count_copied = { fg = "#1D1D1D", bg = "#FFF17B" } -count_cut = { fg = "#1D1D1D", bg = "#FF9BAD" } -count_selected = { fg = "#1D1D1D", bg = "#FFFFFF" } - -[mode] -normal_main = { fg = "#1D1D1D", bg = "#FFFFFF", bold = true } -normal_alt = { fg = "#1D1D1D", bg = "#FFFFFF", bold = true } -select_main = { fg = "#1D1D1D", bg = "#00FD98", bold = true } -select_alt = { fg = "#1D1D1D", bg = "#00FD98", bold = true } -unset_main = { fg = "#1D1D1D", bg = "#D7B0FF", bold = true } -unset_alt = { fg = "#1D1D1D", bg = "#D7B0FF", bold = true } - -[status] -separator_open = "" -separator_close = "" -separator_style = { fg = "#1F1F1F", bg = "#1F1F1F" } -progress_label = { fg = "#DFE3E3", bold = true } -progress_normal = { fg = "#FFFFFF", bg = "#1F1F1F" } -progress_error = { fg = "#FF9BAD", bg = "#1F1F1F" } -permissions_t = { fg = "#FFFFFF" } -permissions_r = { fg = "#FFF17B" } -permissions_w = { fg = "#FF9BAD" } -permissions_x = { fg = "#00FD98" } -permissions_s = { fg = "#8F9192" } - -[input] -border = { fg = "#FFFFFF" } -title = {} -value = {} -selected = { reversed = true } - -[select] -border = { fg = "#FFFFFF" } -active = { fg = "#D7B0FF", bold = true } -inactive = {} - -[tasks] -border = { fg = "#FFFFFF" } -title = {} -hovered = { underline = true } - -[which] -mask = { bg = "#1F1F1F" } -cand = { fg = "#3DF0F5" } -rest = { fg = "#8F9192" } -desc = { fg = "#D7B0FF" } -separator = " " -separator_style = { fg = "#8F9192" } - -[help] -on = { fg = "#D7B0FF" } -run = { fg = "#3DF0F5" } -desc = { fg = "#8F9192" } -hovered = { bg = "#1F1F1F", bold = true } -footer = { fg = "#1F1F1F", bg = "#ADAAA2" } - -[filetype] -rules = [ - { mime = "image/*", fg = "#D7B0FF" }, - { mime = "video/*", fg = "#3DF0F5" }, - { mime = "audio/*", fg = "#3DF0F5" }, - { mime = "application/zip", fg = "#FF9BAD" }, - { mime = "application/gzip", fg = "#FF9BAD" }, - { mime = "application/x-tar", fg = "#FF9BAD" }, - { mime = "application/x-bzip", fg = "#FF9BAD" }, - { mime = "application/x-bzip2", fg = "#FF9BAD" }, - { mime = "application/x-7z-compressed", fg = "#FF9BAD" }, - { mime = "application/x-rar", fg = "#FF9BAD" }, - { name = "*", fg = "#ADAAA2" }, - { name = "*/", fg = "#FFFFFF" }, -] diff --git a/yazi/init.lua b/yazi/init.lua deleted file mode 100644 index 20ad504..0000000 --- a/yazi/init.lua +++ /dev/null @@ -1,29 +0,0 @@ -require("sshfs"):setup() - -require("bunny"):setup({ - hops = { - { key = "/", path = "/", }, - { key = "t", path = "/tmp", }, - { key = "~", path = "~", desc = "Home" }, - { key = "m", path = "~/Music", desc = "Music" }, - { key = "d", path = "~/Desktop", desc = "Desktop" }, - { key = "D", path = "~/Developer", desc = "Developer" }, - { key = "c", path = "~/.config", desc = "Config files" }, - { key = { "l", "s" }, path = "~/.local/share", desc = "Local share" }, - { key = { "l", "b" }, path = "~/.local/bin", desc = "Local bin" }, - { key = { "l", "t" }, path = "~/.local/state", desc = "Local state" }, - -- key and path attributes are required, desc is optional - }, - desc_strategy = "path", -- If desc isn't present, use "path" or "filename", default is "path" - ephemeral = true, -- Enable ephemeral hops, default is true - tabs = true, -- Enable tab hops, default is true - notify = false, -- Notify after hopping, default is false - fuzzy_cmd = "fzf", -- Fuzzy searching command, default is "fzf" -}) - -require("git"):setup { - -- Order of status signs showing in the linemode - order = 1500, -} - -require("no-status"):setup() diff --git a/yazi/keymap.toml b/yazi/keymap.toml deleted file mode 100644 index fef7753..0000000 --- a/yazi/keymap.toml +++ /dev/null @@ -1,180 +0,0 @@ -[[mgr.prepend_keymap]] -on = "F" -run = "plugin smart-filter" -desc = "Smart filter" - -[[mgr.prepend_keymap]] -on = ["g", "r"] -run = 'shell -- ya emit cd "$(git rev-parse --show-toplevel)"' -desc = "Go to git root" - -[[mgr.prepend_keymap]] -on = ["g", "C"] -run = 'shell -- ya emit cd "$HOME/.local/share/chezmoi"' -desc = "Go to chezmoi root" - -[[mgr.prepend_keymap]] -desc = "Start bunny.yazi" -on = ";" -run = "plugin bunny" - -# Optionally, add another keymap to immediately fuzzy search bookmarks -[[mgr.prepend_keymap]] -desc = "Start bunny.yazi fuzzy search" -on = "'" -run = "plugin bunny fuzzy" - -[[mgr.prepend_keymap]] -on = ["g", "d"] -run = 'shell -- ya emit cd "$HOME/Downloads"' -desc = "Go to ~/Downloads" - -[[mgr.prepend_keymap]] -on = ["g", "D", "d"] -run = 'shell -- ya emit cd "$GHQ_ROOT/github.com"' -desc = "Go to ~/Developer" - -[[mgr.prepend_keymap]] -on = ["g", "D", "w"] -run = 'shell -- ya emit cd "$GHQ_ROOT/github.com/wltbs"' -desc = "Go to ~/Developer/wltbs" - -[[mgr.prepend_keymap]] -on = ["g", "D", "p"] -run = 'shell -- ya emit cd "$GHQ_ROOT/github.com/prdlk"' -desc = "Go to ~/Developer/prdlk" - -[[mgr.prepend_keymap]] -on = ["g", "l"] -run = 'shell -- ya emit cd "$HOME/.local"' -desc = "Go to ~/.local" - -[[mgr.prepend_keymap]] -on = ["g", "o", "p"] -run = 'shell -- ya emit cd "$HOME/Documents/Obsidian/Personal"' -desc = "Open Personal Obsidian" - -[[mgr.prepend_keymap]] -on = ["g", "o", "r"] -run = 'shell -- ya emit cd "$HOME/Documents/Obsidian/Research"' -desc = "Open Research Obsidian" - -[[mgr.prepend_keymap]] -on = ["g", "o", "w"] -run = 'shell -- ya emit cd "$HOME/Documents/Obsidian/Walletbase"' -desc = "Open Walletbase Obsidian" - -[[mgr.prepend_keymap]] -on = ["g", "p"] -run = 'shell -- ya emit cd "$HOME/Pictures"' -desc = "Go to Pictures" - -[[mgr.prepend_keymap]] -on = ["g", "b"] -run = "back" -desc = "Go to previous directory" - -[[mgr.prepend_keymap]] -on = ["g", "f"] -run = "forward" -desc = "Go forward to next directory" - -[[mgr.prepend_keymap]] -on = ["g", "m", "p"] -run = "cd sftp://gdrive-personal" -desc = "Mount & Go to Personal Drive" - -[[mgr.prepend_keymap]] -on = ["g", "m", "s"] -run = "cd sftp://gdrive-sonr" -desc = "Mount & Go to Sonr Drive" - -[[mgr.prepend_keymap]] -on = ["g", "m", "h"] -run = "cd sftp://gdrive-hyperauth" -desc = "Mount & Go to HyperAuth Drive" - -[[mgr.prepend_keymap]] -on = "" -run = "quit" -desc = "Quit" - -[[mgr.prepend_keymap]] -on = "" -run = 'shell "$SHELL" --block' -desc = "Drop to shell in the current directory" - -[[mgr.prepend_keymap]] -on = "l" -run = "plugin smart-enter" -desc = "Enter the child directory, or open the file" - -[[mgr.prepend_keymap]] -on = "" -run = "plugin tv" -desc = "Jump to a file via television" - -[[mgr.prepend_keymap]] -on = "" -run = "plugin tv ghq" -desc = "Jump to a ghq repo via television" - - -[[mgr.prepend_keymap]] -on = "" -run = "plugin tv dirs" -desc = "Jump to a directory via television" - -[[mgr.prepend_keymap]] -on = "" -run = "plugin tv text" -desc = "Open files using neovim and jump to where the string is located" - - -# Open in the host nvim as splits (only inside an nvim terminal; no-ops in -# standalone yazi — see ~/.local/bin/yazi-nvim-open). Replaces yazi.nvim's -# / buffer-local maps. -[[mgr.prepend_keymap]] -on = "" -run = 'shell -- yazi-nvim-open vsplit %s' -desc = "Open in nvim vertical split" - -[[mgr.prepend_keymap]] -on = "" -run = 'shell -- yazi-nvim-open split %s' -desc = "Open in nvim horizontal split" - -[[mgr.prepend_keymap]] -on = "A" -run = "create --dir" -desc = "Create a directory" - -[[mgr.prepend_keymap]] -on = "N" -run = "bulk_create" -desc = "Bulk create files" - -[[mgr.prepend_keymap]] -on = "" -run = "plugin split-tabs spl_toggle" -desc = "Split-tabs: toggle split tabs mode" - -[[mgr.prepend_keymap]] -on = "" -run = "plugin split-tabs spl_switch_tab" -desc = "Split-tabs: switch to the other pane" - -[[mgr.prepend_keymap]] -on = "" -run = ["escape --visual", "plugin split-tabs spl_copy"] -desc = "Split-tabs: copy to the other pane" - -[[mgr.prepend_keymap]] -on = "" -run = ["escape --visual", "plugin split-tabs spl_move"] -desc = "Split-tabs: move to the other pane" - -[[mgr.prepend_keymap]] -on = "P" -run = "plugin split-tabs spl_preview" -desc = "Split-tabs: toggle preview pane" diff --git a/yazi/package.toml b/yazi/package.toml deleted file mode 100644 index 162857e..0000000 --- a/yazi/package.toml +++ /dev/null @@ -1,67 +0,0 @@ -[[plugin.deps]] -use = "yazi-rs/plugins:smart-filter" -rev = "efa4d79" -hash = "d6f7351ea25a43c9b5f4315fa1e23935" - -[[plugin.deps]] -use = "uhs-robert/sshfs" -rev = "a8b8903" -hash = "8c1b36103121a66b37308afaf7124575" - -[[plugin.deps]] -use = "yazi-rs/plugins:smart-enter" -rev = "efa4d79" -hash = "187cc58ba7ac3befd49c342129e6f1b6" - -[[plugin.deps]] -use = "yazi-rs/plugins:piper" -rev = "efa4d79" -hash = "45a533508a9840cc5a10cf6129f63e6a" - -[[plugin.deps]] -use = "Rolv-Apneseth/starship" -rev = "ea92cf4" -hash = "9776f378459072b6c2875eae5addc49d" - -[[plugin.deps]] -use = "mikavilpas/easyjump.yazi:easyjump" -rev = "4aa1a06" -hash = "49625b69287597c3b8093c9f1a2f7241" - -[[plugin.deps]] -use = "cap153/tv" -rev = "b6b1f12" -hash = "4bdf0523d3711d20982ad80b061dedf2" - -[[plugin.deps]] -use = "coder0x6675/osc7" -rev = "ae73046" -hash = "4f73595837992eeefcb525c0a95b92ba" - -[[plugin.deps]] -use = "WhoSowSee/mdv-previewer" -rev = "ea4732b" -hash = "fb830053557fbb323c609cb97099a8aa" - -[[plugin.deps]] -use = "yazi-rs/plugins:vcs-files" -rev = "efa4d79" -hash = "853240b2454c93a93fd03fc9fd7e06e8" - -[[plugin.deps]] -use = "yazi-rs/plugins:git" -rev = "efa4d79" -hash = "5bb0bfab901d3601c370eafdd66edd31" - -[[plugin.deps]] -use = "yazi-rs/plugins:no-status" -rev = "efa4d79" -hash = "3e023d31f29201efdac2a6ae35fedb78" - -[[plugin.deps]] -use = "terrakok/split-tabs" -rev = "d0531f4" -hash = "4298f0a23f6109a92334eef06fc7ffb9" - -[flavor] -deps = [] diff --git a/yazi/plugins/bunny.yazi/LICENSE b/yazi/plugins/bunny.yazi/LICENSE deleted file mode 100644 index e5d666c..0000000 --- a/yazi/plugins/bunny.yazi/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ - The MIT License (MIT) - -Copyright © 2024 Stel Clementine - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/yazi/plugins/bunny.yazi/README.md b/yazi/plugins/bunny.yazi/README.md deleted file mode 100644 index 2b06bc6..0000000 --- a/yazi/plugins/bunny.yazi/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# bunny.yazi 🐰 - -*🩷 Hop around your filesystem 🩷* - -This is a bookmark plugin for [yazi](https://github.com/sxyazi/yazi) which augments the builtin bookmarking abilities into a single menu of `cd` powers designed with user experience (and cuteness) in mind. Bookmarks are referred to as *hops* because users should always feel adorable while using their terminal. - -## Features - -- Create persistent hops in your `init.lua` config file -- Create ephemeral hops while using yazi -- Hop to any directory open in another tab -- Hop back to previous directory (history is associated with tab number) -- Hop by fuzzy searching available hops with [fzf](https://github.com/junegunn/fzf) or similar program -- Single menu for all functionality, therefore only one keymap is required in your `keymap.toml` file -- Hands off: no reads or writes to your filesystem, all state is kept in memory - -bunny.yazi menu open in a terminal - -## Installation - -### With `git` - -```sh -git clone https://github.com/stelcodes/bunny.yazi ~/.config/yazi/plugins/bunny.yazi -``` - -### With `yapack` - -```sh -ya pkg add stelcodes/bunny -``` - -### With Nix (Home Manager + flakes) - -`flake.nix`: -```nix -inputs = { - bunny-yazi = { - url = "github:stelcodes/bunny.yazi"; - flake = false; - }; -}; -``` - -Home Manager config: -```nix -programs.yazi = { - plugins.bunny = "${inputs.bunny-yazi}"; - initLua = '' - require("bunny"):setup({ ... }) - ''; - keymap.mgr.prepend_keymap = [ - { on = ";"; run = "plugin bunny"; desc = "Start bunny.yazi"; } - ]; -}; -``` - -## Configuration -`~/.config/yazi/init.lua`: -```lua -require("bunny"):setup({ - hops = { - { key = "/", path = "/", }, - { key = "t", path = "/tmp", }, - { key = "n", path = "/nix/store", desc = "Nix store" }, - { key = "~", path = "~", desc = "Home" }, - { key = "m", path = "~/Music", desc = "Music" }, - { key = "d", path = "~/Desktop", desc = "Desktop" }, - { key = "D", path = "~/Documents", desc = "Documents" }, - { key = "c", path = "~/.config", desc = "Config files" }, - { key = { "l", "s" }, path = "~/.local/share", desc = "Local share" }, - { key = { "l", "b" }, path = "~/.local/bin", desc = "Local bin" }, - { key = { "l", "t" }, path = "~/.local/state", desc = "Local state" }, - -- key and path attributes are required, desc is optional - }, - desc_strategy = "path", -- If desc isn't present, use "path" or "filename", default is "path" - ephemeral = true, -- Enable ephemeral hops, default is true - tabs = true, -- Enable tab hops, default is true - notify = false, -- Notify after hopping, default is false - fuzzy_cmd = "fzf", -- Fuzzy searching command, default is "fzf" -}) -``` - -`~/.config/yazi/keymap.toml`: -```toml -[[mgr.prepend_keymap]] -desc = "Start bunny.yazi" -on = ";" -run = "plugin bunny" - -# Optionally, add another keymap to immediately fuzzy search bookmarks -[[mgr.prepend_keymap]] -desc = "Start bunny.yazi fuzzy search" -on = "'" -run = "plugin bunny fuzzy" -``` - -## Inspiration - -[yamb.yazi](https://github.com/h-hg/yamb.yazi) - -[nnn bookmarks](https://github.com/jarun/nnn/wiki/Basic-use-cases#add-bookmarks) diff --git a/yazi/plugins/bunny.yazi/main.lua b/yazi/plugins/bunny.yazi/main.lua deleted file mode 100644 index a5d04a9..0000000 --- a/yazi/plugins/bunny.yazi/main.lua +++ /dev/null @@ -1,405 +0,0 @@ ---- @since 25.12.29 - ---- @diagnostic disable-next-line:unused-function,unused-local -local function debug(...) - --- @diagnostic disable-next-line:unused-function - local function toReadableString(val) - if type(val) == 'table' then - local str = 'table:{ ' - for k, v in pairs(val) do - str = str .. '[' .. tostring(k) .. '] = ' .. toReadableString(v) .. ', ' - end - return str .. '}' - else - return type(val) .. ':' .. tostring(val) - end - end - local args = { ... } - local processed_args = {} - for _, arg in pairs(args) do - table.insert(processed_args, toReadableString(arg)) - end - if #processed_args == 0 then - processed_args = { 'nil' } - end - ya.dbg('BUNNY.YAZI', table.unpack(processed_args)) -end - -local function fail(s, ...) ya.notify { title = 'bunny.yazi', content = string.format(s, ...), timeout = 4, level = 'error' } end -local function info(s, ...) ya.notify { title = 'bunny.yazi', content = string.format(s, ...), timeout = 2, level = 'info' } end - -local get_state = ya.sync(function(state, attr) - return state[attr] -end) - -local set_state = ya.sync(function(state, attr, value) - state[attr] = value -end) - -local get_cwd = ya.sync(function(_state) - return tostring(cx.active.current.cwd) -- Url objects are evil >.<" -end) - -local get_current_tab_idx = ya.sync(function(_state) - return cx.tabs.idx -end) - -local get_tabs_as_paths = ya.sync(function(_state) - local tabs = cx.tabs - local active_tab_idx = tabs.idx - local result = {} - for idx = 1, #tabs, 1 do - if idx ~= active_tab_idx and tabs[idx] then - result[idx] = tostring(tabs[idx].current.cwd) - end - end - return result -end) - -local some = function(...) - for _, v in ipairs({ ... }) do - if v ~= nil then - return v - end - end -end - -local function filename(pathstr) - if pathstr == '/' then return pathstr end - local url_name = Url(pathstr):name() - if url_name then - return tostring(url_name) - else - return pathstr - end -end - -local function path_to_desc(path, strategy) - if strategy == 'filename' then - return filename(path) - end - local home = os.getenv('HOME') - if home and home ~= '' then - local startPos, endPos = string.find(path, home) - -- Only substitute if the match is from the start of path, very important - if startPos == 1 then - return '~' .. path:sub(endPos + 1) - end - end - return tostring(path) -end - -local function sort_hops(hops) - local function convert_key(key) - local t = type(key) - if t == 'table' then - -- If table, sort by first key string - return key[1] - elseif t == 'string' and string.lower(key) ~= key then - -- If uppercase letter (signifying an ephemeral hop), prepend "z" - -- so it gets sorted after lowercase persistent hops - return 'z' .. key - end - return key - end - table.sort(hops, function(x, y) - return convert_key(x.key) < convert_key(y.key) - end) - return hops -end - -local create_special_hops = function(config) - local hops = {} - local desc_strategy, tabs, ephemeral = config.desc_strategy, config.tabs, config.ephemeral - if ephemeral then - table.insert(hops, { key = '', desc = 'Create hop', path = '__MARK__' }) - end - table.insert(hops, { key = '', desc = 'Fuzzy search', path = '__FUZZY__' }) - local tabhist = get_state('tabhist') - local tab = get_current_tab_idx() - if tabhist[tab] and tabhist[tab][2] then - local previous_dir = tabhist[tab][2] - table.insert(hops, { - key = '', - path = previous_dir, - desc = path_to_desc(previous_dir, desc_strategy) - }) - end - if tabs then - for idx, tab_path in pairs(get_tabs_as_paths()) do - table.insert(hops, { - key = tostring(idx), - path = tab_path, - desc = path_to_desc(tab_path, desc_strategy) - }) - end - end - return hops -end - -local function validate_options(options) - local function validate_key(key) - local kt = type(key) - if not key then - return false, 'key is missing' - elseif kt == 'string' then - if utf8.len(key) ~= 1 then - return false, 'key must be single character' - end - elseif kt == 'table' then - if #key == 0 then - return false, 'key cannot be empty table' - end - for _, char in pairs(key) do - if utf8.len(char) ~= 1 then - return false, 'key list must contain single characters' - end - end - else - return false, 'key must be string or table' - end - return true, '' - end - if type(options) ~= 'table' then - return 'Invalid config' - end - local hops, desc_strategy, tabs, ephemeral, fuzzy_cmd, notify = - options.hops, options.desc_strategy, options.tabs, - options.ephemeral, options.fuzzy_cmd, options.notify - -- Validate hops - if type(hops) == 'table' then - local used_keys = {} - for idx, hop in pairs(hops) do - hop.desc = hop.desc or hop.tag or nil -- used to be tag, allow for backwards compat - local key_is_validated, key_err = validate_key(hop.key) - local err = 'Invalid "hops" config value: #' .. idx .. ' ' - if not key_is_validated then - return err .. key_err - elseif not hop.path then - return err .. 'path is missing' - elseif type(hop.path) ~= 'string' or string.len(hop.path) == 0 then - return err .. 'path must be non-empty string' - elseif hop.desc and (type(hop.desc) ~= 'string' or string.len(hop.path) == 0) then - return err .. 'desc must be non-empty string' - end - -- Check for duplicate keys - if used_keys[hop.key] then - return err .. 'needs unique key' - end - -- Insert hop keys as table keys to easily check for set membership - used_keys[hop.key] = true - end - else - return 'Invalid "hops" config value' - end - -- Validate other options - if desc_strategy ~= nil and desc_strategy ~= 'path' and desc_strategy ~= 'filename' then - return 'Invalid "desc_strategy" config value' - elseif tabs ~= nil and type(notify) ~= 'boolean' then - return 'Invalid "tabs" config value' - elseif ephemeral ~= nil and type(notify) ~= 'boolean' then - return 'Invalid "ephemeral" config value' - elseif fuzzy_cmd ~= nil and type(fuzzy_cmd) ~= 'string' then - return 'Invalid "fuzzy_cmd" config value' - elseif notify ~= nil and type(notify) ~= 'boolean' then - return 'Invalid "notify" config value' - end -end - --- https://github.com/sxyazi/yazi/blob/main/yazi-plugin/preset/plugins/fzf.lua --- https://github.com/sxyazi/yazi/blob/main/yazi-plugin/src/process/child.rs --- Returns nil if fzf command failed or user exited with escape key -local select_fuzzy = function(hops, config) - ---@diagnostic disable-next-line:undefined-field - local permit = ui.hide() - -- child_err is basically a shell error in this case which is useful - local child, child_err = - Command(config.fuzzy_cmd):stdin(Command.PIPED):stdout(Command.PIPED):stderr(Command.INHERIT):spawn() - if child_err then - fail('Command `%s` failed with code %s. Do you have it installed?', config.fuzzy_cmd, child_err.code) - return - elseif not child then - -- Idk how this could ever be reached but I must nil check to make luals happy - fail('Command failed') - return - end - local fuzzy_entries = {} - for _, hop in pairs(hops) do - local existing_desc = fuzzy_entries[hop.path] - if not existing_desc or existing_desc == '' then - local fuzzy_desc = hop.desc - -- Avoid repeating path in description - if fuzzy_desc == hop.path then - fuzzy_desc = '' - end - fuzzy_entries[hop.path] = fuzzy_desc - end - end - -- Build fzf input string - local input_lines = {} - for entry_path, entry_desc in pairs(fuzzy_entries) do - local line = entry_desc .. string.rep(' ', 23 - #entry_desc) .. '\t' .. entry_path - table.insert(input_lines, line) - end - child:write_all(table.concat(input_lines, '\n')) - ---@diagnostic disable-next-line:undefined-field - child:flush() - -- Ignore the second return value (Error) because we can just check if - -- output is nil. - local output = child:wait_with_output() - permit:drop() - if not output then - -- See comment above, not common and impossible to give helpful message - fail('Failed to parse fuzzy searcher result') - return - elseif output and not output.status.success then - if output.status.code ~= 130 then -- user pressed escape to quit - fail('Command `%s` failed with code %s', config.fuzzy_cmd, output.status.code) - end - return - end - -- Parse fzf output, remove right padded spaces from desc - local desc, path = string.match(output.stdout, '^(.-) *\t(.-)\n$') - if not desc or not path or path == '' then - fail('Failed to parse fuzzy searcher result') - return - end - if desc == '' then - desc = path_to_desc(path, config.desc_strategy) - end - return { desc = desc, path = path } -end - -local cd = function(selected_hop, config) - local _, dir_list_err = fs.read_dir(Url(selected_hop.path), { limit = 1, resolve = true }) - if dir_list_err then - fail('Invalid directory ' .. path_to_desc(selected_hop.path)) - return - end - -- Assuming that if I can fs.read_dir, then this will also succeed - ya.emit('cd', { selected_hop.path }) - if config.notify then - info('Hopped to ' .. selected_hop.desc) - end -end - -local attempt_hop = function(hops, config) - local cands = {} - for _, hop in pairs(create_special_hops(config)) do - table.insert(cands, { desc = hop.desc, on = hop.key, path = hop.path }) - end - for _, hop in pairs(hops) do - table.insert(cands, { desc = hop.desc, on = hop.key, path = hop.path }) - end - local hops_idx = ya.which { cands = cands } - if not hops_idx then return end - local selected_hop = cands[hops_idx] - -- Handle special hops - if selected_hop.path == '__MARK__' then - local mark_cands = {}; - -- Ideally any unicode character would be supported, but yazi.which - -- requies a concrete list of candidates - local candidate_chars = { - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', - 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', - 'W', 'X', 'Y', 'Z', '`', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', - '-', '_', '=', '+', '[', '{', ']', '}', '\\', '|', ';', ':', "'", '"', ',', '<', - '.', '>', '/', '?', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' - } - for _, char in pairs(candidate_chars) do - table.insert(mark_cands, { on = char }) - end - info('Press a key to create new hop') - local char_idx = ya.which { cands = mark_cands, silent = true } - if char_idx ~= nil then - local selected_char = mark_cands[char_idx].on - local cwd = get_cwd() - table.insert(hops, { key = selected_char, path = cwd, desc = path_to_desc(cwd, config.desc_strategy) }) - set_state('hops', sort_hops(hops)) - end - return - elseif selected_hop.path == '__FUZZY__' then - local fuzzy_hop = select_fuzzy(hops, config) - if not fuzzy_hop then return end - selected_hop = fuzzy_hop - end - cd(selected_hop, config) -end - -local function init() - local options = get_state('options') - local err = validate_options(options) - if err then - set_state('init_error', err) - fail(err) - return - end - -- Set default config values - local desc_strategy = options.desc_strategy or 'path' - set_state('config', { - desc_strategy = desc_strategy, - fuzzy_cmd = some(options.fuzzy_cmd, 'fzf'), - notify = some(options.notify, false), - ephemeral = some(options.ephemeral, true), - tabs = some(options.tabs, true), - }) - -- Set hops after ensuring they all have a description - local hops = {} - for _, hop in pairs(options.hops) do - hop.desc = hop.desc or path_to_desc(hop.path, desc_strategy) - -- Manually replace ~ from users so we can make a valid Url later to check if dir exists - if string.sub(hop.path, 1, 1) == '~' then - hop.path = os.getenv('HOME') .. hop.path:sub(2) - end - table.insert(hops, hop) - end - set_state('hops', sort_hops(hops)) - set_state('init', true) -end - -return { - setup = function(state, options) - state.options = options - ps.sub('cd', function(body) - if not body then return end - -- Note: This callback is sync and triggered at startup! - local tab = body.tab -- type number - if not tab then return end - -- Very important to turn this into a string because Url has ownership issues - -- when passed to standard utility functions >.<' - -- https://github.com/sxyazi/yazi/issues/2159 - local cwd = tostring(cx.active.current.cwd) - -- Upon startup this will be nil so initialize if necessary - local tabhist = state.tabhist or {} - -- tabhist structure:{ = { , }, ... } - if not tabhist[tab] then - -- If fresh tab, initialize tab history table - tabhist[tab] = { cwd } - else - -- Otherwise, shift history table to the right and add cwd to the front - tabhist[tab] = { cwd, tabhist[tab][1] } - end - state.tabhist = tabhist - end) - end, - entry = function(_self, job) - if not get_state('init') then - init() - end - local init_error = get_state('init_error') - if init_error then - fail(init_error) - return - end - local hops, config = get_state('hops'), get_state('config') - if job.args[1] == 'fuzzy' then - local fuzzy_hop = select_fuzzy(hops, config) - if fuzzy_hop then - cd(fuzzy_hop, config) - end - else - attempt_hop(hops, config) - end - end, -} diff --git a/yazi/theme.toml b/yazi/theme.toml deleted file mode 100644 index 3224748..0000000 --- a/yazi/theme.toml +++ /dev/null @@ -1,742 +0,0 @@ -[flavor] -light = "cyberdream" -dark = "cyberdream" -use = "cyberdream" -[icon] - -prepend_dirs = [ - { name = "Applications", text = "" }, - { name = "Code", text = "" }, - { name = "Desktop", text = "" }, - { name = "Developer", text = "" }, - { name = "github.com", text = "" }, - { name = "prdlk", text = "󱃪" }, - { name = "wltbs", text = "󱃪" }, - { name = "Shared", text = "" }, - { name = "Templates", text = "" }, - { name = "env", text = "" }, - { name = "go", text = "󰟓" }, - { name = "js", text = "" }, - { name = "dart", text = "" }, - { name = "py", text = "" }, - { name = "rs", text = "" }, - { name = "tex", text = "" }, - { name = "md", text = "" }, - { name = "docs", text = "" }, - { name = "prad.codes", text = "" }, -] - - -files = [ - { name = ".babelrc", text = "", fg = "#f9e2af" }, - { name = ".bash_profile", text = "", fg = "#a6e3a1" }, - { name = ".bashrc", text = "", fg = "#a6e3a1" }, - { name = ".clang-format", text = "", fg = "#7f849c" }, - { name = ".clang-tidy", text = "", fg = "#7f849c" }, - { name = ".clangd", text = "", fg = "#7f849c" }, - { name = ".codespellrc", text = "󰓆", fg = "#a6e3a1" }, - { name = ".condarc", text = "", fg = "#a6e3a1" }, - { name = ".dockerignore", text = "󰡨", fg = "#89b4fa" }, - { name = ".ds_store", text = "", fg = "#7f849c" }, - { name = ".editorconfig", text = "", fg = "#cdd6f4" }, - { name = ".env", text = "", fg = "#fab387" }, - { name = ".eslintignore", text = "", fg = "#cba6f7" }, - { name = ".eslintrc", text = "", fg = "#cba6f7" }, - { name = ".git-blame-ignore-revs", text = "", fg = "#f38ba8" }, - { name = ".gitattributes", text = "", fg = "#f38ba8" }, - { name = ".gitconfig", text = "", fg = "#f38ba8" }, - { name = ".gitignore", text = "", fg = "#f38ba8" }, - { name = ".gitlab-ci.yml", text = "", fg = "#f38ba8" }, - { name = ".gitmodules", text = "", fg = "#f38ba8" }, - { name = ".gtkrc-2.0", text = "", fg = "#74c7ec" }, - { name = ".gvimrc", text = "", fg = "#a6e3a1" }, - { name = ".justfile", text = "", fg = "#7f849c" }, - { name = ".luacheckrc", text = "", fg = "#89b4fa" }, - { name = ".luaurc", text = "", fg = "#89b4fa" }, - { name = ".mailmap", text = "󰊢", fg = "#f38ba8" }, - { name = ".nanorc", text = "", fg = "#cba6f7" }, - { name = ".npmignore", text = "", fg = "#cba6f7" }, - { name = ".npmrc", text = "", fg = "#cba6f7" }, - { name = ".nuxtrc", text = "󱄆", fg = "#a6e3a1" }, - { name = ".nvmrc", text = "", fg = "#a6e3a1" }, - { name = ".pnpmfile.cjs", text = "", fg = "#fab387" }, - { name = ".pre-commit-config.yaml", text = "󰛢", fg = "#fab387" }, - { name = ".prettierignore", text = "", fg = "#89b4fa" }, - { name = ".prettierrc", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.cjs", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.js", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.json", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.json5", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.mjs", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.toml", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.yaml", text = "", fg = "#89b4fa" }, - { name = ".prettierrc.yml", text = "", fg = "#89b4fa" }, - { name = ".pylintrc", text = "", fg = "#7f849c" }, - { name = ".settings.json", text = "", fg = "#cba6f7" }, - { name = ".SRCINFO", text = "󰣇", fg = "#74c7ec" }, - { name = ".vimrc", text = "", fg = "#a6e3a1" }, - { name = ".Xauthority", text = "", fg = "#f38ba8" }, - { name = ".xinitrc", text = "", fg = "#f38ba8" }, - { name = ".Xresources", text = "", fg = "#f38ba8" }, - { name = ".xsession", text = "", fg = "#f38ba8" }, - { name = ".zprofile", text = "", fg = "#a6e3a1" }, - { name = ".zshenv", text = "", fg = "#a6e3a1" }, - { name = ".zshrc", text = "", fg = "#a6e3a1" }, - { name = "_gvimrc", text = "", fg = "#a6e3a1" }, - { name = "_vimrc", text = "", fg = "#a6e3a1" }, - { name = "AUTHORS", text = "", fg = "#cba6f7" }, - { name = "AUTHORS.txt", text = "", fg = "#cba6f7" }, - { name = "bitbucket-pipelines.yml", text = "󰂨", fg = "#89b4fa" }, - { name = "brewfile", text = "", fg = "#f38ba8" }, - { name = "bspwmrc", text = "", fg = "#7f849c" }, - { name = "build", text = "", fg = "#a6e3a1" }, - { name = "build.gradle", text = "", fg = "#89b4fa" }, - { name = "build.zig.zon", text = "", fg = "#fab387" }, - { name = "bun.lock", text = "", fg = "#cdd6f4" }, - { name = "bun.lockb", text = "", fg = "#cdd6f4" }, - { name = "cantorrc", text = "", fg = "#89b4fa" }, - { name = "checkhealth", text = "󰓙", fg = "#89b4fa" }, - { name = "cmakelists.txt", text = "", fg = "#cdd6f4" }, - { name = "code_of_conduct", text = "", fg = "#cba6f7" }, - { name = "code_of_conduct.md", text = "", fg = "#cba6f7" }, - { name = "commit_editmsg", text = "", fg = "#f38ba8" }, - { name = "commitlint.config.js", text = "󰜘", fg = "#94e2d5" }, - { name = "commitlint.config.ts", text = "󰜘", fg = "#94e2d5" }, - { name = "compose.yaml", text = "󰡨", fg = "#89b4fa" }, - { name = "compose.yml", text = "󰡨", fg = "#89b4fa" }, - { name = "config", text = "", fg = "#7f849c" }, - { name = "containerfile", text = "󰡨", fg = "#89b4fa" }, - { name = "copying", text = "", fg = "#f9e2af" }, - { name = "copying.lesser", text = "", fg = "#f9e2af" }, - { name = "Directory.Build.props", text = "", fg = "#89b4fa" }, - { name = "Directory.Build.targets", text = "", fg = "#89b4fa" }, - { name = "Directory.Packages.props", text = "", fg = "#89b4fa" }, - { name = "docker-compose.yaml", text = "󰡨", fg = "#89b4fa" }, - { name = "docker-compose.yml", text = "󰡨", fg = "#89b4fa" }, - { name = "dockerfile", text = "󰡨", fg = "#89b4fa" }, - { name = "dune", text = "", fg = "#f38ba8" }, - { name = "eslint.config.cjs", text = "", fg = "#cba6f7" }, - { name = "eslint.config.js", text = "", fg = "#cba6f7" }, - { name = "eslint.config.mjs", text = "", fg = "#cba6f7" }, - { name = "eslint.config.ts", text = "", fg = "#cba6f7" }, - { name = "ext_typoscript_setup.txt", text = "", fg = "#fab387" }, - { name = "favicon.ico", text = "", fg = "#f9e2af" }, - { name = "fp-info-cache", text = "", fg = "#74c7ec" }, - { name = "fp-lib-table", text = "", fg = "#74c7ec" }, - { name = "FreeCAD.conf", text = "", fg = "#f38ba8" }, - { name = "Gemfile", text = "", fg = "#f38ba8" }, - { name = "gnumakefile", text = "", fg = "#7f849c" }, - { name = "go.mod", text = "", fg = "#74c7ec" }, - { name = "go.sum", text = "", fg = "#74c7ec" }, - { name = "go.work", text = "", fg = "#74c7ec" }, - { name = "gradle-wrapper.properties", text = "", fg = "#89b4fa" }, - { name = "gradle.properties", text = "", fg = "#89b4fa" }, - { name = "gradlew", text = "", fg = "#89b4fa" }, - { name = "groovy", text = "", fg = "#89b4fa" }, - { name = "gruntfile.babel.js", text = "", fg = "#fab387" }, - { name = "gruntfile.coffee", text = "", fg = "#fab387" }, - { name = "gruntfile.js", text = "", fg = "#fab387" }, - { name = "gruntfile.ts", text = "", fg = "#fab387" }, - { name = "gtkrc", text = "", fg = "#74c7ec" }, - { name = "gulpfile.babel.js", text = "", fg = "#eba0ac" }, - { name = "gulpfile.coffee", text = "", fg = "#eba0ac" }, - { name = "gulpfile.js", text = "", fg = "#eba0ac" }, - { name = "gulpfile.ts", text = "", fg = "#eba0ac" }, - { name = "hypridle.conf", text = "", fg = "#74c7ec" }, - { name = "hyprland.conf", text = "", fg = "#74c7ec" }, - { name = "hyprlandd.conf", text = "", fg = "#74c7ec" }, - { name = "hyprlock.conf", text = "", fg = "#74c7ec" }, - { name = "hyprpaper.conf", text = "", fg = "#74c7ec" }, - { name = "hyprsunset.conf", text = "", fg = "#74c7ec" }, - { name = "i18n.config.js", text = "󰗊", fg = "#cba6f7" }, - { name = "i18n.config.ts", text = "󰗊", fg = "#cba6f7" }, - { name = "i3blocks.conf", text = "", fg = "#cdd6f4" }, - { name = "i3status.conf", text = "", fg = "#cdd6f4" }, - { name = "index.theme", text = "", fg = "#a6e3a1" }, - { name = "ionic.config.json", text = "", fg = "#89b4fa" }, - { name = "Jenkinsfile", text = "", fg = "#f38ba8" }, - { name = "justfile", text = "", fg = "#7f849c" }, - { name = "kalgebrarc", text = "", fg = "#89b4fa" }, - { name = "kdeglobals", text = "", fg = "#89b4fa" }, - { name = "kdenlive-layoutsrc", text = "", fg = "#94e2d5" }, - { name = "kdenliverc", text = "", fg = "#94e2d5" }, - { name = "kritadisplayrc", text = "", fg = "#cba6f7" }, - { name = "kritarc", text = "", fg = "#cba6f7" }, - { name = "license", text = "", fg = "#f9e2af" }, - { name = "license.md", text = "", fg = "#f9e2af" }, - { name = "lxde-rc.xml", text = "", fg = "#cdd6f4" }, - { name = "lxqt.conf", text = "", fg = "#89b4fa" }, - { name = "makefile", text = "", fg = "#7f849c" }, - { name = "mix.lock", text = "", fg = "#cba6f7" }, - { name = "mpv.conf", text = "", fg = "#cba6f7" }, - { name = "next.config.cjs", text = "", fg = "#74c7ec" }, - { name = "next.config.js", text = "", fg = "#74c7ec" }, - { name = "next.config.ts", text = "", fg = "#74c7ec" }, - { name = "node_modules", text = "", fg = "#cba6f7" }, - { name = "nuxt.config.cjs", text = "󱄆", fg = "#a6e3a1" }, - { name = "nuxt.config.js", text = "󱄆", fg = "#a6e3a1" }, - { name = "nuxt.config.mjs", text = "󱄆", fg = "#a6e3a1" }, - { name = "nuxt.config.ts", text = "󱄆", fg = "#a6e3a1" }, - { name = "package-lock.json", text = "", fg = "#f38ba8" }, - { name = "package.json", text = "", fg = "#cba6f7" }, - { name = "PKGBUILD", text = "", fg = "#74c7ec" }, - { name = "platformio.ini", text = "", fg = "#fab387" }, - { name = "playwright.config.cjs", text = "", fg = "#a6e3a1" }, - { name = "playwright.config.cts", text = "", fg = "#a6e3a1" }, - { name = "playwright.config.js", text = "", fg = "#a6e3a1" }, - { name = "playwright.config.mjs", text = "", fg = "#a6e3a1" }, - { name = "playwright.config.mts", text = "", fg = "#a6e3a1" }, - { name = "playwright.config.ts", text = "", fg = "#a6e3a1" }, - { name = "pnpm-lock.yaml", text = "", fg = "#fab387" }, - { name = "pnpm-workspace.yaml", text = "", fg = "#fab387" }, - { name = "pom.xml", text = "", fg = "#f38ba8" }, - { name = "prettier.config.cjs", text = "", fg = "#89b4fa" }, - { name = "prettier.config.js", text = "", fg = "#89b4fa" }, - { name = "prettier.config.mjs", text = "", fg = "#89b4fa" }, - { name = "prettier.config.ts", text = "", fg = "#89b4fa" }, - { name = "prisma.config.mts", text = "", fg = "#89b4fa" }, - { name = "prisma.config.ts", text = "", fg = "#89b4fa" }, - { name = "procfile", text = "", fg = "#cba6f7" }, - { name = "PrusaSlicer.ini", text = "", fg = "#f38ba8" }, - { name = "PrusaSlicerGcodeViewer.ini", text = "", fg = "#f38ba8" }, - { name = "py.typed", text = "", fg = "#fab387" }, - { name = "QtProject.conf", text = "", fg = "#a6e3a1" }, - { name = "rakefile", text = "", fg = "#f38ba8" }, - { name = "readme", text = "󰂺", fg = "#cdd6f4" }, - { name = "readme.md", text = "󰂺", fg = "#cdd6f4" }, - { name = "rmd", text = "", fg = "#89b4fa" }, - { name = "robots.txt", text = "󰚩", fg = "#cba6f7" }, - { name = "security", text = "󰒃", fg = "#cdd6f4" }, - { name = "security.md", text = "󰒃", fg = "#cdd6f4" }, - { name = "settings.gradle", text = "", fg = "#89b4fa" }, - { name = "svelte.config.js", text = "", fg = "#f38ba8" }, - { name = "sxhkdrc", text = "", fg = "#7f849c" }, - { name = "sym-lib-table", text = "", fg = "#74c7ec" }, - { name = "tailwind.config.js", text = "󱏿", fg = "#74c7ec" }, - { name = "tailwind.config.mjs", text = "󱏿", fg = "#74c7ec" }, - { name = "tailwind.config.ts", text = "󱏿", fg = "#74c7ec" }, - { name = "tmux.conf", text = "", fg = "#a6e3a1" }, - { name = "tmux.conf.local", text = "", fg = "#a6e3a1" }, - { name = "tsconfig.json", text = "", fg = "#89b4fa" }, - { name = "unlicense", text = "", fg = "#f9e2af" }, - { name = "vagrantfile", text = "", fg = "#89b4fa" }, - { name = "vercel.json", text = "", fg = "#74c7ec" }, - { name = "vite.config.cjs", text = "", fg = "#fab387" }, - { name = "vite.config.cts", text = "", fg = "#fab387" }, - { name = "vite.config.js", text = "", fg = "#fab387" }, - { name = "vite.config.mjs", text = "", fg = "#fab387" }, - { name = "vite.config.mts", text = "", fg = "#fab387" }, - { name = "vite.config.ts", text = "", fg = "#fab387" }, - { name = "vitest.config.cjs", text = "", fg = "#fab387" }, - { name = "vitest.config.cts", text = "", fg = "#fab387" }, - { name = "vitest.config.js", text = "", fg = "#fab387" }, - { name = "vitest.config.mjs", text = "", fg = "#fab387" }, - { name = "vitest.config.mts", text = "", fg = "#fab387" }, - { name = "vitest.config.ts", text = "", fg = "#fab387" }, - { name = "vlcrc", text = "󰕼", fg = "#fab387" }, - { name = "webpack", text = "󰜫", fg = "#89b4fa" }, - { name = "weston.ini", text = "", fg = "#fab387" }, - { name = "workspace", text = "", fg = "#a6e3a1" }, - { name = "wrangler.jsonc", text = "", fg = "#fab387" }, - { name = "wrangler.toml", text = "", fg = "#fab387" }, - { name = "xdph.conf", text = "", fg = "#74c7ec" }, - { name = "xmobarrc", text = "", fg = "#eba0ac" }, - { name = "xmobarrc.hs", text = "", fg = "#eba0ac" }, - { name = "xmonad.hs", text = "", fg = "#eba0ac" }, - { name = "xorg.conf", text = "", fg = "#f38ba8" }, - { name = "xsettingsd.conf", text = "", fg = "#f38ba8" }, -] -exts = [ - { name = "3gp", text = "", fg = "#fab387" }, - { name = "3mf", text = "󰆧", fg = "#cba6f7" }, - { name = "7z", text = "", fg = "#fab387" }, - { name = "a", text = "", fg = "#cdd6f4" }, - { name = "aac", text = "", fg = "#89b4fa" }, - { name = "ada", text = "", fg = "#89b4fa" }, - { name = "adb", text = "", fg = "#89b4fa" }, - { name = "ads", text = "", fg = "#cba6f7" }, - { name = "ai", text = "", fg = "#f9e2af" }, - { name = "aif", text = "", fg = "#89b4fa" }, - { name = "aiff", text = "", fg = "#89b4fa" }, - { name = "android", text = "", fg = "#a6e3a1" }, - { name = "ape", text = "", fg = "#89b4fa" }, - { name = "apk", text = "", fg = "#a6e3a1" }, - { name = "apl", text = "", fg = "#a6e3a1" }, - { name = "app", text = "", fg = "#f38ba8" }, - { name = "applescript", text = "", fg = "#7f849c" }, - { name = "asc", text = "󰦝", fg = "#7f849c" }, - { name = "asm", text = "", fg = "#89b4fa" }, - { name = "asmdef", text = "󰐱", fg = "#74c7ec" }, - { name = "ass", text = "󰨖", fg = "#fab387" }, - { name = "astro", text = "", fg = "#cba6f7" }, - { name = "avi", text = "", fg = "#fab387" }, - { name = "avif", text = "", fg = "#cba6f7" }, - { name = "awk", text = "", fg = "#7f849c" }, - { name = "azcli", text = "", fg = "#89b4fa" }, - { name = "bak", text = "󰁯", fg = "#7f849c" }, - { name = "bash", text = "", fg = "#a6e3a1" }, - { name = "bat", text = "", fg = "#a6e3a1" }, - { name = "bazel", text = "", fg = "#a6e3a1" }, - { name = "bib", text = "󱉟", fg = "#f9e2af" }, - { name = "bicep", text = "", fg = "#89b4fa" }, - { name = "bicepparam", text = "", fg = "#cba6f7" }, - { name = "bin", text = "", fg = "#f38ba8" }, - { name = "blade.php", text = "", fg = "#eba0ac" }, - { name = "blend", text = "󰂫", fg = "#fab387" }, - { name = "blp", text = "󰺾", fg = "#89b4fa" }, - { name = "bmp", text = "", fg = "#cba6f7" }, - { name = "bqn", text = "", fg = "#a6e3a1" }, - { name = "brep", text = "󰻫", fg = "#fab387" }, - { name = "bz", text = "", fg = "#fab387" }, - { name = "bz2", text = "", fg = "#fab387" }, - { name = "bz3", text = "", fg = "#fab387" }, - { name = "bzl", text = "", fg = "#a6e3a1" }, - { name = "c", text = "", fg = "#89b4fa" }, - { name = "c++", text = "", fg = "#eba0ac" }, - { name = "cache", text = "", fg = "#74c7ec" }, - { name = "cast", text = "", fg = "#fab387" }, - { name = "cbl", text = "", fg = "#89b4fa" }, - { name = "cc", text = "", fg = "#eba0ac" }, - { name = "ccm", text = "", fg = "#eba0ac" }, - { name = "cfc", text = "", fg = "#74c7ec" }, - { name = "cfg", text = "", fg = "#7f849c" }, - { name = "cfm", text = "", fg = "#74c7ec" }, - { name = "cjs", text = "", fg = "#f9e2af" }, - { name = "clj", text = "", fg = "#a6e3a1" }, - { name = "cljc", text = "", fg = "#a6e3a1" }, - { name = "cljd", text = "", fg = "#89b4fa" }, - { name = "cljs", text = "", fg = "#89b4fa" }, - { name = "cmake", text = "", fg = "#cdd6f4" }, - { name = "cob", text = "", fg = "#89b4fa" }, - { name = "cobol", text = "", fg = "#89b4fa" }, - { name = "coffee", text = "", fg = "#f9e2af" }, - { name = "conda", text = "", fg = "#a6e3a1" }, - { name = "conf", text = "", fg = "#7f849c" }, - { name = "config.ru", text = "", fg = "#f38ba8" }, - { name = "cow", text = "󰆚", fg = "#fab387" }, - { name = "cp", text = "", fg = "#89b4fa" }, - { name = "cpp", text = "", fg = "#89b4fa" }, - { name = "cppm", text = "", fg = "#89b4fa" }, - { name = "cpy", text = "", fg = "#89b4fa" }, - { name = "cr", text = "", fg = "#cdd6f4" }, - { name = "crdownload", text = "", fg = "#74c7ec" }, - { name = "cs", text = "󰌛", fg = "#fab387" }, - { name = "csh", text = "", fg = "#7f849c" }, - { name = "cshtml", text = "󱦗", fg = "#cba6f7" }, - { name = "cson", text = "", fg = "#f9e2af" }, - { name = "csproj", text = "󰪮", fg = "#cba6f7" }, - { name = "css", text = "", fg = "#cba6f7" }, - { name = "csv", text = "", fg = "#a6e3a1" }, - { name = "cts", text = "", fg = "#89b4fa" }, - { name = "cu", text = "", fg = "#a6e3a1" }, - { name = "cue", text = "󰲹", fg = "#cba6f7" }, - { name = "cuh", text = "", fg = "#cba6f7" }, - { name = "cxx", text = "", fg = "#89b4fa" }, - { name = "cxxm", text = "", fg = "#89b4fa" }, - { name = "d", text = "", fg = "#f38ba8" }, - { name = "d.ts", text = "", fg = "#fab387" }, - { name = "dart", text = "", fg = "#89b4fa" }, - { name = "db", text = "", fg = "#74c7ec" }, - { name = "dconf", text = "", fg = "#74c7ec" }, - { name = "desktop", text = "", fg = "#cba6f7" }, - { name = "diff", text = "", fg = "#7f849c" }, - { name = "dll", text = "", fg = "#f38ba8" }, - { name = "doc", text = "󰈬", fg = "#89b4fa" }, - { name = "Dockerfile", text = "󰡨", fg = "#89b4fa" }, - { name = "dockerignore", text = "󰡨", fg = "#89b4fa" }, - { name = "docx", text = "󰈬", fg = "#89b4fa" }, - { name = "dot", text = "󱁉", fg = "#89b4fa" }, - { name = "download", text = "", fg = "#74c7ec" }, - { name = "drl", text = "", fg = "#f38ba8" }, - { name = "dropbox", text = "", fg = "#89b4fa" }, - { name = "dump", text = "", fg = "#74c7ec" }, - { name = "dwg", text = "󰻫", fg = "#fab387" }, - { name = "dxf", text = "󰻫", fg = "#fab387" }, - { name = "ebook", text = "", fg = "#fab387" }, - { name = "ebuild", text = "", fg = "#cba6f7" }, - { name = "edn", text = "", fg = "#89b4fa" }, - { name = "eex", text = "", fg = "#cba6f7" }, - { name = "ejs", text = "", fg = "#f9e2af" }, - { name = "el", text = "", fg = "#cba6f7" }, - { name = "elc", text = "", fg = "#cba6f7" }, - { name = "elf", text = "", fg = "#f38ba8" }, - { name = "elm", text = "", fg = "#89b4fa" }, - { name = "eln", text = "", fg = "#cba6f7" }, - { name = "env", text = "", fg = "#fab387" }, - { name = "eot", text = "", fg = "#cdd6f4" }, - { name = "epp", text = "", fg = "#fab387" }, - { name = "epub", text = "", fg = "#fab387" }, - { name = "erb", text = "", fg = "#f38ba8" }, - { name = "erl", text = "", fg = "#cba6f7" }, - { name = "ex", text = "", fg = "#cba6f7" }, - { name = "exe", text = "", fg = "#f38ba8" }, - { name = "exs", text = "", fg = "#cba6f7" }, - { name = "f#", text = "", fg = "#89b4fa" }, - { name = "f3d", text = "󰻫", fg = "#fab387" }, - { name = "f90", text = "󱈚", fg = "#cba6f7" }, - { name = "fbx", text = "󰆧", fg = "#cba6f7" }, - { name = "fcbak", text = "", fg = "#f38ba8" }, - { name = "fcmacro", text = "", fg = "#f38ba8" }, - { name = "fcmat", text = "", fg = "#f38ba8" }, - { name = "fcparam", text = "", fg = "#f38ba8" }, - { name = "fcscript", text = "", fg = "#f38ba8" }, - { name = "fcstd", text = "", fg = "#f38ba8" }, - { name = "fcstd1", text = "", fg = "#f38ba8" }, - { name = "fctb", text = "", fg = "#f38ba8" }, - { name = "fctl", text = "", fg = "#f38ba8" }, - { name = "fdmdownload", text = "", fg = "#74c7ec" }, - { name = "feature", text = "", fg = "#a6e3a1" }, - { name = "fish", text = "", fg = "#7f849c" }, - { name = "flac", text = "", fg = "#89b4fa" }, - { name = "flc", text = "", fg = "#cdd6f4" }, - { name = "flf", text = "", fg = "#cdd6f4" }, - { name = "fnl", text = "", fg = "#f9e2af" }, - { name = "fodg", text = "", fg = "#fab387" }, - { name = "fodp", text = "", fg = "#fab387" }, - { name = "fods", text = "", fg = "#a6e3a1" }, - { name = "fodt", text = "", fg = "#89b4fa" }, - { name = "frag", text = "", fg = "#74c7ec" }, - { name = "fs", text = "", fg = "#89b4fa" }, - { name = "fsi", text = "", fg = "#89b4fa" }, - { name = "fsscript", text = "", fg = "#89b4fa" }, - { name = "fsx", text = "", fg = "#89b4fa" }, - { name = "gcode", text = "󰐫", fg = "#89b4fa" }, - { name = "gd", text = "", fg = "#7f849c" }, - { name = "gemspec", text = "", fg = "#f38ba8" }, - { name = "geom", text = "", fg = "#74c7ec" }, - { name = "gif", text = "", fg = "#cba6f7" }, - { name = "git", text = "", fg = "#f38ba8" }, - { name = "glb", text = "", fg = "#fab387" }, - { name = "gleam", text = "", fg = "#cba6f7" }, - { name = "glsl", text = "", fg = "#74c7ec" }, - { name = "gnumakefile", text = "", fg = "#7f849c" }, - { name = "go", text = "", fg = "#74c7ec" }, - { name = "godot", text = "", fg = "#7f849c" }, - { name = "gpr", text = "", fg = "#7f849c" }, - { name = "gql", text = "", fg = "#cba6f7" }, - { name = "gradle", text = "", fg = "#89b4fa" }, - { name = "graphql", text = "", fg = "#cba6f7" }, - { name = "gresource", text = "", fg = "#74c7ec" }, - { name = "gv", text = "󱁉", fg = "#89b4fa" }, - { name = "gz", text = "", fg = "#fab387" }, - { name = "h", text = "", fg = "#cba6f7" }, - { name = "haml", text = "", fg = "#cdd6f4" }, - { name = "hbs", text = "", fg = "#f38ba8" }, - { name = "heex", text = "", fg = "#cba6f7" }, - { name = "hex", text = "", fg = "#89b4fa" }, - { name = "hh", text = "", fg = "#cba6f7" }, - { name = "hpp", text = "", fg = "#cba6f7" }, - { name = "hrl", text = "", fg = "#cba6f7" }, - { name = "hs", text = "", fg = "#cba6f7" }, - { name = "htm", text = "", fg = "#f38ba8" }, - { name = "html", text = "", fg = "#f38ba8" }, - { name = "http", text = "", fg = "#89b4fa" }, - { name = "huff", text = "󰡘", fg = "#cba6f7" }, - { name = "hurl", text = "", fg = "#cba6f7" }, - { name = "hx", text = "", fg = "#fab387" }, - { name = "hxx", text = "", fg = "#cba6f7" }, - { name = "ical", text = "", fg = "#89b4fa" }, - { name = "icalendar", text = "", fg = "#89b4fa" }, - { name = "ico", text = "", fg = "#f9e2af" }, - { name = "ics", text = "", fg = "#89b4fa" }, - { name = "ifb", text = "", fg = "#89b4fa" }, - { name = "ifc", text = "󰻫", fg = "#fab387" }, - { name = "ige", text = "󰻫", fg = "#fab387" }, - { name = "iges", text = "󰻫", fg = "#fab387" }, - { name = "igs", text = "󰻫", fg = "#fab387" }, - { name = "image", text = "", fg = "#eba0ac" }, - { name = "img", text = "", fg = "#eba0ac" }, - { name = "import", text = "", fg = "#cdd6f4" }, - { name = "info", text = "", fg = "#f9e2af" }, - { name = "ini", text = "", fg = "#7f849c" }, - { name = "ino", text = "", fg = "#94e2d5" }, - { name = "ipynb", text = "", fg = "#fab387" }, - { name = "iso", text = "", fg = "#eba0ac" }, - { name = "ixx", text = "", fg = "#89b4fa" }, - { name = "jar", text = "", fg = "#fab387" }, - { name = "java", text = "", fg = "#eba0ac" }, - { name = "jl", text = "", fg = "#cba6f7" }, - { name = "jpeg", text = "", fg = "#cba6f7" }, - { name = "jpg", text = "", fg = "#cba6f7" }, - { name = "js", text = "", fg = "#f9e2af" }, - { name = "json", text = "", fg = "#f9e2af" }, - { name = "json5", text = "", fg = "#f9e2af" }, - { name = "jsonc", text = "", fg = "#f9e2af" }, - { name = "jsonl", text = "", fg = "#f9e2af" }, - { name = "jsx", text = "", fg = "#74c7ec" }, - { name = "jwmrc", text = "", fg = "#89b4fa" }, - { name = "jxl", text = "", fg = "#cba6f7" }, - { name = "kbx", text = "󰯄", fg = "#7f849c" }, - { name = "kdb", text = "", fg = "#a6e3a1" }, - { name = "kdbx", text = "", fg = "#a6e3a1" }, - { name = "kdenlive", text = "", fg = "#94e2d5" }, - { name = "kdenlivetitle", text = "", fg = "#94e2d5" }, - { name = "kicad_dru", text = "", fg = "#74c7ec" }, - { name = "kicad_mod", text = "", fg = "#74c7ec" }, - { name = "kicad_pcb", text = "", fg = "#74c7ec" }, - { name = "kicad_prl", text = "", fg = "#74c7ec" }, - { name = "kicad_pro", text = "", fg = "#74c7ec" }, - { name = "kicad_sch", text = "", fg = "#74c7ec" }, - { name = "kicad_sym", text = "", fg = "#74c7ec" }, - { name = "kicad_wks", text = "", fg = "#74c7ec" }, - { name = "ko", text = "", fg = "#cdd6f4" }, - { name = "kpp", text = "", fg = "#cba6f7" }, - { name = "kra", text = "", fg = "#cba6f7" }, - { name = "krz", text = "", fg = "#cba6f7" }, - { name = "ksh", text = "", fg = "#7f849c" }, - { name = "kt", text = "", fg = "#89b4fa" }, - { name = "kts", text = "", fg = "#89b4fa" }, - { name = "lck", text = "", fg = "#cdd6f4" }, - { name = "leex", text = "", fg = "#cba6f7" }, - { name = "less", text = "", fg = "#cba6f7" }, - { name = "lff", text = "", fg = "#cdd6f4" }, - { name = "lhs", text = "", fg = "#cba6f7" }, - { name = "lib", text = "", fg = "#f38ba8" }, - { name = "license", text = "", fg = "#f9e2af" }, - { name = "liquid", text = "", fg = "#fab387" }, - { name = "lock", text = "", fg = "#cdd6f4" }, - { name = "log", text = "󰌱", fg = "#cdd6f4" }, - { name = "lrc", text = "󰨖", fg = "#fab387" }, - { name = "lua", text = "", fg = "#89b4fa" }, - { name = "luac", text = "", fg = "#89b4fa" }, - { name = "luau", text = "", fg = "#89b4fa" }, - { name = "m", text = "", fg = "#89b4fa" }, - { name = "m3u", text = "󰲹", fg = "#cba6f7" }, - { name = "m3u8", text = "󰲹", fg = "#cba6f7" }, - { name = "m4a", text = "", fg = "#89b4fa" }, - { name = "m4v", text = "", fg = "#fab387" }, - { name = "magnet", text = "", fg = "#f38ba8" }, - { name = "makefile", text = "", fg = "#7f849c" }, - { name = "markdown", text = "", fg = "#cdd6f4" }, - { name = "material", text = "", fg = "#cba6f7" }, - { name = "md", text = "", fg = "#cdd6f4" }, - { name = "md5", text = "󰕥", fg = "#cba6f7" }, - { name = "mdx", text = "", fg = "#89b4fa" }, - { name = "mint", text = "󰌪", fg = "#a6e3a1" }, - { name = "mjs", text = "", fg = "#f9e2af" }, - { name = "mk", text = "", fg = "#7f849c" }, - { name = "mkv", text = "", fg = "#fab387" }, - { name = "ml", text = "", fg = "#fab387" }, - { name = "mli", text = "", fg = "#fab387" }, - { name = "mm", text = "", fg = "#89b4fa" }, - { name = "mo", text = "", fg = "#cba6f7" }, - { name = "mobi", text = "", fg = "#fab387" }, - { name = "mojo", text = "", fg = "#f38ba8" }, - { name = "mov", text = "", fg = "#fab387" }, - { name = "mp3", text = "", fg = "#89b4fa" }, - { name = "mp4", text = "", fg = "#fab387" }, - { name = "mpp", text = "", fg = "#89b4fa" }, - { name = "msf", text = "", fg = "#89b4fa" }, - { name = "mts", text = "", fg = "#89b4fa" }, - { name = "mustache", text = "", fg = "#fab387" }, - { name = "nfo", text = "", fg = "#f9e2af" }, - { name = "nim", text = "", fg = "#fab387" }, - { name = "nix", text = "", fg = "#94e2d5" }, - { name = "norg", text = "", fg = "#89b4fa" }, - { name = "nswag", text = "", fg = "#a6e3a1" }, - { name = "nu", text = "", fg = "#94e2d5" }, - { name = "o", text = "", fg = "#f38ba8" }, - { name = "obj", text = "󰆧", fg = "#cba6f7" }, - { name = "odf", text = "", fg = "#eba0ac" }, - { name = "odg", text = "", fg = "#fab387" }, - { name = "odin", text = "󰟢", fg = "#89b4fa" }, - { name = "odp", text = "", fg = "#fab387" }, - { name = "ods", text = "", fg = "#a6e3a1" }, - { name = "odt", text = "", fg = "#89b4fa" }, - { name = "oga", text = "", fg = "#89b4fa" }, - { name = "ogg", text = "", fg = "#89b4fa" }, - { name = "ogv", text = "", fg = "#fab387" }, - { name = "ogx", text = "", fg = "#fab387" }, - { name = "opus", text = "", fg = "#89b4fa" }, - { name = "org", text = "", fg = "#94e2d5" }, - { name = "otf", text = "", fg = "#cdd6f4" }, - { name = "out", text = "", fg = "#f38ba8" }, - { name = "part", text = "", fg = "#74c7ec" }, - { name = "patch", text = "", fg = "#7f849c" }, - { name = "pck", text = "", fg = "#7f849c" }, - { name = "pcm", text = "", fg = "#89b4fa" }, - { name = "pdf", text = "", fg = "#f38ba8" }, - { name = "php", text = "", fg = "#cba6f7" }, - { name = "pl", text = "", fg = "#89b4fa" }, - { name = "pls", text = "󰲹", fg = "#cba6f7" }, - { name = "ply", text = "󰆧", fg = "#cba6f7" }, - { name = "pm", text = "", fg = "#89b4fa" }, - { name = "png", text = "", fg = "#cba6f7" }, - { name = "po", text = "", fg = "#89b4fa" }, - { name = "pot", text = "", fg = "#89b4fa" }, - { name = "pp", text = "", fg = "#fab387" }, - { name = "ppt", text = "󰈧", fg = "#f38ba8" }, - { name = "pptx", text = "󰈧", fg = "#f38ba8" }, - { name = "prefab", text = "", fg = "#89b4fa" }, - { name = "prisma", text = "", fg = "#89b4fa" }, - { name = "pro", text = "", fg = "#f9e2af" }, - { name = "ps1", text = "󰨊", fg = "#89b4fa" }, - { name = "psb", text = "", fg = "#89b4fa" }, - { name = "psd", text = "", fg = "#89b4fa" }, - { name = "psd1", text = "󰨊", fg = "#89b4fa" }, - { name = "psm1", text = "󰨊", fg = "#89b4fa" }, - { name = "pub", text = "󰷖", fg = "#f9e2af" }, - { name = "pxd", text = "", fg = "#89b4fa" }, - { name = "pxi", text = "", fg = "#89b4fa" }, - { name = "py", text = "", fg = "#fab387" }, - { name = "pyc", text = "", fg = "#f9e2af" }, - { name = "pyd", text = "", fg = "#f9e2af" }, - { name = "pyi", text = "", fg = "#fab387" }, - { name = "pyo", text = "", fg = "#f9e2af" }, - { name = "pyw", text = "", fg = "#89b4fa" }, - { name = "pyx", text = "", fg = "#89b4fa" }, - { name = "qm", text = "", fg = "#89b4fa" }, - { name = "qml", text = "", fg = "#a6e3a1" }, - { name = "qrc", text = "", fg = "#a6e3a1" }, - { name = "qss", text = "", fg = "#a6e3a1" }, - { name = "query", text = "", fg = "#a6e3a1" }, - { name = "R", text = "󰟔", fg = "#89b4fa" }, - { name = "r", text = "󰟔", fg = "#89b4fa" }, - { name = "rake", text = "", fg = "#f38ba8" }, - { name = "rar", text = "", fg = "#fab387" }, - { name = "rasi", text = "", fg = "#f9e2af" }, - { name = "razor", text = "󱦘", fg = "#cba6f7" }, - { name = "rb", text = "", fg = "#f38ba8" }, - { name = "res", text = "", fg = "#eba0ac" }, - { name = "resi", text = "", fg = "#eba0ac" }, - { name = "rkt", text = "󰘧", fg = "#f38ba8" }, - { name = "rlib", text = "", fg = "#eba0ac" }, - { name = "rmd", text = "", fg = "#89b4fa" }, - { name = "rproj", text = "󰗆", fg = "#a6e3a1" }, - { name = "rs", text = "", fg = "#eba0ac" }, - { name = "rss", text = "", fg = "#fab387" }, - { name = "s", text = "", fg = "#89b4fa" }, - { name = "sass", text = "", fg = "#eba0ac" }, - { name = "sbt", text = "", fg = "#eba0ac" }, - { name = "sc", text = "", fg = "#eba0ac" }, - { name = "scad", text = "", fg = "#fab387" }, - { name = "scala", text = "", fg = "#eba0ac" }, - { name = "scm", text = "󰘧", fg = "#cdd6f4" }, - { name = "scss", text = "", fg = "#eba0ac" }, - { name = "sh", text = "", fg = "#7f849c" }, - { name = "sha1", text = "󰕥", fg = "#cba6f7" }, - { name = "sha224", text = "󰕥", fg = "#cba6f7" }, - { name = "sha256", text = "󰕥", fg = "#cba6f7" }, - { name = "sha384", text = "󰕥", fg = "#cba6f7" }, - { name = "sha512", text = "󰕥", fg = "#cba6f7" }, - { name = "sig", text = "󰘧", fg = "#fab387" }, - { name = "signature", text = "󰘧", fg = "#fab387" }, - { name = "skp", text = "󰻫", fg = "#fab387" }, - { name = "sldasm", text = "󰻫", fg = "#fab387" }, - { name = "sldprt", text = "󰻫", fg = "#fab387" }, - { name = "slim", text = "", fg = "#f38ba8" }, - { name = "sln", text = "", fg = "#cba6f7" }, - { name = "slnx", text = "", fg = "#cba6f7" }, - { name = "slvs", text = "󰻫", fg = "#fab387" }, - { name = "sml", text = "󰘧", fg = "#fab387" }, - { name = "so", text = "", fg = "#cdd6f4" }, - { name = "sol", text = "", fg = "#89b4fa" }, - { name = "spec.js", text = "", fg = "#f9e2af" }, - { name = "spec.jsx", text = "", fg = "#74c7ec" }, - { name = "spec.ts", text = "", fg = "#89b4fa" }, - { name = "spec.tsx", text = "", fg = "#89b4fa" }, - { name = "spx", text = "", fg = "#89b4fa" }, - { name = "sql", text = "", fg = "#74c7ec" }, - { name = "sqlite", text = "", fg = "#74c7ec" }, - { name = "sqlite3", text = "", fg = "#74c7ec" }, - { name = "srt", text = "󰨖", fg = "#fab387" }, - { name = "ssa", text = "󰨖", fg = "#fab387" }, - { name = "ste", text = "󰻫", fg = "#fab387" }, - { name = "step", text = "󰻫", fg = "#fab387" }, - { name = "stl", text = "󰆧", fg = "#cba6f7" }, - { name = "stories.js", text = "", fg = "#eba0ac" }, - { name = "stories.jsx", text = "", fg = "#eba0ac" }, - { name = "stories.mjs", text = "", fg = "#eba0ac" }, - { name = "stories.svelte", text = "", fg = "#eba0ac" }, - { name = "stories.ts", text = "", fg = "#eba0ac" }, - { name = "stories.tsx", text = "", fg = "#eba0ac" }, - { name = "stories.vue", text = "", fg = "#eba0ac" }, - { name = "stp", text = "󰻫", fg = "#fab387" }, - { name = "strings", text = "", fg = "#89b4fa" }, - { name = "styl", text = "", fg = "#a6e3a1" }, - { name = "sub", text = "󰨖", fg = "#fab387" }, - { name = "sublime", text = "", fg = "#fab387" }, - { name = "suo", text = "", fg = "#cba6f7" }, - { name = "sv", text = "󰍛", fg = "#a6e3a1" }, - { name = "svelte", text = "", fg = "#f38ba8" }, - { name = "svg", text = "󰜡", fg = "#fab387" }, - { name = "svgz", text = "󰜡", fg = "#fab387" }, - { name = "svh", text = "󰍛", fg = "#a6e3a1" }, - { name = "svx", text = "", fg = "#cba6f7" }, - { name = "swift", text = "", fg = "#fab387" }, - { name = "t", text = "", fg = "#89b4fa" }, - { name = "tbc", text = "󰛓", fg = "#89b4fa" }, - { name = "tcl", text = "󰛓", fg = "#89b4fa" }, - { name = "templ", text = "", fg = "#fab387" }, - { name = "terminal", text = "", fg = "#a6e3a1" }, - { name = "test.js", text = "", fg = "#f9e2af" }, - { name = "test.jsx", text = "", fg = "#74c7ec" }, - { name = "test.ts", text = "", fg = "#89b4fa" }, - { name = "test.tsx", text = "", fg = "#89b4fa" }, - { name = "tex", text = "", fg = "#a6e3a1" }, - { name = "tf", text = "", fg = "#cba6f7" }, - { name = "tfvars", text = "", fg = "#cba6f7" }, - { name = "tgz", text = "", fg = "#fab387" }, - { name = "tmpl", text = "", fg = "#fab387" }, - { name = "tmux", text = "", fg = "#a6e3a1" }, - { name = "toml", text = "", fg = "#f38ba8" }, - { name = "torrent", text = "", fg = "#74c7ec" }, - { name = "tres", text = "", fg = "#7f849c" }, - { name = "ts", text = "", fg = "#89b4fa" }, - { name = "tscn", text = "", fg = "#7f849c" }, - { name = "tsconfig", text = "", fg = "#fab387" }, - { name = "tsx", text = "", fg = "#89b4fa" }, - { name = "ttf", text = "", fg = "#cdd6f4" }, - { name = "twig", text = "", fg = "#a6e3a1" }, - { name = "txt", text = "󰈙", fg = "#a6e3a1" }, - { name = "txz", text = "", fg = "#fab387" }, - { name = "typ", text = "", fg = "#74c7ec" }, - { name = "typoscript", text = "", fg = "#fab387" }, - { name = "ui", text = "", fg = "#89b4fa" }, - { name = "unity", text = "", fg = "#74c7ec" }, - { name = "v", text = "󰍛", fg = "#a6e3a1" }, - { name = "vala", text = "", fg = "#cba6f7" }, - { name = "vert", text = "", fg = "#74c7ec" }, - { name = "vh", text = "󰍛", fg = "#a6e3a1" }, - { name = "vhd", text = "󰍛", fg = "#a6e3a1" }, - { name = "vhdl", text = "󰍛", fg = "#a6e3a1" }, - { name = "vi", text = "", fg = "#fab387" }, - { name = "vim", text = "", fg = "#a6e3a1" }, - { name = "vsh", text = "", fg = "#74c7ec" }, - { name = "vsix", text = "", fg = "#cba6f7" }, - { name = "vue", text = "", fg = "#a6e3a1" }, - { name = "wasm", text = "", fg = "#89b4fa" }, - { name = "wav", text = "", fg = "#89b4fa" }, - { name = "webm", text = "", fg = "#fab387" }, - { name = "webmanifest", text = "", fg = "#f9e2af" }, - { name = "webp", text = "", fg = "#cba6f7" }, - { name = "webpack", text = "󰜫", fg = "#89b4fa" }, - { name = "wma", text = "", fg = "#89b4fa" }, - { name = "wmv", text = "", fg = "#fab387" }, - { name = "woff", text = "", fg = "#cdd6f4" }, - { name = "woff2", text = "", fg = "#cdd6f4" }, - { name = "wrl", text = "󰆧", fg = "#cba6f7" }, - { name = "wrz", text = "󰆧", fg = "#cba6f7" }, - { name = "wv", text = "", fg = "#89b4fa" }, - { name = "wvc", text = "", fg = "#89b4fa" }, - { name = "x", text = "", fg = "#89b4fa" }, - { name = "xaml", text = "󰙳", fg = "#cba6f7" }, - { name = "xcf", text = "", fg = "#7f849c" }, - { name = "xcplayground", text = "", fg = "#fab387" }, - { name = "xcstrings", text = "", fg = "#89b4fa" }, - { name = "xls", text = "󰈛", fg = "#a6e3a1" }, - { name = "xlsx", text = "󰈛", fg = "#a6e3a1" }, - { name = "xm", text = "", fg = "#89b4fa" }, - { name = "xml", text = "󰗀", fg = "#fab387" }, - { name = "xpi", text = "", fg = "#f38ba8" }, - { name = "xslt", text = "󰗀", fg = "#89b4fa" }, - { name = "xul", text = "", fg = "#fab387" }, - { name = "xz", text = "", fg = "#fab387" }, - { name = "yaml", text = "", fg = "#f38ba8" }, - { name = "yml", text = "", fg = "#f38ba8" }, - { name = "zig", text = "", fg = "#fab387" }, - { name = "zip", text = "", fg = "#fab387" }, - { name = "zsh", text = "", fg = "#a6e3a1" }, - { name = "zst", text = "", fg = "#fab387" }, - { name = "🔥", text = "", fg = "#f38ba8" }, -] diff --git a/yazi/vfs.toml b/yazi/vfs.toml deleted file mode 100644 index b240b87..0000000 --- a/yazi/vfs.toml +++ /dev/null @@ -1,20 +0,0 @@ -# [services.gdrive-personal] -# type = "sftp" -# host = "127.0.0.1" -# port = 2221 -# user = "yazi" -# password = "yazi" -# -# [services.gdrive-sonr] -# type = "sftp" -# host = "127.0.0.1" -# port = 2222 -# user = "yazi" -# password = "yazi" -# -# [services.gdrive-hyperauth] -# type = "sftp" -# host = "127.0.0.1" -# port = 2223 -# user = "yazi" -# password = "yazi" diff --git a/yazi/yazi.toml b/yazi/yazi.toml deleted file mode 100644 index ab0c505..0000000 --- a/yazi/yazi.toml +++ /dev/null @@ -1,31 +0,0 @@ -[mgr] -ratio = [0, 2, 6] - -[opener] -play = [ - { run = "mpv %s", orphan = true, for = "unix" }, -] -edit = [ - # routes into the host nvim when run inside its terminal ($NVIM set); - # plain blocking nvim otherwise. Lives in ~/.local/bin (yazi doesn't - # expand $HOME here). %s = selected/hovered paths (yazi interpolation). - { run = 'yazi-nvim-open %s', block = true, for = "unix" }, -] -open = [ - { run = "xdg-open %s1", desc = "Open", for = "linux" }, - { run = "open %s1", desc = "Open", for = "macos" }, -] - -[open] -prepend_rules = [ - { url = "*.{md,markdown}", use = [ "fry", "edit", "open" ] }, -] - -# Preview pane: bat for text-like files (md included, since mdfried is TTY-only) -[[plugin.prepend_previewers]] -mime = "text/*" -run = 'piper -- bat -p --color=always --terminal-width=$w "$1"' - -[[plugin.prepend_previewers]] -mime = "application/{mbox,javascript,wine-extension-ini}" -run = 'piper -- bat -p --color=always --terminal-width=$w "$1"'