WSL2でNeovimのclipboardを設定するならOSC 52が便利だよ!

2026-01-12


「Neovim WSL2 clipboard OSC 52 🔍」とここまで丁寧にワードを入れて検索しても日本語の情報がないので全部盛りタイトルの記事を書きます。
よく出てくるのはwin32yankやlemonadoなどの3rd Partyツールを使う方法かWSL2からWindowsのclip.exeを呼び出す方法などですが、Windows側の .exe を叩くオーバーヘッドが無視できません。

しかし、実はNeovim 0.10.0以上であれば、エスケープシーケンスによってターミナルの選択範囲を遠隔操作する仕様であるOSC 52 がサポートされている、OSC 52に準拠しているターミナルであれば、特に外部依存をインストールすることなく利用可能です (筆者はWezTermを使っています)。

OSC 52に準拠しているターミナル (from Reddit)
TerminalOSC 52 support
Alacrittyyes
GNOME Terminalnot yet
hterm (Chromebook)yes
iTerm2yes
kittyyes
screenyes
tmuxyes
Windows Terminalyes
rxvtyes (to be confirmed)
urxvtyes (with a script, see here)

A guide on how to copy text from anywhere, including through SSH, with OSC52 : r/vim

以下の記事が大変参考になりました。というよりタイトルにWSL2を入れただけで、ほぼ新しいことはありません。
普段は技術記事をZennに書いていますが、さすがにほぼリダイレクトリンクみたいな内容でハートを稼ぐのは烏滸がましいため反応を (意図的に) 実装していない個人ブログに書いています (昨今のZenn反対運動とは全く関係ありません)。

OSC 52 による Neovim とクリップボードの連携

https://zenn.dev/goropikari/articles/506e08e7ad52af

OSC 52 による Neovim とクリップボードの連携のサムネイル
OSC 52 による Neovim とクリップボードの連携

-- Ref: https://github.com/goropikari/nvim/blob/15628b7ad99504ff06ba84e7fda113aec7d46e2a/lua/base.lua#L84-L106
vim.schedule(function()
  vim.opt.clipboard = "unnamedplus"
end)
local is_wsl2 = vim.fn.has("wsl") == 1
local is_ssh = os.getenv("SSH_CLIENT") ~= nil or os.getenv("SSH_TTY") ~= nil
if is_wsl2 or is_ssh then
  vim.g.clipboard = {
    name = "OSC 52",
    copy = {
      ["+"] = require("vim.ui.clipboard.osc52").copy("+"),
    },
    paste = {
      ["+"] = function()
        return {
          vim.fn.split(vim.fn.getreg(""), "\n"),
          vim.fn.getregtype(""),
        }
      end,
    },
    cache_enabled = true,
  }
end