将vim的复制和粘贴命令别名为xclip

3

我已经将 cntrl ccntrl v 映射到了 xclip,但是使用它们比普通的 yp 要麻烦。有没有办法将这两个命令别名或将 yp 的内容发送到 xclip,这样我就可以用 yp 进行所有复制和粘贴操作了?

vmap <C-c> y:call system("xclip -i -selection clipboard", getreg("\""))<CR>:call system("xclip -i", getreg("\""))<CR>
nmap <C-v> :call setreg("\"",system("xclip -o -selection clipboard"))<CR>p")")")"))
3个回答

4

您是否尝试使用X剪贴板进行所有复制和粘贴操作?如果是,那么一个很好的替代xclip的方法是确保您正在使用带有X支持的vim(如果您的版本没有它,编译Vim非常容易),然后将以下内容添加到您的vimrc文件中:

set clipboard=unnamed

所有的复制和删除将自动转到*寄存器(即X选择寄存器)。

除了设置clipboard=unnamed外,您还可以通过使用(例如)来使用X选择寄存器进行单个操作

"*yw
"*yy
"*ya(

显然,这并不能回答你如何使用xclip的问题,但希望它提供了一种替代方法。或者其他什么。

实际上,我只是用“y”和“p”替换了“<C-c>”和“<C-v>”,看起来它可以工作,尽管在按下“p”后粘贴似乎需要一段时间,不确定为什么。 - sent-hil

1

我不知道这是否是理想的解决方案,但它可以工作。

set clipboard=unnamedplus

function! ClipboardYank()
  call system('xclip -i -selection clipboard', @@)
endfunction

let vlcb = 0
let vlce = 0
function! ClipboardPaste(mode)
  if (a:mode == "v")
    call cursor(g:vlcb[0], g:vlcb[1]) | execute "normal! v" | call cursor(g:vlce[0], g:vlce[1])  
  endif
  let @@ = system('xclip -o -selection clipboard')
endfunction

" replace currently selected text with default register without yanking it
vnoremap <silent>p "_dP

vnoremap <silent>y y:call ClipboardYank()<CR>
vnoremap <silent>d d:call ClipboardYank()<CR>
nnoremap <silent>dd dd:call ClipboardYank()<CR>

nnoremap <silent>p :call ClipboardPaste("n")<CR>p
vnoremap p :<C-U>let vlcb = getpos("'<")[1:2] \| let vlce = getpos("'>")[1:2] \| call ClipboardPaste("v")<CR>p

对我来说非常好用,谢谢。除了我喜欢使用默认的X选择(在GNU/Linux上),所以我只是在xclip命令行中跳过了-selection clipboard。另外,双重按键绑定对我来说不起作用,但这可能是由于我的timeoutlen=50设置(这是另一个技巧所需的)。 - undefined
我已经改进了自动在X和Wayland之间切换的示例。 - undefined

-1

你也可以使用set clipboard=unnamedplus来默认使用“+”寄存器。我在我的 .vimrc 文件中使用了 yy 命令,然后通过 ctrl-V 将该行粘贴到这里 ;)


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