2009-05-11 14 views
16

Este es el escenario que me encontré varias veces:¿Cómo conservar el contenido del portapapeles en Emacs en Windows?

Copio texto de otro programa. Ve a Emacs y edita un poco antes de pegar/tirar el texto. Cy para tirar y voila ... no el texto que pretendí pegar. Entonces me doy cuenta de que, mientras muevo las cosas, utilizo comandos como kill- line and backward-kill-word, y esas líneas y palabras matadas ahora ocuparon el kill-ring. Pero escribir M-y no devuelve el texto original copiado, así que tengo que volver a mi programa original para copiar el texto nuevamente. Y peor aún si el programa original está cerrado, entonces perdí por completo el texto copiado.

Kill-line, etc. son comandos básicos (como presionar la tecla borrar, casi), y aunque no me importa que el kill-ring esté un poco desordenado al usar esos comandos, espero que mi original el texto se queda en algún lugar del kill-ring para que eventualmente lo pueda encontrar escribiendo My un par de veces. ¿Cómo puedo hacer que Emacs preserve automáticamente el contenido actual del portapapeles en el kill-ring antes de anular el contenido del portapapeles?

Respuesta

12

Este código debe colocar automáticamente la selección (desde fuera de Emacs) en el anillo de matar cada vez que se hace una matanza en Emacs. Ha sido probado en Linux, pero no debe restringirse 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 usted se encuentra haciendo esto mucho, puede ser útil para tomar un vistazo al paquete browse-kill-ring, lo que le da una buena vista del histórico de recortes (en contraposición a escribir repetidamente M-y).

+0

simple, fácil, perfecto. Lo usé hoy. Había copiado un texto de un navegador, y luego entró en emacs para pegarlo en un nuevo archivo. Sin darme cuenta, había usado algunos comandos kill en el nombre de ruta del archivo cuando abría el nuevo archivo. Sin esta secuencia de comandos, el contenido del portapapeles desaparecería. ¡Pero esta vez funcionó como se esperaba! – Cheeso

2

Creo que el problema es que cuando se retira del portapapeles fuera de emacs, no está guardando en el anillo de muerte.

Lo que necesitaría es usar la función clipboard-yank para insertar la región, luego seleccionarla de algún modo y guardarla en el anillo de aniquilación, como lo hace la función kill-ring-save.

O mejor, escribe una función clipboard-save-to-kill-ring-and-yank que guarda el clipboad en el anillo de matar y luego lo tira.

editar: siguiendo el código un poco, esto hace lo que quiere; podrías conectarlo a una llave. Guarda el contenido del portapapeles de Windows en el anillo de matar.

(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) 
+0

Esto es bueno, pero necesito algo automático (en caso de que se me olvide!) para que cada vez que mato algo, lo que esté en el portapapeles se conserve en el anillo de matar si no está ya allí. – polyglot

+0

Creo que mi edición funciona. El consejo anterior hace que el comando yank guarde automáticamente el portapapeles de Windows en el anillo de matar. – justinhj

+0

Creo que su código no funciona en el escenario: seleccionar texto en una ventana no emacs (decir "XYZ") ahora matan a algún texto en emacs (decir "ABC") Cy Mi Mi .. .el XYZ no se encuentra b/c la selección se pierde en el primer kill, antes de que el primer yank pueda agregarlo al kill ring. –

0

supongo que se podría cortar los comandos de los diversos kill para no poner el texto en el portapapeles y, a continuación, tienen tirón-portapapeles unido a una clave diferente, ¡no sé si eso fuera a trabajar.

0

Trabajo como solucionarlo tirando del texto y volviendo a matarlo cuando aparece en emacs después de haber hecho una copia o cortar en otra aplicación de Windows.

Un mejor enfoque sería piratear emacs para que cuando mates algo, compare el portapapeles existente con la entrada más alta del anillo de aniquilación, y si es diferente, empuja el contenido del portapapeles al anillo de aniquilación, antes de hacer el matarlo explícitamente solicitado.

+0

No necesitas comprobar qué es lo que está en el anillo de matar con mi solución porque cuando agarras el portapapeles lo limpia, por lo que las llamadas siguientes simplemente se vuelven nulas y no lo agregan a el anillo de matar. – justinhj

3

Tenga en cuenta que la última versión de Emacs CVS tiene la variable save-interprogramática-goma-antes-Kill, que hace exactamente esto cf: desde el archivo 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 de que éste .

+0

¡Oh, dulce! (15 caracteres) – polyglot

Cuestiones relacionadas