为*和+寄存器定义自定义命令


9

如果我正在使用带有该xterm_clipboard功能的Vim版本,则可以通过寄存器获取系统剪贴板内容+

如果我使用的构建不具有此功能,我可以使"+注册调用我的自定义程序来检索和设置系统剪贴板(xsel -boxsel -bi,或同样使用xclip)吗?与"*呼叫xsel -po和相同xsel -pi

关键是能够键入类似内容,"+p而不必担心该功能是否可用。打字:r !xsel -b<Enter>是不是我要找的:我希望同样的击键工作,我想贴变种遵循什么可用的“真”寄存器(Pgp,...)。

好处:我可以为其他寄存器名称定义自定义命令吗?

Answers:


7

一些<expr>映射应该可以在这里完成工作。基本结构是

function! ClipboardOrXclip(command, register)
    if a:register !~ '[+*]' || has('xterm_clipboard') || has('gui_running')
        " Just return the original command if the clipboard is accessible
        " or it's not a register that should be handled by xsel
        return a:command
    endif
    if a:register == '+'
        return "<Esc>:r !xsel -bo<CR>"
    else
        return "<Esc>:r !xsel -po<CR>"
    endif
endfunction

nnoremap <silent> <expr> p ClipboardOrXclip('p', v:register)

该功能将需要扩展到处理的所有变化pPgp等,但是这应该是一个良好的开端。


这似乎是在正确的轨道上,但是没有用。普通p(无前缀"和寄存器名称)除了"p在状态行中显示make外,不执行其他任何操作。"ap等价于a"bp哔哔声,……我听不懂逻辑。"+立即发出哔哔声,我什至不用说我的意思+*作为注册名。
吉尔斯(Gilles)'所以别再邪恶了'

1
假设这些基本问题已解决,是否有我需要覆盖的详尽命令列表?场景看起来令人生畏,尤其是如果我也想支持猛拉动作时。
吉尔(Gilles)'所以别再邪恶了'

@Gilles已更新,以修复非+ / *寄存器的行为。"+vim拥有时间的问题-xterm_clipboard更加困难,因为它永远无法使用此功能。指定无效的寄存器(+)将中止命令。所以,看起来行为实际上必须被反转,因此将"+or 映射"*,然后处理用户指定的命令...
jamessan 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.