配置 vim 以同时使用 tmux 和系统剪贴板

配置 vim 以同时使用 tmux 和系统剪贴板

我对 vim 还很陌生(我正在使用nvim),所以请原谅我知识的缺乏,许多问题与我的类似,但并不完全相同。

我想要这个:

  • vim默认情况下应该剪切/复制到缓冲区,而不是系统剪贴板。
  • vim的其他寄存器(我认为是+,如果是,请纠正我*!)应该转到系统剪贴板。

我做了一些研究,但(到目前为止)对我来说没有任何作用。

信息:

  • 我用的是tmux这样推入tmux缓冲区。
  • 我不在家,所以目前使用termuxsotermux-clipboard-get/set

以下是我认为适用于我的情况的方法:

let g:clipboard = {
  \   'name': 'TmuxTermux',
  \   'copy': {
  \      '*': ['tmux', 'load-buffer', '-'],
  \      '+': ['termux-clipboard-set'],
  \    },
  \   'paste': {
  \      '*': ['tmux', 'save-buffer', '-'],
  \      '+': ['termux-clipboard-get'],
  \   },
  \   'cache_enabled': 1,
  \ }

现在,当我剪切/复制时,tmux缓冲区共享vim内容,完美! (几乎...),+但我无法使用缓冲区来使用系统剪贴板,如果我按“+”,它只会将光标向下移动一行,如果我交换上面的顺序(使termux-clipboard-get/set寄存器*,而不是+),当我按下时,*它会突出显示光标所在单词的所有实例。

通过阅读,我期望:

  • 默认情况下,vim使用*寄存器,这似乎是正确的,因为它成功注册到tmux缓冲区dd/yy并粘贴p(或与tmux我的绑定[PREFIX]+[p]
  • 如果我想剪切/复制/粘贴到我的其他寄存器+(系统剪贴板),那么我会使用+dd/+yy然后粘贴+p(甚至*dd/*yy/*p),但这对我不起作用。

问题:

如上所述,+将光标向下移动一行,当将其更改为寄存器时**突出显示当前单词及其任何其他出现的情况

向那些有更多经验的人道歉,我刚刚经历过emacs(小指非常酸痛!:)

答案1

我使用 vim 和 tmux 并处理系统剪贴板,我有以下内容:

" copy and paste with clipboard  
                                                                                                                                                        
" paste from system CTRL-C clipboard                                                                                                                                                                                                      
nnoremap <Leader>p "+p                                                                                                                                                                                                                    
" paste from system highlighted clipboard                                                                                                                                                                                                  
nnoremap <Leader>P "*p                                                                                                                                                                                                                    
" copy contents of unnamed register to system CTRL-C clipboard                                                                                                                                                                            
nnoremap <silent><Leader>y :call Preserve("normal! Gp\"+dGu")<cr>                                                                                                                                                                         
            \ :echo 'copied to CTRL-C clipboard'<cr>                                                                                                                                                                                      
" copy contents of unnamed register to system highlghted clipboard                                                                                                                                                                        
nnoremap <silent><Leader>Y :call Preserve("normal! Gp\"*dGu")<cr>                                                                                                                                                                         
            \ :echo 'copied to highlight clipboard'<cr>             

<Leader>y 和 <Leader>Y 让我将内容从 vim 的未命名寄存器拉到系统剪贴板。这两个重映射依赖于以下函数(该函数必须出现在 .vimrc 中的重映射之前:

" run a command, but put the cursor back when it's done                                                                                                                                                                                       
function! Preserve(command)                                                                                                                                                                                                                   
    " Preparation: save last search, and cursor position.                                                                                                                                                                                     
    let _s=@/                                                                                                                                                                                                                                 
    let l = line(".")                                                                                                                                                                                                                         
    let c = col(".")                                                                                                                                                                                                                          
    " Do the business:                                                                                                                                                                                                                        
    execute a:command                                                                                                                                                                                                                         
    " Clean up: restore previous search history, and cursor position                                                                                                                                                                          
    let @/=_s                                                                                                                                                                                                                                 
    call cursor(l, c)                                                                                                                                                                                                                         
endfunction        

注意,我没有花很多时间测试以下内容,但我发现当我 ssh 进入(linux)主机时,并且在主机上(但不是在客户端上)的 tmux 会话中,这些重新映射有时似乎能够从主机上 vim 的未命名寄存器复制到客户端上的系统剪贴板(反之亦然)。我喜欢它这样的行为,但有时两个人不说话,我不知道为什么。

无论如何,我希望对某人有所帮助!

相关内容