Files
dotfiles/profiles/base/.vim/plugin/vimtmuxclipboard.vim
2026-02-13 04:20:30 +01:00

79 lines
2.1 KiB
VimL

let g:vim_tmux_clipboard#loadb_option = get(g:, 'vim_tmux_clipboard#loadb_option', '')
func! s:TmuxBufferName()
let l:list = systemlist('tmux list-buffers -F"#{buffer_name}"')
if len(l:list)==0
return ""
else
return l:list[0]
endif
endfunc
function! s:on_stdout(job_id, data, event)
let @" = join(a:data, "\n")
endfunction
func! s:AsyncTmuxBuffer()
call jobstart('tmux show-buffer', {'on_stdout': function('s:on_stdout'), 'stdout_buffered': 1})
endfunc
func! s:TmuxBuffer()
return system('tmux show-buffer')
endfunc
func! s:Enable()
if $TMUX==''
" not in tmux session
return
endif
let s:lastbname=""
" if support TextYankPost
if exists('##TextYankPost')==1
" @"
augroup vimtmuxclipboard
autocmd!
autocmd FocusLost * call s:update_from_tmux()
autocmd FocusGained * call s:update_from_tmux()
autocmd TextYankPost * silent! call system('tmux loadb ' . g:vim_tmux_clipboard#loadb_option . ' -',join(v:event["regcontents"],"\n"))
augroup END
if exists('*jobstart')==1 " Only supported on Neovim
call s:AsyncTmuxBuffer()
else
let @" = s:TmuxBuffer()
endif
else
" vim doesn't support TextYankPost event
" This is a workaround for vim
augroup vimtmuxclipboard
autocmd!
autocmd FocusLost * silent! call system('tmux loadb ' . g:vim_tmux_clipboard#loadb_option . ' -',@")
autocmd FocusGained * let @" = s:TmuxBuffer()
augroup END
let @" = s:TmuxBuffer()
endif
endfunc
func! s:update_from_tmux()
let buffer_name = s:TmuxBufferName()
if s:lastbname != buffer_name
let @" = s:TmuxBuffer()
endif
let s:lastbname=s:TmuxBufferName()
endfunc
call s:Enable()
" " workaround for this bug
" if shellescape("\n")=="'\\\n'"
" let l:s=substitute(l:s,'\\\n',"\n","g")
" let g:tmp_s=substitute(l:s,'\\\n',"\n","g")
" ");
" let g:tmp_cmd='tmux set-buffer ' . l:s
" endif
" silent! call system('tmux loadb -w -',l:s)