Neovimでyyがpで貼り付けられない?コンテナ×tmux×mac環境でハマったクリップボード問題の解決法

概要

Neovimでコピー(yy)した内容を貼り付け(p)ようとしたところ、意図しないテキストが挿入されるという現象に遭遇しました。 本記事では、OSC52ベースのクリップボード連携を導入していた際にこの問題に出会い、どのように原因を特定し、どのように理想の挙動を取り戻したかを記録します。

🐞 課題:yy でコピーしたのに p で貼れない?

Neovim上で yy で行をコピーし、その後 p で貼り付けようとしたところ、**貼り付けられたのは直前の yy ではなく、古い内容(またはシステムクリップボードの内容)**でした。

この問題は特に以下の構成で再現しました:

  • macOS (WezTerm)
  • tmux をホスト側とコンテナ内両方で利用
  • Neovimで OSC52 を使った vim.g.clipboard を定義

🔍 調査ログ

1. レジスタの状態を確認

Neovimで以下のコマンドを使って、各レジスタの状態を確認:

:reg "
:reg 0
:reg +
  • yy 実行後、無名レジスタ(")には値が入っている

  • p で貼り付けられる内容は + レジスタの中身だった

2. p のマッピングを確認

:verbose nmap p

結果は no mapping found → p はデフォルト挙動のはず。

3. vim.opt.clipboard の影響を再確認

設定では以下を定義していた:

vim.opt.clipboard:append({ "unnamedplus" })

これは p を “+p に読み替える効果を持つ可能性があり、貼り付け元が無名レジスタではなく、+ レジスタになっていた。

4. vim.g.clipboard による外部プロバイダ使用

vim.g.clipboard = {
  name = "osc-copy",
  copy = {
    ["+"] = 'osc copy -d ' .. tty,
    ["*"] = 'osc copy -d ' .. tty,
  },
  paste = {
    ["+"] = 'osc paste -d ' .. tty,
    ["*"] = 'osc paste -d ' .. tty,
  },
  cache_enabled = 0,
}

この設定により、Neovimは “+ や “* レジスタをすべて osc に委ねており、p の貼り付け対象が “0(ヤンクレジスタ)ではなくなっていた。 (yyによるヤンクは正しく機能していたが、pによる貼り付け時に問題が起きていた)

✅ 解決策:p を “0 レジスタから貼り付けるよう明示する

以下の設定を追加:

vim.keymap.set("n", "p", '"0p', { desc = "Paste from yank register" })
vim.keymap.set("n", "P", '"0P', { desc = "Paste before from yank" })

これにより、p は常に “0(ヤンク専用レジスタ)から貼り付けるようになり、yy → p の流れが安定して動作するようになった。

🔚 結論

Neovimでは、clipboard=unnamedplus や vim.g.clipboard を組み合わせて使う場合、貼り付け先のレジスタに注意が必要です。 特に vim.g.clipboard をカスタマイズすると、Neovimが内部で使っていた無名・ヤンクレジスタの挙動に影響が出る可能性があります。

シンプルに yy → p の流れを取り戻したいなら、p を “0p にマッピングしておくと安全です。