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.
This commit is contained in:
2026-09-21 02:44:12 -04:00
parent 2686415db5
commit 07613c7889
6 changed files with 32 additions and 18 deletions
@@ -13,7 +13,7 @@ These features couple the shell to specific external tools. Disabling
spwin Kitty or WezTerm spwin Kitty or WezTerm
tab Kitty, WezTerm, or Konsole tab Kitty, WezTerm, or Konsole
split Kitty or WezTerm 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/ logs fzf + ov; reads from ~/.terminal_history/
upgrade paru or yay (Arch Linux only) upgrade paru or yay (Arch Linux only)
WakaTime hook wakatime CLI and a configured API key WakaTime hook wakatime CLI and a configured API key
+9 -6
View File
@@ -35,11 +35,14 @@ no fallback:
- `systemd-inhibit` (`wake-lock`) - `systemd-inhibit` (`wake-lock`)
- `zramctl` / `swapon` (`swapstat`) - `zramctl` / `swapon` (`swapstat`)
- `sbctl` and UEFI Secure Boot state (`sbver`) - `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`, - GNU coreutils flags such as `stat -c` and `numfmt` (`sudo-toggle`,
`dng2avif`), which differ or don't exist under a BSD userland `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 **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 that alone does not make the functions above work — they have no macOS
equivalent path today. equivalent path today.
@@ -47,10 +50,10 @@ equivalent path today.
**Windows** is not supported. Fish itself has no native Windows build; **Windows** is not supported. Fish itself has no native Windows build;
upstream's own "Windows" install docs are Cygwin/WSL workarounds, not a real 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 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`, kernel and can run `systemd`, so basic shell use may work; `zramctl`,
`sbctl`, and Secure Boot state are meaningless inside a VM, and clipboard `sbctl`, and Secure Boot state are still meaningless inside a VM, but
integration would need a WSL-specific path (`clip.exe`, `win32yank`) that clipboard integration works via `win32yank.exe` (see above) once it's
does not exist here. installed on the Windows side and reachable through WSL interop.
**Assumed present on any Linux system this runs on:** `git`, `gpg`, `tar`, **Assumed present on any Linux system this runs on:** `git`, `gpg`, `tar`,
and GNU coreutils (for `stat`, `date`, `numfmt`). These are not tracked by and GNU coreutils (for `stat`, `date`, `numfmt`). These are not tracked by
+7 -2
View File
@@ -12,7 +12,8 @@
# #
# DESCRIPTION # DESCRIPTION
# Searches fish history interactively using fzf, inserts the selected command # 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 # EXIT STATUS
# 0 Command selected and inserted, or fzf was cancelled # 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 # 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} ' '') 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 commandline -r $command
end end
end end
+5 -3
View File
@@ -8,8 +8,8 @@
# p [args...] # p [args...]
# #
# DESCRIPTION # DESCRIPTION
# Outputs clipboard contents to stdout. Uses wl-paste on Wayland, # Outputs clipboard contents to stdout. Uses wl-paste on Wayland, xclip on
# falls back to xclip on X11. Supports -h/--help for usage info. # X11, or win32yank on WSL2. Supports -h/--help for usage info.
# #
# ARGUMENTS # ARGUMENTS
# -h, --help Show usage help # -h, --help Show usage help
@@ -47,8 +47,10 @@ function p --description 'Put from clipboard'
set paste_cmd wl-paste set paste_cmd wl-paste
else if type -q xclip else if type -q xclip
set paste_cmd xclip -selection clipboard -o set paste_cmd xclip -selection clipboard -o
else if type -q win32yank.exe
set paste_cmd win32yank.exe -o --lf
else 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 return 1
end end
+5 -3
View File
@@ -8,8 +8,8 @@
# paste [args...] # paste [args...]
# #
# DESCRIPTION # DESCRIPTION
# Outputs clipboard contents to stdout. Uses wl-paste on Wayland, # Outputs clipboard contents to stdout. Uses wl-paste on Wayland, xclip on
# falls back to xclip on X11. # X11, or win32yank on WSL2.
# #
# ARGUMENTS # ARGUMENTS
# args... Arguments forwarded to the clipboard tool # args... Arguments forwarded to the clipboard tool
@@ -28,8 +28,10 @@ function paste --description 'Paste from clipboard'
wl-paste $argv wl-paste $argv
else if type -q xclip else if type -q xclip
xclip -selection clipboard -o $argv xclip -selection clipboard -o $argv
else if type -q win32yank.exe
win32yank.exe -o --lf $argv
else else
echo "Error: Neither wl-paste nor xclip found." >&2 echo "Error: No clipboard provider (wl-paste, xclip, or win32yank) found." >&2
return 1 return 1
end end
end end
+5 -3
View File
@@ -8,8 +8,8 @@
# y [text...] # y [text...]
# #
# DESCRIPTION # DESCRIPTION
# Copies text to the system clipboard using wl-copy (Wayland) or xclip (X11). # Copies text to the system clipboard using wl-copy (Wayland), xclip (X11),
# Reads from stdin when no arguments are given. # or win32yank (WSL2). Reads from stdin when no arguments are given.
# #
# ARGUMENTS # ARGUMENTS
# text Text to copy; reads from stdin if omitted # text Text to copy; reads from stdin if omitted
@@ -42,8 +42,10 @@ function y --description 'Yank to clipboard'
set copy_cmd wl-copy set copy_cmd wl-copy
else if type -q xclip else if type -q xclip
set copy_cmd xclip -selection clipboard set copy_cmd xclip -selection clipboard
else if type -q win32yank.exe
set copy_cmd win32yank.exe -i --crlf
else 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 return 1
end end