emacs elisp

¿Cómo conservar el contenido del portapapeles en Emacs en Windows?



elisp (5)

Creo que el problema es que cuando tiras desde el portapapeles fuera de emacs, no estás guardando para el anillo de muerte.

Lo que necesitarías es usar la función clipboard-yank para insertar la región, luego seleccionarla y guardarla en el anillo de eliminación, como hace la función kill-ring-save.

O incluso mejor, escriba una función de portapapeles para salvar a matar anillo y tirón que guarda el clipboad en el anillo de corte y luego lo tira.

edit: rastreando un poco el código, esto hace lo que quieres; Podrías conectarlo a una llave. Guarda el contenido del portapapeles de Windows en el anillo de muerte.

(defun clipboard-to-kill-ring() "save the external clipboard contents to the kill ring" (interactive) (let ((clip (funcall interprogram-paste-function))) (when clip (kill-new clip))) (defadvice yank (before maybe-copy-windows-clipboard (arg)) (clipboard-to-kill-ring)) (ad-activate ''yank)

Este es el escenario que me encontré varias veces:

Copio un texto de otro programa. Diríjase a Emacs e hice algunas ediciones antes de pegar / tirar el texto. Vaya a tirar y listo ... no es el texto que pretendía pegar. Luego me doy cuenta de que mientras muevo las cosas, use comandos como kill- línea y matanza atrás, y esas líneas y palabras muertas ahora ocupan el anillo de matanza. Pero escribir Mi no devuelve el texto copiado original, por lo que debo volver a mi programa original para copiar el texto nuevamente. Y aún peor, si el programa original está cerrado, perdí el texto copiado por completo.

Kill-line, etc. son comandos tan básicos (como presionar la tecla eliminar, casi), y aunque no me importa que el kill-ring esté un poco abarrotado al usar esos comandos, espero que mi texto original permanezca en algún lugar en el kill-ring para que finalmente pueda encontrarlo escribiendo Mi algunas veces. ¿Cómo puedo hacer que Emacs conserve automáticamente el contenido actual del portapapeles en el anillo de ataque antes de anular el contenido del portapapeles?


En cierto modo, soluciono este problema simplemente tirando del texto y volviéndolo a matar, cuando aparece Emacs después de hacer una copia o cortar en otra aplicación de Windows.

Un enfoque mejor sería hackear emacs para que cuando mates algo, compare el portapapeles existente con la entrada superior en el anillo de cierre, y si es diferente, empuja el contenido del portapapeles al anillo de cierre, antes de realizar el asesinato que solicitaste explícitamente .


Este código debe colocar automáticamente la selección (desde fuera de Emacs) en el kill-ring cada vez que hagas un kill en Emacs. Se ha probado en Linux, pero no debe estar restringido a Linux.

(defadvice kill-new (before kill-new-push-xselection-on-kill-ring activate) "Before putting new kill onto the kill-ring, add the clipboard/external selection to the kill ring" (let ((have-paste (and interprogram-paste-function (funcall interprogram-paste-function)))) (when have-paste (push have-paste kill-ring))))

Si te encuentras haciendo esto mucho, puede ser útil echarle un vistazo al paquete browse-kill-ring , que te da una buena vista del anillo kill (en lugar de teclear repetidamente My ).


Supongo que podría piratear los diversos comandos de eliminación para no poner texto en el portapapeles, y luego tener el clip-yank enlazado a una clave diferente, no sé si eso funcionaría.


Tenga en cuenta que la última versión de Emacs CVS tiene la variable save-interprogram-paste-before-kill que hace exactamente esto cf: del etc/NEWS :

** Cuando save-interprogram-paste-before-kill'' is non-nil, emacs will not clobber the the interprogram paste when something is killed in it by saving the former in the kill-ring "antes que el segundo.