From 589c3e06d8ac241f8ec3cdd1919a31cbe0c8737e Mon Sep 17 00:00:00 2001 From: hc Date: Tue, 10 Nov 2026 10:47:53 +0800 Subject: tmux, vimrc: non-blocking clipboard, yank to local and remote, prefix ] pastes remote then local --- core/vimrc | 39 ++++++--------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) (limited to 'core/vimrc') diff --git a/core/vimrc b/core/vimrc index 26ebdb6..93608ce 100644 --- a/core/vimrc +++ b/core/vimrc @@ -60,44 +60,17 @@ nnoremap f :LspDocumentFormat| " \f: format file nnoremap em :call ExpandMacro()| " \em: expand macro under cursor -" ===== Shared clipboard: RAM file /dev/shm/clip/buf on g:clip_host (same as tmux.conf) ===== +" ===== Clipboard: every yank goes to both places, neither blocks; paste is always local ===== +" local: OSC 52 sends @" to the terminal you type in (inside tmux needs set-clipboard on) +" remote: background ssh job writes @" to RAM file /dev/shm/clip/buf on g:clip_host; failure is silent let g:clip_host = 'root@p.noml.ch' -" One persistent ssh link (opens on first use, one key touch). let g:clip = ['ssh', '-o', 'ControlMaster=auto', '-o', 'ControlPersist=yes', '-o', 'ControlPath=~/.ssh/cm-%C', '-o', 'ServerAliveInterval=30', '-o', 'ConnectTimeout=3', '-o', 'StrictHostKeyChecking=no', '-o', 'UserKnownHostsFile=/dev/null', '-o', 'LogLevel=ERROR', g:clip_host] -" push (yank): every yank or delete sends @" in a background job -augroup ssh_clipboard +augroup clipboard au! +au TextYankPost * call echoraw("\e]52;c;" . (exists('*str2blob') ? base64_encode(str2blob(split(@", "\n", 1))) : system("base64 | tr -d '\\n'", @")) . "\x07") 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); -" no buffer on g:clip_host yet (exit 3, e.g. after its reboot) = normal local paste; -" any other failure prints a message and skips the paste. Counts and "x register prefixes still work. -function! ClipPull() abort - let l:i = 0 - while exists('g:clip_job') && job_status(g:clip_job) ==# 'run' && l:i < 30 - sleep 100m - let l:i += 1 - endwhile - let l:out = system("perl -e 'alarm 3; exec @ARGV' " . join(g:clip) . " '[ -f /dev/shm/clip/buf ] || exit 3; cat /dev/shm/clip/buf'") - if v:shell_error == 3 - return 1 - elseif v:shell_error - echohl ErrorMsg | echo 'clip: pull from ' . g:clip_host . ' failed or took >3s, paste skipped' | echohl None - return 0 - endif - call setreg('"', l:out) - return 1 -endfunction -for s:k in ['p', 'P', 'gp', 'gP', ']p', '[p'] - execute 'nnoremap ' . s:k . " ClipPull() ? '" . s:k . "' : ''" -endfor -for s:k in ['p', 'P'] - execute 'xnoremap ' . s:k . " ClipPull() ? '" . s:k . "' : ''" -endfor -" ===== end shared clipboard ===== +" ===== end clipboard ===== filetype plugin indent on -- cgit