blog · git · desktop · images · contact


Vim und xclip verheiraten

2020-06-20

gVim hat zwei besondere Register, "* und "+, die den X11-Selections PRIMARY und CLIPBOARD entsprechen. Ich mutmaße, dass die meisten Leute das (oder die Maus) verwenden. Wie bei X11-Selections üblich, sind sie nicht mehr verfügbar, sobald die Anwendung beendet wird. Eine Möglichkeit, damit umzugehen, sind dann Clipboard-Manager.

Eine andere Variante ist, explizit zu forken und einen Prozess zurückzulassen, der die Selection hält. Das ist im Wesentlichen, was xclip tut. Hat auch den Vorteil, dass das mit einem „normalen“ Vim funktioniert, braucht also keinen gVim.

Diese Key-Bindings habe ich in meiner ~/.vimrc:

nmap <Leader>xc :call X11Copy()<CR>
vmap <Leader>xc "xy:call X11CopyRegister('x')<CR>
nmap <Leader>xp :call X11PasteClipboard()<CR>
nmap <Leader>xP :call X11PastePrimary()<CR>

Wenn Text im Visual-Modus selektiert ist, kann ich ,xc drücken, um ihn ins X11 CLIPBOARD zu kopieren. ,xc ohne aktive Auswahl kopiert die ganze Datei. ,xp ist entsprechend zum Pasten.

Die Funktionen sehen dann so aus:

fun! X11Copy()
    silent %w !setsid xclip -selection clipboard
endfun

fun! X11CopyRegister(reg)
    let l:ignore = system('setsid xclip -selection clipboard', getreg(a:reg))
endfun

fun! X11PasteClipboard()
    r !xclip -selection clipboard -o
endfun

fun! X11PastePrimary()
    r !xclip -o
endfun

setsid erzeugt eine neue Session, aber vor allem auch eine neue Process Group, damit mein xclip nicht durch ein SIGHUP gekillt wird, wenn man das Terminal unerwartet schließt.

Es hat eine Weile gedauert, bis ich herausgefunden hatte, wie man korrekterweise Text aus dem Visual-Modus kopiert. Da muss man ein bisschen tricksen, weil man natürlich nur das kopieren will, was auch sichtbar markiert ist. Der Workaround besteht darin, das zuerst ins Register "x zu kopieren und dann dessen Inhalt an xclip zu senden. (Naive Ansätze bringen einen schnell zu :'<,'>, was aber zeilenbasiert arbeitet.)

,xc und ,xp sind nur meine persönliche Präferenz. Mir gefällt daran, dass sie sich klar von den normalen Key-Bindings für Register unterscheiden. Man ist sich dann definitiv gewahr, dass man es jetzt mit X11-Selections zu tun hat.

Comments?