From 402a854a195ea1e63c622edeee5dbbc802441d53 Mon Sep 17 00:00:00 2001 From: xs Date: Tue, 10 Nov 2026 09:39:10 +0800 Subject: tmux, vimrc: yanks also go to the local terminal clipboard via OSC 52 tmux: set-clipboard on, so OSC 52 written by vim inside a pane is forwarded to the client terminal (external dropped it). vimrc: TextYankPost writes @" as OSC 52 next to the existing ssh push; base64 via the base64 command since base64_encode()/str2blob() are newer than vim 9.1.83. --- core/tmux.conf | 4 +++- core/vimrc | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/tmux.conf b/core/tmux.conf index 0093aaa..b9a6cb1 100644 --- a/core/tmux.conf +++ b/core/tmux.conf @@ -57,7 +57,9 @@ bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-no-clear "$YAN # no buffer on CLIP_HOST yet (exit 3, e.g. after its reboot) = paste tmux's own buffer bind-key ] run-shell "f=\$(mktemp); $CLIP '[ -f /dev/shm/clip/buf ] || exit 3; cat /dev/shm/clip/buf' >\$f; r=\$?; [ \$r -eq 0 ] && tmux load-buffer \$f; rm -f \$f; [ \$r -eq 0 ] || [ \$r -eq 3 ] && tmux paste-buffer -p" # ===== end shared clipboard ===== -# TODO: try `set -g set-clipboard off` later (tmux default "external" sends copies to the local terminal clipboard via OSC 52); unrelated to the shared clipboard above +# OSC 52: copy-mode yanks also go to the clipboard of the terminal you type in; "on" (not "external") +# also forwards OSC 52 that vim writes inside a pane +set -g set-clipboard on # Linux only: true-color regardless of what TERM the outer terminal/distro sets if-shell 'uname | grep -q Darwin' {} { diff --git a/core/vimrc b/core/vimrc index fee3ba3..26ebdb6 100644 --- a/core/vimrc +++ b/core/vimrc @@ -68,6 +68,8 @@ let g:clip = ['ssh', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=yes', '-o augroup ssh_clipboard au! au TextYankPost * let g:clip_job = job_start(g:clip + ['umask 077; mkdir -p /dev/shm/clip && cat >/dev/shm/clip/new && mv /dev/shm/clip/new /dev/shm/clip/buf'], {'in_io': 'pipe', 'out_io': 'null', 'err_io': 'null'}) | call ch_sendraw(g:clip_job, @") | call ch_close_in(g:clip_job) +" also OSC 52: @" to the clipboard of the terminal you type in (inside tmux needs set-clipboard on) +au TextYankPost * call echoraw("\e]52;c;" . system("base64 | tr -d '\\n'", @") . "\x07") augroup END " pull (paste): every p P gp gP ]p [p (normal) and p P (visual) first fetches the buffer into @". " Waits up to 3 s for a pending push, then up to 3 s for the fetch (perl alarm kills ssh); -- cgit