Cómo copiar un rectángulo muerto al anillo de matar

11

Con frecuencia extraigo un rectángulo de texto de un búfer, pero luego encuentro que quiero tirar del texto como si no fuera un rectángulo. ¿Hay alguna manera de agregar el rectángulo muerto actual al anillo de matar?

El Manual de GNU Emacs tiene esto que decir:

"Matar" un rectángulo no es matar en el sentido habitual; el rectángulo no está almacenado en el anillo de exterminio, sino en un lugar especial que solo registra el rectángulo asesinado más reciente. Esto se debe a que tirar de un rectángulo es tan diferente de tirar texto lineal que se deben usar diferentes comandos de tirar. Yank-popping no está definido para rectángulos.

Sin embargo, básicamente puedo obtener el comportamiento que quiero con

  • M-> ir al final del búfer
  • C-x r y tirar del rectángulo
  • C-x C-x punto de cambio y marca (selecciona líneas recién arrancadas)
  • C-w matar a la selección al anillo de matar

¿Hay una mejor manera de convertir un rectángulo muerto en una entrada de anillo de exterminio?

nispio
fuente
La solución vinculada no es lo que pediste, pero tira rectángulos como quieras: emacs.stackexchange.com/a/46352/15749
jue

Respuestas:

6

Si entendí tu pregunta, estás buscando algo como esto:

(defun youngfrog/copy-rectangle-to-kill-ring (start end)
  "Saves a rectangle to the normal kill ring. Not suitable for yank-rectangle."
  (interactive "r")
  (let ((lines (extract-rectangle start end)))
    (with-temp-buffer
      (while lines ;; insert-rectangle, but without the unneeded stuff
        ;; (most importantly no push-mark)
        (insert-for-yank (car lines))
        (insert "\n")
        (setq lines (cdr lines)))
      (kill-ring-save (point-min) (point-max)))))

Cortesía de ErgoEmacs.

Nsukami _
fuente
3

No estoy seguro de qué tiene de especial tener el rectángulo en el anillo de cierre, pero si actualiza a Emacs-24.4, puede hacer lo siguiente: C-x SPC .... M-wseleccionar un rectángulo y colocarlo en el anillo de cierre. Después de eso C-y, tirarás de ese rectángulo (en el mismo caso C-x r y).

Stefan
fuente
Hay dos cosas sobre el anillo de matar que son "especiales". Lo más importante (para mí) es la forma en que los elementos del anillo de matar son arrancados. En pocas palabras, el tirón desplaza el texto existente hacia abajo en lugar de desplazarlo hacia la derecha. Usar el anillo de matar también tiene el beneficio adicional de mantener un historial de texto asesinado. Parece que 24.4 podría proporcionar el segundo beneficio, pero no el primero.
Nispio
Ah, de hecho, en ese caso, el nuevo comportamiento de 24.4 mejora la parte que no te importa.
Stefan
1

Inicialmente me molestó la falta de una solución integrada para este problema, luego me di cuenta de que había una solución integrada: kill-rectangle.

Digamos que tienes texto como

AAA BBBBBBBBB
AAA BBB
AAA BBBBBBB

Pero desea la parte 'B' del texto en otro lugar, como entre estas líneas C y D:

CCCCC
CCC
DDDD
DD

Si copia el rectángulo B ( C-x r M-w) y luego coloca el punto en la primera 'D', luego tira del rectángulo hacia atrás ( C-x r y), termina con

CCCCC
CCC
BBBBBBBBBDDDD
BBB      DD
BBBBBBB  

donde realmente querías

CCCCC
CCC
BBBBBBBBB
BBB
BBBBBBB
DDDD
DD

Puede parecer natural copiar el rectángulo de 'B' y tirarlos a la nueva ubicación, pero una mejor solución es simplemente copiar las líneas 'A y' B 'y tirarlas en su totalidad entre' C 'y' D 'líneas.

Luego, marque el rectángulo que contiene las 'A' y use kill-rectangle( C-x r k) para terminar con el resultado deseado.

Frain Colin
fuente