¿Cómo empujar los portapapeles del sistema para eliminar el contenido del anillo en tiempo real cuando copio fuera de emacs?

8

Noté que cuando copio algo fuera de Emacs, la cosa no parece matar al anillo de inmediato, excepto que lo tiro a Emacs. Si copio dos veces, solo se puede obtener la última copia por tirón.

A veces, me gustaría empujar las copias de los portapapeles del sistema para matar el anillo una vez que haga la copia. Después de eso, puedo seleccionar lo que necesito en el anillo de matar para pegar en Emacs. Entonces, ¿cómo puedo lograr que las copias puedan ser empujadas al ring de la muerte muchas veces?

Estoy en Windows 7.

Leu_Grady
fuente

Respuestas:

5

TL; DR: puede usar clipmondisponible en MELPA y activar clipmon-mode.

Nota: los detalles a continuación se aplican a los servidores X, pero el paquete debería funcionar en cualquier plataforma.

¿Cómo funciona el portapapeles? El portapapeles se implementa como un proceso asincrónico. Cuando copia desde una aplicación, se convierte en el "propietario del portapapeles" pero en realidad no coloca los datos copiados en ninguna parte. Cuando pega en una aplicación, solicita los datos del "propietario del portapapeles" actual.

Referencia: http://www.jwz.org/doc/x-cut-and-paste.html

Cómo obtener el contenido del portapapeles Según tengo entendido, la forma "confiable" de ver si hay nuevos datos en el portapapeles es sondear periódicamente el servidor X para verificar qué hay allí. Para emacs, el paquete clipmon ( https://github.com/bburns/clipmon ) hace eso. Cada dos segundos por defecto.

Extracto del archivo README:

También agrega cambios al portapapeles del sistema en el anillo de cierre, convirtiendo a Emacs en un administrador de portapapeles para texto; luego puede usar un paquete como Browse-kill-ring o helm-ring para ver y administrar su historial del portapapeles.

(Tenga en cuenta que en realidad no probé este paquete, pero ciertamente parece una solución).

YoungFrog
fuente
3

No estoy seguro de que sea posible que aparezca texto copiado en su anillo de eliminación inmediatamente después de la copia, a menos que haya alguna forma de ejecutar un enlace en la copia. Obviamente, esto dependería de su sistema operativo / entorno, pero quería mencionar que es posible que desee intentar configurar

(setq save-interprogram-paste-before-kill t)

Lo que al menos conservará el texto copiado del sistema operativo cuando algo se copia desde dentro de emacs.


De C-h v save-interprogram-paste-before-kill:

Guarde las cadenas del portapapeles en el anillo de matar antes de reemplazarlas.

Cuando uno selecciona algo en otro programa para pegarlo en Emacs, pero mata algo en Emacs antes de pegarlo, esta selección desaparece a menos que esta variable sea nula, en cuyo caso la selección del otro programa se guarda kill-ring antes de que el Emacs mate y todavía se puede pegar usando C-y M-y.

imalison
fuente
Sí, esta variable puede hacer exactamente lo que dijiste. Pero no solo estoy pidiendo eso, quiero que el anillo de matar pueda guardar una copia fuera de Emacs una vez que haya copiado.
Leu_Grady
2

Finalmente descubrí una solución torpe, que se refería al concepto de clipmon. Pero muy simple con el código de una línea:

(run-at-time 0 3 (lambda () (interactive) (current-kill 0)))

El anillo de matar se sincronizará cada 3 segundos con el portapapeles del sistema. Por supuesto, puede alterar el intervalo a un valor aún menor.

PD: La razón por la que necesito esta funcionalidad es que quiero definir un comando que pueda invocarse con argumentos de lo que copié externamente.

Gracias por las respuestas de @kaushalmodi y @YoungFrog.

Leu_Grady
fuente