tmux xclip copy ya no funciona


8

En mis configuraciones de Ubuntu 12.04, mis comandos de copiar y pegar del portapapeles tmux se configuran de la siguiente manera:

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

Esto funcionó muy bien por el tiempo más largo hasta hace aproximadamente un mes, cuando sospecho que se realizó algún cambio de configuración o cambio de paquete que rompió lo anterior. En el terminal GNOME, pegar aún funciona bien con prefix+ ctrl-vy ctrl-shift-v.

Sin embargo, el xclipcomando copiar ya no funciona sin importar lo que haga, y he intentado eliminar el enlace de prefijo personalizado anterior, usando en -selectlugar de -sel, no usando, clipboardetc. Esto es más o menos un show stopper para un usuario de GVim como yo, ya que no ' Incluso tiene la solución de terminal de GNOME ctrl-shift-ccon tmux tomando el control del shell. Entro en modo copia, selecciono texto con space+ movement, y cuando ejecuto prefix+ ctrl-cno pasa absolutamente nada. Antes de que esto se rompiera, tmux mostraría un mensaje de confirmación en la sección de notificaciones en la parte inferior.

¿Alguien tiene sugerencias en cuanto a cómo se podría depurar esto? Este es un gran éxito de productividad. Probablemente pueda usar el truco de solución temporal de archivos temporales por ahora , pero sería genial saber qué sucedió xclip.


¿Está xclip realmente disponible? ¿Cuál es la salida de type xclip?
Chris Down

El resultado es: "xclip es / usr / bin / xclip". Como mencioné, pegar a través de xclip funciona bien por cualquier razón.
Alexandr Kurilin

1
¿Tienes el mismo problema con xsel -b?
Gilles 'SO- deja de ser malvado'

@Gilles, xsel -i -bparece hacer el truco!
Alexandr Kurilin

Je ¡No tengo idea de por qué funciona, pensé xsel -by xclip -selection clipboardharía lo mismo!
Gilles 'SO- deja de ser malvado'

Respuestas:


9

La xselutilidad es similar xclippero implementada de manera un poco diferente. Normalmente esperaría que se comportaran de la misma manera, pero no hacen exactamente la misma llamada a la biblioteca X, por lo que es posible que en algunos casos de esquina xselfuncione pero no xclip, o viceversa. Tratar:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

El mismo resultado, no funciona para mí, funciona como un comando independiente pero devuelve una cadena vacía de dicho enlace; Ubuntu 14.04, xsel 1.2.0, tmux 1.8-5
Vitaly Zdanevich

6

Agregar -ba run-shell(o run) comando solucionó el problema. Con -bel comando shell se ejecuta en segundo plano.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"


2

Aunque ya no puedo reproducirlo, aquí está la respuesta técnica de lo que podría haber sucedido en su caso.

Primero, debe comprender cómo funciona el portapapeles X11. Puede leer el ensayo de jwz sobre esto: http://www.jwz.org/doc/x-cut-and-paste.html

En resumen, la aplicación que contiene el contenido del portapapeles debe ejecutarse hasta que otra aplicación confirme la propiedad. Entonces, cuando ejecuta xclip -i <<< test, puede ver xclip ejecutándose en segundo plano hasta que realice otra selección:

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

Ahora todo está bien, pero cuando sale de este shell, todos los procesos que pertenecen a esta sesión se eliminan de forma predeterminada al enviarles una señal HUP. Esto significará que xclip será eliminado y que ya no podrá acceder al contenido del portapapeles.

Entonces, la solución sugerida (en caso de que no tenga xsel) es ignorar la señal HUP mediante el siguiente enlace:

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xselNo se ve afectado por este problema porque lo primero que hace después de la bifurcación () es desasociarse del terminal de control para que no reciba la señal HUP cuando sale su shell (ni siquiera lo verá en el ps anterior salida pero solo cuando haces a ps -e | grep xsel).


1

Estoy experimentando un problema similar y el archivo temporal no ayudará en este caso particular, me temo. Esto se debe a que xclipparece comportarse de manera diferente cuando es generado por tmux que cuando se ejecuta "interactivamente" y espera a que otra aplicación tome posesión del área del portapapeles. Intente usarlo xclip -l 1para que se cierre inmediatamente (consulte la página del manual para obtener más detalles).


Parece que no puede funcionar ese trabajo. ¿Es así como debería ser ese enlace: bind Cc run "tmux save-buffer - | xclip -l 1 -i -sel portapapeles"?
Alexandr Kurilin

¿Tal vez podría publicar qué solución le funcionó? ¡Eso también sería muy útil!
Alexandr Kurilin

Estoy usando bind C-y run-shell "tmux save-buffer - | xclip -l 1 -i".
Peter

Sí, todavía nada desafortunadamente. Tmux no informa nada, ni xclip.
Alexandr Kurilin

Para mí tampoco informa nada, pero funciona. Verifique qué xclipestá haciendo cuando intenta copiar el búfer. Si se queda colgando allí esperando algo, ¿ayuda matarlo? Además, debe salir del modo de selección presionando Entrar (y, por lo tanto, almacenarlo en el búfer) antes de intentar copiar el búfer en el portapapeles X.
Peter

1

Esta es una vieja pregunta, pero sospecho que tengo la solución, tomada de la página de Tmux de la wiki de Arch :

xclip también podría usarse para ese propósito, a diferencia de xsel, funciona mejor en la impresión de flujo de bits sin formato que no se ajusta a la configuración regional actual. Sin embargo, es mejor usar xsel en lugar de xclip, porque xclip no cierra STDOUT después de leer del búfer de tmux. Como tal, tmux no sabe que la tarea de copia se ha completado y continúa esperando la terminación de xclip, lo que hace que tmux no responda. Una solución alternativa es redirigir STDOUT de xclip a / dev / null

Entonces su comando debería convertirse en:

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"

0

Esta es una configuración de trabajo que uso:

# Yank to copy text with y.
bind-key -t vi-copy y copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Update default binding of `Enter` to also copy with this method.
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "tmux save-buffer - | xclip -sel clipboard -i"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# Bind ']' to paste.
bind ] run "tmux set-buffer \"$(xclip -o -sel clipboard)\" && tmux paste-buffer"

# Toggle rectangular copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle

# http://askubuntu.com/a/507215/413683
set -g set-clipboard off
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.