Comparte el portapapeles entre bash y X11

11

En este hilo, la respuesta principal muestra cómo copiar texto que se ha seleccionado previamente con el mouse en un terminal gnomo, al portapapeles en X11.

Mi pregunta es: digamos que copio un texto del terminal usando bash set-mark y cobro atajos de teclado (es decir, set-mark+ M-w). ¿Es posible compartir este portapapeles con X11?

EDITAR : En la pregunta original, hablé sobre compartir el portapapeles con GNOME, pero como Gilles señala a continuación, GNOME no tiene específicamente un portapapeles (es general para X), por lo que he actualizado la pregunta.

Amelio Vazquez-Reina
fuente
En gnome-terminal, también puede escribir Ctrl + Shift + C y Ctrl + Shift + V para copiar y pegar en el portapapeles del sistema.
Lie Ryan
2
Vea esta publicación stackoverflow.com/questions/994563/… Pero no funciona para mí.
genial q

Respuestas:

9

El portapapeles de Bash es interno para bash, bash no se conecta al servidor X.

Lo que podría hacer es cambiar el significado de M-wcopiar la selección al portapapeles X además del portapapeles interno de bash. Sin embargo, la integración de bash es bastante flexible, y no creo que haya una manera de acceder a la información de la región o al portapapeles desde el código de bash. Puede hacer un enlace de teclas para copiar toda la línea al portapapeles X.²

if [[ -n $DISPLAY ]]; then
  copy_line_to_x_clipboard () {
    printf %s "$READLINE_LINE" | xsel -ib
  }
  bind -x '"\eW": copy_line_to_x_clipboard'
fi

Si desea hacer cosas sofisticadas en el shell, cambie a zsh, que (entre otras ventajas) tiene una integración mucho mejor entre el editor de línea y el lenguaje de secuencias de comandos.

if [[ -n $DISPLAY ]]; then
  x-copy-region-as-kill () {
    zle copy-region-as-kill
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  x-kill-region () {
    zle kill-region
    print -rn -- "$CUTBUFFER" | xsel -ib
  }
  zle -N x-copy-region-as-kill
  zle -N x-kill-region
  bindkey '\C-w' x-kill-region
  bindkey '\ew' x-copy-region-as-kill
fi

¹ Gnome no tiene específicamente un portapapeles, esto es general para X.
² A partir de bash 4.1, hay un error en el código de análisis de claves: las secuencias de teclas enlazadas bind -xno pueden tener más de dos caracteres. Creo que bash 4.2 corrige algunos casos de prefijos más largos, pero no todos; No he investigado los detalles.

Gilles 'SO- deja de ser malvado'
fuente
Gracias por la idea @Gilles! Creo que es hora de que aprenda y cambie zsh.
Amelio Vazquez-Reina
¡Finalmente! ¡Gracias un montón! Esto copy_line_to_x_clipboardes exactamente lo que me faltaba durante mucho tiempo: el equivalente de copia de shift + insert. Cambié a ctrl-x ( bind -x '"\C-x") porque Escestá demasiado lejos para mi gusto (y Cc sería la opción más tonta posible).
pbarill
Los terminales normalmente tienen una meta clave, que está vinculada a la tecla alt por defecto. Escribir un carácter mientras lo mantiene presionado se traduce a escseguido de ese carácter, por lo que puede escribirlo como alt-w.
DoMiNeLa10
7

@Gilles ya dio una excelente respuesta. Solo me gustaría mencionar la existencia de xclip, que también es una forma muy útil de copiar la salida del terminal al portapapeles X, simplemente colocando cualquier cosa en él:

$ cat /etc/passwd | xclip
Phaphink
fuente
1
Solo una nota que xclipcopia en el búfer primario de forma predeterminada. Para usar el portapapeles, use xclip -selection clipboard.
Sparhawk