"+y の行き先は Neovim が決めません。vim.g.clipboard に書いた外部コマンドが決めます。nvim/src/lua/my/clipboard.lua はそれを環境から選びます。

判定の順番

WSL          → win32yank
Windows      → win32yank
Wayland      → wl-copy / wl-paste
X11          → xclip、無ければ xsel

WSL で win32yank を使うのは、そこで欲しいクリップボードが Windows のものだからです。Linux 側のクリップボードへ入れても、貼る先のブラウザやエディタは Windows 側にいます。

win32yank の場所は 3 通り試します。scoop の shim、chocolatey の bin、最後にPATH。scoop のパスにはユーザー名が要るので、WIN_USERUSERNAME から組み立てます。

同じツールに逆の変換を頼む

win32yank の呼び方が方向ごとに違います。

copy  = { exe, "-i", "--crlf" }
paste = { exe, "-o", "--lf" }

Windows のクリップボードは改行を CRLF で持ち、Neovim のバッファは LF で持ちます。入れるときに CRLF へ、出すときに LF へ。片方だけにすると、貼り付けた行の末尾に^M が残るか、Windows 側のアプリで改行が消えます。

Wayland だけ 2 段構え

Wayland の判定に当たっても、そこで終わりません。

if os.getenv("WAYLAND_DISPLAY") or session == "wayland" then
  set_wl_clipboard()
  if vim.g.clipboard then return end
end

wl-copy が入っていなければ vim.g.clipboard は空のままで、そのまま X11 の判定へ落ちます。Wayland セッションでも XWayland 経由で xclip は動くので、ここで止めると使えるものを使わずに終わります。

wl-copy には --foreground を付けています。wl-copy は選択内容を配り続けるために動き続ける必要があり、既定では自分を切り離してバックグラウンドへ回ります。--foreground なら Neovim が起動した子プロセスのまま残るので、寿命が Neovim の管理下に入ります。

X11 側は + を CLIPBOARD、* を PRIMARY に割り当てます。X11 にはこの 2 つが別々に存在していて、マウスで選択した内容が入るのが後者です。

毎回起動しない

どのプロバイダにも cache_enabled = 1 を付けています。Neovim が最後に yank した内容を覚えていて、ペーストのたびに外部プロセスを起動しなくなります。プロセス生成に検査が入る環境では、この 1 行がそのまま体感差になります。