Había estado queriendo integrar el búfer de corte de Zsh con el portapapeles X. Probé el http://stchaz.free.fr/mouse.zsh mencionado anteriormente, pero descubrí que no me gustaba que todas mis operaciones de Zsh llenaran el portapapeles. Por ejemplo, a veces copiaría algo en un navegador y luego iría a un shell y editaría la línea de comando y luego pegaría. Pero a menudo, editar la línea de comando, por ejemplo, eliminar una palabra, modifica el búfer de corte Zsh. Para bien o para mal, X solo tiene un portapapeles, no un anillo de cierre, por lo que cuando una operación de edición de Zsh sobrescribe el portapapeles, lo que quería pegar se pierde: no puedo tirarlo (Cy My) como pude hacer en Zsh o Emacs.
Entonces, lo que hice fue crear nuevas combinaciones de teclas especiales para interactuar con el portapapeles X a través de zsh. Resulta que "^ Xw" y "^ Xy" no se utilizan tanto en Emacs como en Zsh, por lo que puedo obtener una interfaz coherente al vincularlos en ambas aplicaciones. De esta forma, las operaciones de edición normales, el búfer de corte y el anillo de cierre se quedan solos. Si quiero copiar algo en el portapapeles, configuro la región y hago "^ Xw" (o si ya la maté y la región está inactiva, puedo hacer "^ Xw" para copiar el búfer de corte). Pegar desde el portapapeles se hace con "^ Xy".
# define commands to copy and paste x clipboard
# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard
# in both cases, modifies CUTBUFFER
copy-to-xclip() {
[[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}
zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip
paste-xclip() {
killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
CUTBUFFER=$(xclip -selection clipboard -o)
zle yank
}
zle -N paste-xclip
bindkey "^Xy" paste-xclip
kill-region
convi-delete
yyank
convi-put-after
etc. De manera similarvi-yank
, ajuste y otros. (No he encontrado una manera de hacerlo más centralmente)