Pregunta

En mi .zshrc, utilizo el siguiente fragmento para integrar el portapapeles del shell y mi portapapeles X11 principal.Gracias a esta integración, puedo cortar y pegar texto hacia y desde emacs, firefox y la terminal sin tener que usar el mouse.

kill-line() { zle .kill-line ; echo -n $CUTBUFFER | xclip -i }
zle -N kill-line # bound on C-k

yank() { LBUFFER=$LBUFFER$(xclip -o) }
zle -N yank # bound on C-y

Nota:También uso este truco en mac os x (con pbcopy/pbpaste en lugar de xclip) y gracias a Sinergia Mis dos computadoras comparten un solo portapapeles.Limpio.Pero no funciona con readline.Y me encuentro usando readline con bastante frecuencia, por ejemplo en (i)python, en gdb, en ncftp...

Entonces aquí viene mi pregunta: ¿Hay alguna manera de integrar el portapapeles de Readline con el resto del mundo?

Por supuesto, estoy pensando en algunos .inputrc magia aquí, pero cualquier idea/idea sería bienvenida.

¿Fue útil?

Solución

Personalmente, manejo todo dentro. pantalla ÑU.Esto me brinda toneladas de funcionalidad en todos los programas basados ​​en terminal, no solo en los basados ​​en readline.Tiene sus propios buffers de pegado, que se comparten entre todas las pantallas de su sesión actual, y puede leer/escribir un archivo de intercambio (configurable con bufferfile).

  • Se realiza una selección de pantalla con Control+A, [, <movimiento>, Espacio, <movimiento>;
  • copiado al buffer de pegado con Ingresar;
  • pegado con Control+A, ];
  • reemplazado por el contenido del archivo de intercambio con Control+A, <;
  • y escrito en el archivo de intercambio con Control+A, >.

Entonces todo lo que necesitas son pequeños ayudantes para sincronizar /tmp/screen-exchange y la selección X.Algo tan simple como esto funcionaría.

# ~/.screenrc (or entered at C-a : command prompt)
bind '{' exec sh -c 'xclip -o>~/.screen_exchange'
bind '}' exec sh -c 'xclip -i ~/.screen_exchange'

Por supuesto, algunos enlaces y macros mejores harían la vida más fácil (esto requiere C-a { C-a < C-a ] para pegar la selección X en el terminal), pero depende completamente de usted.

Otros consejos

Bash 4.0 introduce algunas funciones nuevas:

NOTICIAS

El comando asignado a una secuencia de teclas con `bind -x'Ahora establece dos nuevas variables en el entorno del comando ejecutado: READLINE_LINE_BUFFERy READLINE_POINT.El comando puede cambiar la línea de lectura de lectura actual y la posición del cursor modificando READLINE_LINE_BUFFER y READLINE_POINT, respectivamente.

El NEWS el archivo parece ser inexacto; READLINE_LINE (No _BUFFER) es lo que está documentado en otros lugares y realmente funciona.

Lo siguiente simulará el comportamiento de los archivos existentes de Bash. Control+(Ud.|k|Y) pero afectando la selección X, aunque uso Meta/Esc porque no me gusta sobrescribir la funcionalidad existente.

_xdiscard() {
    echo -n "${READLINE_LINE:0:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=0
}
_xkill() {
    echo -n "${READLINE_LINE:$READLINE_POINT}" | xclip
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}"
}
_xyank() {
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$(xclip -o)${READLINE_LINE:$READLINE_POINT}"
}
bind -m emacs -x '"\eu": _xdiscard'
bind -m emacs -x '"\ek": _xkill'
bind -m emacs -x '"\ey": _xyank'

Me sigue gustando screen más, pero esto responde mejor a su pregunta, siempre y cuando la única aplicación readline que le interese sea Bash.

Me gustaría proponer la siguiente función _xyank() basado en la respuesta de ephemient:

_xyank() {
    CLIP=$(xclip -o)
    COUNT=$(echo -n "$CLIP" | wc -c)
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}${CLIP}${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(($READLINE_POINT + $COUNT))
}

Lo que esto hace es mover el cursor hasta el final del texto pegado, lo que es más coherente con otros comandos internos.

Como he escrito aquí , encontré puede ser mejor tener combinaciones de teclas separadas para poblar el portapapeles X, esto se debe a que a menudo utilizan "matar" para la manipulación de texto en Readline, y yo no quiero que esto para acabar con el portapapeles cada vez.

Cuando Readline consigue siempre la posibilidad de tener combinaciones de teclas que activan las interacciones con X, me gustaría recomendar la unión ^ XW y cómo ^ XY para copiar y pegar.

Sé que esto no proporciona una solución a su pregunta, pero no tengo representante suficiente para decirlo en un comentario.

En cuanto a extender Readline con la capacidad de unirse a los comandos de teclas, lo traje para arriba en la lista de correo Readline, vamos a ver qué dice Chet:

https://lists.gnu.org /archive/html/bug-readline/2016-05/msg00002.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top