![配置 vim 以同时使用 tmux 和系统剪贴板](https://linux22.com/image/14839/%E9%85%8D%E7%BD%AE%20vim%20%E4%BB%A5%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%20tmux%20%E5%92%8C%E7%B3%BB%E7%BB%9F%E5%89%AA%E8%B4%B4%E6%9D%BF.png)
我对 vim 还很陌生(我正在使用nvim
),所以请原谅我知识的缺乏,许多问题与我的类似,但并不完全相同。
我想要这个:
vim
默认情况下应该剪切/复制到缓冲区,而不是系统剪贴板。vim
的其他寄存器(我认为是+
,如果是,请纠正我*
!)应该转到系统剪贴板。
我做了一些研究,但(到目前为止)对我来说没有任何作用。
信息:
- 我用的是
tmux
这样推入tmux
缓冲区。 - 我不在家,所以目前使用
termux
sotermux-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 的未命名寄存器复制到客户端上的系统剪贴板(反之亦然)。我喜欢它这样的行为,但有时两个人不说话,我不知道为什么。
无论如何,我希望对某人有所帮助!