From 07613c7889003c002c2fec17db0d2cde04d3a71d Mon Sep 17 00:00:00 2001 From: Rootiest Date: Mon, 21 Sep 2026 02:43:50 -0400 Subject: [PATCH 1/4] feat(clipboard): add win32yank fallback for WSL2 y, p, paste, and hist now try win32yank.exe after wl-copy/wl-paste and xclip, so clipboard access works under WSL2 once win32yank is installed and reachable through WSL interop. Updates the OS compatibility docs accordingly. --- .../04-c4-terminal-and-tool-integration.md | 2 +- docs/manual/10-installation.md | 15 +++++++++------ functions/hist.fish | 9 +++++++-- functions/p.fish | 8 +++++--- functions/paste.fish | 8 +++++--- functions/y.fish | 8 +++++--- 6 files changed, 32 insertions(+), 18 deletions(-) diff --git a/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md b/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md index 952df73..c064439 100644 --- a/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md +++ b/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md @@ -13,7 +13,7 @@ These features couple the shell to specific external tools. Disabling spwin Kitty or WezTerm tab Kitty, WezTerm, or Konsole split Kitty or WezTerm - hist fzf + wl-copy (Wayland clipboard) + hist fzf + wl-copy or win32yank.exe (WSL2) logs fzf + ov; reads from ~/.terminal_history/ upgrade paru or yay (Arch Linux only) WakaTime hook wakatime CLI and a configured API key diff --git a/docs/manual/10-installation.md b/docs/manual/10-installation.md index 85f5e60..0d7280e 100644 --- a/docs/manual/10-installation.md +++ b/docs/manual/10-installation.md @@ -35,11 +35,14 @@ no fallback: - `systemd-inhibit` (`wake-lock`) - `zramctl` / `swapon` (`swapstat`) - `sbctl` and UEFI Secure Boot state (`sbver`) -- `wl-copy` / `xclip` for clipboard access (`y`, `p`, `paste`, `hist`) — - Wayland or X11 only, no `pbcopy`/`pbpaste` fallback - GNU coreutils flags such as `stat -c` and `numfmt` (`sudo-toggle`, `dng2avif`), which differ or don't exist under a BSD userland +Clipboard access (`y`, `p`, `paste`, `hist`) is the exception: it falls back +through `wl-copy`/`wl-paste` (Wayland), `xclip` (X11), and `win32yank.exe` +(WSL2), so it works on all three. There is still no `pbcopy`/`pbpaste` +fallback for macOS. + **macOS** is not supported. `_fish_deps_detect_pm` does check for `brew`, but that alone does not make the functions above work — they have no macOS equivalent path today. @@ -47,10 +50,10 @@ equivalent path today. **Windows** is not supported. Fish itself has no native Windows build; upstream's own "Windows" install docs are Cygwin/WSL workarounds, not a real port. This config is not tested under WSL either. WSL2 runs a real Linux -kernel and can run `systemd`, so basic shell use may work, but `zramctl`, -`sbctl`, and Secure Boot state are meaningless inside a VM, and clipboard -integration would need a WSL-specific path (`clip.exe`, `win32yank`) that -does not exist here. +kernel and can run `systemd`, so basic shell use may work; `zramctl`, +`sbctl`, and Secure Boot state are still meaningless inside a VM, but +clipboard integration works via `win32yank.exe` (see above) once it's +installed on the Windows side and reachable through WSL interop. **Assumed present on any Linux system this runs on:** `git`, `gpg`, `tar`, and GNU coreutils (for `stat`, `date`, `numfmt`). These are not tracked by diff --git a/functions/hist.fish b/functions/hist.fish index a23a3fd..bc6fcd3 100644 --- a/functions/hist.fish +++ b/functions/hist.fish @@ -12,7 +12,8 @@ # # DESCRIPTION # Searches fish history interactively using fzf, inserts the selected command -# into the command line, and copies it to the clipboard via wl-copy. +# into the command line, and copies it to the clipboard via wl-copy (falls +# back to win32yank on WSL2). # # EXIT STATUS # 0 Command selected and inserted, or fzf was cancelled @@ -36,7 +37,11 @@ function hist --description 'Search fish history and put it in the prompt' # Strip the timestamp for the final output set -l command (echo $selected | string replace -r '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} ' '') - echo $command | wl-copy 2>/dev/null + if type -q wl-copy + echo $command | wl-copy 2>/dev/null + else if type -q win32yank.exe + echo $command | win32yank.exe -i --crlf 2>/dev/null + end commandline -r $command end end diff --git a/functions/p.fish b/functions/p.fish index 2c5562a..20e4f42 100644 --- a/functions/p.fish +++ b/functions/p.fish @@ -8,8 +8,8 @@ # p [args...] # # DESCRIPTION -# Outputs clipboard contents to stdout. Uses wl-paste on Wayland, -# falls back to xclip on X11. Supports -h/--help for usage info. +# Outputs clipboard contents to stdout. Uses wl-paste on Wayland, xclip on +# X11, or win32yank on WSL2. Supports -h/--help for usage info. # # ARGUMENTS # -h, --help Show usage help @@ -47,8 +47,10 @@ function p --description 'Put from clipboard' set paste_cmd wl-paste else if type -q xclip set paste_cmd xclip -selection clipboard -o + else if type -q win32yank.exe + set paste_cmd win32yank.exe -o --lf else - echo "Error: No clipboard provider (wl-paste or xclip) found." >&2 + echo "Error: No clipboard provider (wl-paste, xclip, or win32yank) found." >&2 return 1 end diff --git a/functions/paste.fish b/functions/paste.fish index 33f6e45..f48ffed 100644 --- a/functions/paste.fish +++ b/functions/paste.fish @@ -8,8 +8,8 @@ # paste [args...] # # DESCRIPTION -# Outputs clipboard contents to stdout. Uses wl-paste on Wayland, -# falls back to xclip on X11. +# Outputs clipboard contents to stdout. Uses wl-paste on Wayland, xclip on +# X11, or win32yank on WSL2. # # ARGUMENTS # args... Arguments forwarded to the clipboard tool @@ -28,8 +28,10 @@ function paste --description 'Paste from clipboard' wl-paste $argv else if type -q xclip xclip -selection clipboard -o $argv + else if type -q win32yank.exe + win32yank.exe -o --lf $argv else - echo "Error: Neither wl-paste nor xclip found." >&2 + echo "Error: No clipboard provider (wl-paste, xclip, or win32yank) found." >&2 return 1 end end diff --git a/functions/y.fish b/functions/y.fish index 1b862df..43c2723 100644 --- a/functions/y.fish +++ b/functions/y.fish @@ -8,8 +8,8 @@ # y [text...] # # DESCRIPTION -# Copies text to the system clipboard using wl-copy (Wayland) or xclip (X11). -# Reads from stdin when no arguments are given. +# Copies text to the system clipboard using wl-copy (Wayland), xclip (X11), +# or win32yank (WSL2). Reads from stdin when no arguments are given. # # ARGUMENTS # text Text to copy; reads from stdin if omitted @@ -42,8 +42,10 @@ function y --description 'Yank to clipboard' set copy_cmd wl-copy else if type -q xclip set copy_cmd xclip -selection clipboard + else if type -q win32yank.exe + set copy_cmd win32yank.exe -i --crlf else - echo "Error: No clipboard provider (wl-copy or xclip) found." >&2 + echo "Error: No clipboard provider (wl-copy, xclip, or win32yank) found." >&2 return 1 end -- 2.54.0 From b2be858d8c694963b42f8353c97f2ded6b88c0cd Mon Sep 17 00:00:00 2001 From: Rootiest Date: Mon, 21 Sep 2026 02:52:17 -0400 Subject: [PATCH 2/4] refactor(clipboard): share provider detection across y/p/paste/hist Extracts _fish_clipboard_copy and _fish_clipboard_paste so the wl-copy/xclip/win32yank fallback chain lives in one place instead of four near-duplicates. hist now goes through the same chain, so it also gets the xclip (X11) fallback it was missing before, alongside win32yank on WSL2. --- .../04-c4-terminal-and-tool-integration.md | 2 +- functions/_fish_clipboard_copy.fish | 28 +++++++++++++++++ functions/_fish_clipboard_paste.fish | 31 +++++++++++++++++++ functions/hist.fish | 13 ++++---- functions/p.fish | 19 +++--------- functions/paste.fish | 14 +++------ functions/y.fish | 20 +++--------- 7 files changed, 79 insertions(+), 48 deletions(-) create mode 100644 functions/_fish_clipboard_copy.fish create mode 100644 functions/_fish_clipboard_paste.fish diff --git a/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md b/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md index c064439..8f94b7d 100644 --- a/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md +++ b/docs/manual/08-components-reference/04-c4-terminal-and-tool-integration.md @@ -13,7 +13,7 @@ These features couple the shell to specific external tools. Disabling spwin Kitty or WezTerm tab Kitty, WezTerm, or Konsole split Kitty or WezTerm - hist fzf + wl-copy or win32yank.exe (WSL2) + hist fzf + wl-copy, xclip, or win32yank.exe (WSL2) logs fzf + ov; reads from ~/.terminal_history/ upgrade paru or yay (Arch Linux only) WakaTime hook wakatime CLI and a configured API key diff --git a/functions/_fish_clipboard_copy.fish b/functions/_fish_clipboard_copy.fish new file mode 100644 index 0000000..0d4c3e1 --- /dev/null +++ b/functions/_fish_clipboard_copy.fish @@ -0,0 +1,28 @@ +# Copyright (C) 2026 Rootiest +# SPDX-License-Identifier: AGPL-3.0-or-later + +# SYNOPSIS +# _fish_clipboard_copy +# +# DESCRIPTION +# Copies stdin to the system clipboard. Tries wl-copy (Wayland), then +# xclip (X11), then win32yank.exe (WSL2). +# +# EXIT STATUS +# 0 Text copied to clipboard +# 1 No clipboard provider found +# +# EXAMPLE +# echo "hello" | _fish_clipboard_copy +function _fish_clipboard_copy --description 'Copy stdin to the system clipboard' + if type -q wl-copy + wl-copy + else if type -q xclip + xclip -selection clipboard + else if type -q win32yank.exe + win32yank.exe -i --crlf + else + echo "Error: No clipboard provider (wl-copy, xclip, or win32yank) found." >&2 + return 1 + end +end diff --git a/functions/_fish_clipboard_paste.fish b/functions/_fish_clipboard_paste.fish new file mode 100644 index 0000000..1b05710 --- /dev/null +++ b/functions/_fish_clipboard_paste.fish @@ -0,0 +1,31 @@ +# Copyright (C) 2026 Rootiest +# SPDX-License-Identifier: AGPL-3.0-or-later + +# SYNOPSIS +# _fish_clipboard_paste [args...] +# +# DESCRIPTION +# Prints the system clipboard contents to stdout. Tries wl-paste +# (Wayland), then xclip (X11), then win32yank.exe (WSL2). +# +# ARGUMENTS +# args... Arguments forwarded to the clipboard tool +# +# EXIT STATUS +# 0 Clipboard contents read successfully +# 1 No clipboard provider found +# +# EXAMPLE +# _fish_clipboard_paste +function _fish_clipboard_paste --description 'Print the system clipboard contents' + if type -q wl-paste + wl-paste $argv + else if type -q xclip + xclip -selection clipboard -o $argv + else if type -q win32yank.exe + win32yank.exe -o --lf $argv + else + echo "Error: No clipboard provider (wl-paste, xclip, or win32yank) found." >&2 + return 1 + end +end diff --git a/functions/hist.fish b/functions/hist.fish index bc6fcd3..c0b7c7a 100644 --- a/functions/hist.fish +++ b/functions/hist.fish @@ -12,8 +12,11 @@ # # DESCRIPTION # Searches fish history interactively using fzf, inserts the selected command -# into the command line, and copies it to the clipboard via wl-copy (falls -# back to win32yank on WSL2). +# into the command line, and copies it to the clipboard via wl-copy, xclip, +# or win32yank (WSL2). +# +# DEPENDENCIES +# _fish_clipboard_copy # # EXIT STATUS # 0 Command selected and inserted, or fzf was cancelled @@ -37,11 +40,7 @@ function hist --description 'Search fish history and put it in the prompt' # Strip the timestamp for the final output set -l command (echo $selected | string replace -r '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} ' '') - if type -q wl-copy - echo $command | wl-copy 2>/dev/null - else if type -q win32yank.exe - echo $command | win32yank.exe -i --crlf 2>/dev/null - end + echo $command | _fish_clipboard_copy 2>/dev/null commandline -r $command end end diff --git a/functions/p.fish b/functions/p.fish index 20e4f42..9ce4ef9 100644 --- a/functions/p.fish +++ b/functions/p.fish @@ -11,6 +11,9 @@ # Outputs clipboard contents to stdout. Uses wl-paste on Wayland, xclip on # X11, or win32yank on WSL2. Supports -h/--help for usage info. # +# DEPENDENCIES +# _fish_clipboard_paste +# # ARGUMENTS # -h, --help Show usage help # args... Arguments forwarded to the clipboard tool @@ -41,19 +44,5 @@ function p --description 'Put from clipboard' return 0 end - # Determine the clipboard provider - set -l paste_cmd - if type -q wl-paste - set paste_cmd wl-paste - else if type -q xclip - set paste_cmd xclip -selection clipboard -o - else if type -q win32yank.exe - set paste_cmd win32yank.exe -o --lf - else - echo "Error: No clipboard provider (wl-paste, xclip, or win32yank) found." >&2 - return 1 - end - - # Execute the paste command with any provided arguments - $paste_cmd $argv + _fish_clipboard_paste $argv end diff --git a/functions/paste.fish b/functions/paste.fish index f48ffed..9e7375a 100644 --- a/functions/paste.fish +++ b/functions/paste.fish @@ -11,6 +11,9 @@ # Outputs clipboard contents to stdout. Uses wl-paste on Wayland, xclip on # X11, or win32yank on WSL2. # +# DEPENDENCIES +# _fish_clipboard_paste +# # ARGUMENTS # args... Arguments forwarded to the clipboard tool # @@ -24,14 +27,5 @@ # EXAMPLE # paste > file.txt function paste --description 'Paste from clipboard' - if type -q wl-paste - wl-paste $argv - else if type -q xclip - xclip -selection clipboard -o $argv - else if type -q win32yank.exe - win32yank.exe -o --lf $argv - else - echo "Error: No clipboard provider (wl-paste, xclip, or win32yank) found." >&2 - return 1 - end + _fish_clipboard_paste $argv end diff --git a/functions/y.fish b/functions/y.fish index 43c2723..8edf6d0 100644 --- a/functions/y.fish +++ b/functions/y.fish @@ -11,6 +11,9 @@ # Copies text to the system clipboard using wl-copy (Wayland), xclip (X11), # or win32yank (WSL2). Reads from stdin when no arguments are given. # +# DEPENDENCIES +# _fish_clipboard_copy +# # ARGUMENTS # text Text to copy; reads from stdin if omitted # @@ -36,26 +39,13 @@ function y --description 'Yank to clipboard' return 0 end - # Determine the clipboard provider - set -l copy_cmd - if type -q wl-copy - set copy_cmd wl-copy - else if type -q xclip - set copy_cmd xclip -selection clipboard - else if type -q win32yank.exe - set copy_cmd win32yank.exe -i --crlf - else - echo "Error: No clipboard provider (wl-copy, xclip, or win32yank) found." >&2 - return 1 - end - # Handle input if set -q argv[1] # If arguments are provided, echo them to the clipboard - echo $argv | eval $copy_cmd + echo $argv | _fish_clipboard_copy else # If no arguments, read from stdin (pipes/redirects) - eval $copy_cmd + _fish_clipboard_copy end end -- 2.54.0 From 59d33e8c76665372edd7d8b8736580f9e557c693 Mon Sep 17 00:00:00 2001 From: Rootiest Date: Mon, 21 Sep 2026 02:52:26 -0400 Subject: [PATCH 3/4] feat(fish-deps): add win32yank installer for WSL2 New optional-tier catalog entry, gated on WSL2 detection (/proc/sys/kernel/osrelease) so it never surfaces on a plain Linux box's install/sync prompts, only in the informational status listing. Downloads the x86_64 binary from GitHub releases to ~/.local/bin/win32yank.exe; fish-deps update refreshes an already-installed copy the same way. --- docs/manual/06-dependency-catalog.md | 1 + functions/_fish_deps_catalog.fish | 10 +++++----- functions/_fish_deps_install.fish | 29 ++++++++++++++++++++++++++++ functions/_fish_deps_update.fish | 19 ++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/docs/manual/06-dependency-catalog.md b/docs/manual/06-dependency-catalog.md index cda59e6..68eae95 100644 --- a/docs/manual/06-dependency-catalog.md +++ b/docs/manual/06-dependency-catalog.md @@ -59,6 +59,7 @@ matter if you already use that specific tool. Skipped by | `screen` | GNU screen; fallback backend for `jobrunner` when `tmux` is unavailable. | | `marktext` | Markdown editor; backs the `md` wrapper, which is the only thing that references it. No distro packages it under a common name, so `fish-deps` offers the AUR package (`marktext-bin`) on Arch and otherwise installs upstream's AppImage to `~/.local/bin/marktext`. | | `firejail` | Sandbox; needed only by `md --read-only`, which uses it to make MarkText unable to save over the file it opened. Every other `md` invocation works without it. | +| `win32yank.exe` | Clipboard bridge for WSL2; backs the `y`/`p`/`paste`/`hist` clipboard fallback chain when neither `wl-copy`/`wl-paste` nor `xclip` are present. `fish-deps` only offers to install it when WSL2 is detected (`microsoft` in `/proc/sys/kernel/osrelease`), downloading the x86_64 binary from GitHub releases to `~/.local/bin`. | ## Terminal Emulators diff --git a/functions/_fish_deps_catalog.fish b/functions/_fish_deps_catalog.fish index f96e619..d13382c 100644 --- a/functions/_fish_deps_catalog.fish +++ b/functions/_fish_deps_catalog.fish @@ -36,27 +36,27 @@ function _fish_deps_catalog set -g _fdc_bins \ uv cargo fish starship fzf zoxide direnv paru yay \ wakatime tailscale \ - eza lsd bat btop dust duf prettyping go ov rg lazygit lazydocker docker trash kitty wezterm python3 yt-dlp screen mpv vlc marktext firejail + eza lsd bat btop dust duf prettyping go ov rg lazygit lazydocker docker trash kitty wezterm python3 yt-dlp screen mpv vlc marktext firejail win32yank.exe set -g _fdc_tiers \ rec rec req rec req rec rec rec rec \ int int \ - rec rec rec opt opt opt opt opt rec rec opt opt opt rec term term rec opt opt opt opt opt opt + rec rec rec opt opt opt opt opt rec rec opt opt opt rec term term rec opt opt opt opt opt opt opt set -g _fdc_cargo \ "" "" "" starship "" zoxide "" "" "" \ "" "" \ - eza lsd bat "" du-dust "" "" "" "" ripgrep "" "" "" trashy "" "" "" "" "" "" "" "" "" + eza lsd bat "" du-dust "" "" "" "" ripgrep "" "" "" trashy "" "" "" "" "" "" "" "" "" "" set -g _fdc_pm \ uv cargo fish starship fzf zoxide direnv "" yay \ wakatime tailscale \ - eza lsd bat btop dust duf prettyping go ov ripgrep lazygit lazydocker docker trash kitty wezterm python yt-dlp screen mpv vlc "" firejail + eza lsd bat btop dust duf prettyping go ov ripgrep lazygit lazydocker docker trash kitty wezterm python yt-dlp screen mpv vlc "" firejail "" set -g _fdc_special \ curl-uv rustup-installer git-cargo-fish curl-installer fzf-update "" "" paru-build yay-build \ wakatime-binary "" \ - "" "" "" "" "" "" "" "" go-ov "" "" curl-lazydocker "" "" "" "" "" "" "" "" "" marktext-release "" + "" "" "" "" "" "" "" "" go-ov "" "" curl-lazydocker "" "" "" "" "" "" "" "" "" marktext-release "" win32yank-release end # SYNOPSIS diff --git a/functions/_fish_deps_install.fish b/functions/_fish_deps_install.fish index 030cc0e..bcb72bf 100644 --- a/functions/_fish_deps_install.fish +++ b/functions/_fish_deps_install.fish @@ -46,6 +46,14 @@ function _fish_deps_install set -l i 1 for bin in $_fdc_bins + # win32yank only matters under WSL2 — skip the entry entirely + # elsewhere so a plain Linux box never sees it, not even as a + # "no install method available" note. + if test "$bin" = win32yank.exe; and not string match -qi '*microsoft*' (cat /proc/sys/kernel/osrelease 2>/dev/null) + set i (math $i + 1) + continue + end + # Optional-tier deps are opt-in: skip unless --optional/--all was passed. if test "$_fdc_tiers[$i]" = opt; and test $include_optional -eq 0 if not command -q $bin @@ -140,6 +148,15 @@ function _fish_deps_install end set -a methods special-marktext-appimage set -a method_labels "AppImage download (~/.local/bin/marktext)" + case win32yank-release + if test (uname -m) = x86_64 + set -a methods special-win32yank + set -a method_labels "binary download (github releases)" + else + set_color brblack + echo " note: win32yank only ships x86_64 builds (this is "(uname -m)")" + set_color normal + end case go-ov if type -q go set -a methods special-go-ov @@ -296,6 +313,18 @@ function _fish_deps_install and chmod +x "$_wt_bin" and ln -sf "$_wt_bin" "$HOME/.local/bin/wakatime" rm -rf "$_tmpdir" + case special-win32yank + set -l _zip win32yank-x64.zip + set -l _tmpdir (mktemp -d) + mkdir -p "$HOME/.local/bin" + and curl -fL "https://github.com/equalsraf/win32yank/releases/latest/download/$_zip" \ + -o "$_tmpdir/$_zip" + and unzip -o "$_tmpdir/$_zip" -d "$_tmpdir" + and cp "$_tmpdir/win32yank.exe" "$HOME/.local/bin/win32yank.exe" + and chmod +x "$HOME/.local/bin/win32yank.exe" + set -l _dl_status $status + rm -rf "$_tmpdir" + test $_dl_status -eq 0 case special-fzf fzf-update case special-curl diff --git a/functions/_fish_deps_update.fish b/functions/_fish_deps_update.fish index af75e01..a78e688 100644 --- a/functions/_fish_deps_update.fish +++ b/functions/_fish_deps_update.fish @@ -146,6 +146,25 @@ function _fish_deps_update continue end + # win32yank: re-download the binary from github releases (WSL2 only; + # only reached if a copy is already on PATH, so no WSL check needed) + if test "$special" = win32yank-release + echo "Updating $bin..." + set -l _zip win32yank-x64.zip + set -l _tmpdir (mktemp -d) + curl -fL "https://github.com/equalsraf/win32yank/releases/latest/download/$_zip" \ + -o "$_tmpdir/$_zip" + and unzip -o "$_tmpdir/$_zip" -d "$_tmpdir" + and cp "$_tmpdir/win32yank.exe" "$HOME/.local/bin/win32yank.exe" + and chmod +x "$HOME/.local/bin/win32yank.exe" + set -l _up_status $status + rm -rf "$_tmpdir" + test $_up_status -eq 0 + and set updated_any 1 + set i (math $i + 1) + continue + end + # pipx tools if test "$special" = pipx if type -q pipx -- 2.54.0 From 6da6999b900cb03e31b3b255a872902ddec43bb9 Mon Sep 17 00:00:00 2001 From: Rootiest Date: Mon, 21 Sep 2026 02:53:11 -0400 Subject: [PATCH 4/4] docs(readme): sync OS compatibility section with win32yank fallback --- README.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1f4dad9..1919500 100644 --- a/README.md +++ b/README.md @@ -179,10 +179,14 @@ for broader distro support, but coverage outside Arch is thinner. A number of functions call Linux-specific subsystems directly, with no fallback: `systemd-inhibit` (`wake-lock`), `zramctl`/`swapon` (`swapstat`), -`sbctl` and UEFI Secure Boot state (`sbver`), `wl-copy`/`xclip` for clipboard -access (`y`, `p`, `paste`, `hist` — Wayland or X11 only, no `pbcopy`/`pbpaste` -fallback), and GNU coreutils flags like `stat -c`/`numfmt` (`sudo-toggle`, -`dng2avif`), which differ or don't exist under a BSD userland. +`sbctl` and UEFI Secure Boot state (`sbver`), and GNU coreutils flags like +`stat -c`/`numfmt` (`sudo-toggle`, `dng2avif`), which differ or don't exist +under a BSD userland. + +Clipboard access (`y`, `p`, `paste`, `hist`) is the exception: it falls back +through `wl-copy`/`wl-paste` (Wayland), `xclip` (X11), and `win32yank.exe` +(WSL2), so it works on all three — there's still no `pbcopy`/`pbpaste` +fallback for macOS. **macOS** is not supported — `_fish_deps_detect_pm` checks for `brew`, but that alone doesn't make the functions above work; they have no macOS @@ -190,8 +194,9 @@ equivalent path today. **Windows** is not supported. Fish has no native Windows build, and this config isn't tested under WSL either. WSL2 can run `systemd`, so basic shell -use may work, but Secure Boot/zram state is meaningless inside a VM and -clipboard integration has no WSL-specific path here. +use may work; Secure Boot/zram state is still meaningless inside a VM, but +clipboard integration works via `win32yank.exe` once it's reachable through +WSL interop — `fish-deps install` can fetch it for you. **Assumed present on any Linux system this runs on:** `git`, `gpg`, `tar`, and GNU coreutils. These aren't tracked by `fish-deps` — they're base-system -- 2.54.0