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 にマッピングしておくと安全です。