通过共享文件在vim中复制和粘贴

6

如何增强vim的复制和粘贴功能,使得当我复制时,vim会将内容写入文件。当我粘贴时,它会使用文件中的内容。我希望有一个全局缓冲区文件可以在系统中使用。

背景:我在远程服务器上的不同tmux分屏中运行vim(通过ssh连接)。我想在不同的tmux分屏中无缝地复制和粘贴。我尝试了很多插件,但都没有起作用,因此提出了这个问题。


也许 https://superuser.com/questions/235117/vim-copy-paste-across-terminals 或者 https://dev59.com/mmgu5IYBdhLWcg3w0qVK 可以帮到您。 - zedfoxus
你卡在哪里了?可以编写一个范围命令来实现这一点,并覆盖 yp。但我建议不要使用 yp,因为你需要处理很多寄存器。 - Doktor OSwaldo
@DoktorOSwaldo 我尝试了这个答案 https://dev59.com/mmgu5IYBdhLWcg3w0qVK#11052783 。然而,复制/粘贴并不稳定。有时候可以复制,有时候不行。我不知道如何诊断问题。可能是vim从文件中写入和读取的一些复杂性。 - ashim
服务器是否有X服务器?那么X-Forwarding是一个可能的选择。如果不使用tmux分屏而使用vim分屏,则值得考虑,但并非适用于所有用例。实际上可以使用tmux剪贴板。我无法在这方面提供更多帮助,只能暗示必须是相同的tmux会话才能工作。将粘贴的文本写入文件是可行的,但如果要使用正常的vim命令,则会变得复杂,我不建议这样做。 - Doktor OSwaldo
你不需要写入文件来实现这个。只需修复剪贴板集成即可。我经常在不同的终端窗口中ssh到两个不同的服务器,并且可以在一个vim中yank,然后在另一个服务器上粘贴,无论我是在Windows、MacOS还是Linux上使用。如何实现取决于每一侧所使用的操作系统和终端,而tmux会使它变得更加复杂(但仍然有效),因此您需要研究您特定的情况。 - Jim Stewart
3个回答

1
我认为vim允许您像这样操作:
  1. 复制文件A中的内容
  2. :wv并按Enter键
  3. 进入文件B
  4. :rv并按Enter键
  5. p将(现在)全局剪贴板的内容粘贴
这应该可以在不同的vim会话中独立工作,无论它们是否在不同的tmux窗格中运行。

不用担心,这不会删除你的 .viminfo 文件,它只是在追加。 - Tinmarino

1

您想查看:

  • map-operator,因为y是一个操作符:一个等待命令的动作
  • readfile()writefile()会导致rw成为命令,虽然易于使用但不适用于脚本
  • visualmode()获取选择

共享文件硬编码为/tmp/yank.txt

function! Yank(type, ...)
  " Invoked from Visual mode, use gv command.
  if a:0
    silent exe "normal! gvy"
  elseif a:type == 'line'
    silent exe "normal! '[V']y"
  else
    silent exe "normal! `[v`]y"
  endif

  call writefile([@@], '/tmp/yank.txt')
endfunction


function! Paste(is_back)
  let @t = join(readfile('/tmp/yank.txt'), '')
  if a:is_back
    normal! "tP
  else
    normal! "tp
  endif
endfunction


nnoremap y :set opfunc=Yank<CR>g@
nmap Y Vy
vnoremap y :call Yank(visualmode(), 1)<CR>
vnoremap Y :call Yank(visualmode(), 1)<CR>


nnoremap p :call Paste(0)<CR>
nnoremap P :call Paste(1)<CR>

0

yankring插件可以将复制的内容保存到文件中。然后,您可以通过p<C-n>p<C-p>粘贴之前复制的任何文本。

如果这个插件不能满足您的需求,您至少可以尝试对其进行逆向工程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接