Supongamos que ya he seleccionado algún texto en el búfer actual. ¿Es posible seleccionar otro tramo de texto, manteniendo la selección anterior (y así sucesivamente)?
Agregado : Una motivación para esta funcionalidad es la siguiente: Suponga que tengo un texto que se ve así:
paragraph 1 ...
paragraph 2 ...
paragraph 3 ...
paragraph 4 ...
paragraph 5 ...
Me gustaría eliminar algunos párrafos (por ejemplo, 2, 4 y 6) e insertarlos antes del párrafo 1.
multiple-cursors
puede darle una solución.Respuestas:
Puede usar
append-next-kill
(vinculadoC-M-w
de forma predeterminada) para acumular el texto que desea insertar arribaparagraph 1
:Mata
paragraph 2
como lo harías normalmente.Marca
paragraph 4
y presionaC-M-w
antes de matarlo. Repita este paso para todos los párrafos que le gustaría mover antesparagraph 1
.Cuando haya terminado, puede tirar del texto acumulado antes
paragraph 1
.fuente
Puede usar registros combinados con el anillo de marca. Empuje las marcas actuales con
C-<SPC> C-<SPC>
, recupérelas más tarde conC-u C-<SPC>
, o guárdelas en un registro, digamosb
, víaC-x r <SPC> b
, y salte más tarde conC-x r j b
.Ahora marque otra región.
C-u C-x r s a
copiará la región marcada para registrara
y eliminar el texto. Luego marque la siguiente región yC-u C-x r + a
agregará otra selección a ese registroa
y la eliminará.Luego puede insertar el contenido con
C-x r i a
.Consulte la sección "Guardar texto en registros" del manual de Emacs.
fuente
El nuevo soporte de región rectangular en Emacs-24.4 realmente introdujo (una gran parte de) la infraestructura necesaria para esta funcionalidad [después de todo, una región rectangular es una región no contigua].
Por lo tanto, ahora debería ser posible implementar un paquete de "región dividida" que proporcione la funcionalidad que está solicitando.
Es cierto que muchos comandos de Emacs todavía no se han adaptado para usar la nueva infraestructura (por ejemplo, comandos como upcase-region, odo-in-region, query-replace, ...) y, por lo tanto, todavía no funcionan correctamente en rectángulos (para que tampoco funcionen correctamente en una "región dividida"), pero estos son errores que, con suerte, deberían solucionarse con el tiempo.
fuente
Instalar browse-kill-ring.el
copiar y matar todas las regiones de interés.
Tengo que señalar dónde debería comenzar la reinsertar.
M-x
browse-kill-ring
RET abrirá un búfer y colocará el cursor en él.Escriba npara viajar en trozos.
RET insertará el fragmento en el punto en el búfer original / otro.
fuente
Si las líneas que desea manipular se pueden distinguir mediante una coincidencia de expresiones regulares, puede usar el modo de aparición para verlas en una nueva ventana. Luego puede usar el modo de edición de ocurrencia para editarlos, con el búfer original que refleja los cambios que realiza en el búfer de ocurrencia.
Esto funciona de maravilla, por ejemplo, en combinación con el modo de cursores múltiples : debido a que las líneas que ha seleccionado para aparecer en el búfer Occur se muestran de forma contigua, independientemente de qué tan lejos estén en el búfer original, puede marcarlas todas o un subconjunto y luego activarlos
mc/edit-lines
y editarlos todos a la vez. (Sí, sé que los cursores múltiples pueden hacer esto por sí solosmc/mark-all-like-this
, pero es bueno tener opciones).Cualquier otra operación de edición que se haría más fácilmente si estuviera viendo solo las líneas en las que desea trabajar, como configurar una búsqueda y reemplazo de expresiones regulares complicadas, o una macro que necesita ejecutarse en cada línea de un búfer a su vez, También se puede hacer de esta manera.
fuente
Esto responde a su pregunta general, pero no particularmente al caso de uso que menciona (mover partes de código).
Emacs ahora tiene lo que llama una región no contigua , que es el tipo de selección que está preguntando. Vanilla Emacs no proporciona ninguna forma especial de crear una región no contigua, excepto si es un rectángulo . Pero las Zonas de la biblioteca sí.
Library Zones le permite definir múltiples zonas en su búfer. Una lista de zonas es una región no contigua . También puede considerarlo como múltiples regiones, dependiendo de cómo quiera utilizarlo. Puede tener múltiples listas de zonas definidas en cualquier momento, cada una asignada a una variable de zonas diferente, y puede cambiar entre ellas.
Si también usa la biblioteca Bookmark + , puede guardar listas de zonas de forma persistente y restaurarlas en sesiones posteriores de Emacs. Bookmark + también le permite asignar etiquetas arbitrarias a un marcador. Esto significa que puede etiquetar una lista de zonas.
Las zonas en una lista de zonas dada generalmente están en el mismo búfer, pero no es necesario que estén. En esto, una lista de zonas es más general que una región no contigua. También es más general porque cada zona puede contener información adicional, además de los límites de la zona, y puede tener un identificador.
Hay varias formas de crear una zona. Una de las más fáciles de usar
C-x n a
es que define una zona de la región activa y la agrega al conjunto de zonas actual. (C-x n n
(narrow-to-region
) también hace esto, además de reducir).Estas son algunas de las cosas que puede hacer con un conjunto (lista) de zonas:
facemenu+.el
.Consulte también Narrow Indirect , que le permite crear buffers indirectos que son clones de un buffer determinado y que se reducen a diferentes partes del mismo.
fuente
Otra opción: transponer párrafos
En aras de la integridad, puede lograr la reordenación de los párrafos (secuencialmente) con regiones marcadas y
M-0 M-x transpose-paragraph
(el argumento cero hacetra-par
intercambiar los párrafos donde están el punto y la marca, es decir, la región comienza y termina).Por cierto, esto funciona para todos los
transpose-.*
comandos (-words, -sexp, -sentences, ...) y es extremadamente útil en muchas situaciones.fuente
Otra forma es usar el paquete objed (soy el autor). Puede marcar cualquier objeto de texto con
m
el punto que se mueve automáticamente al siguiente objeto del tipo actual. Desmarca cualquier objeto navegando hacia él y presiona m nuevamente. Aquí hay un screencast de ejemplo (muestra líneas de marcado pero también funciona para otros objetos como párrafos, defun ...):fuente
package-install-from-archive: http://melpa.milkbox.net/packages/objed-20181201.1346.tar: Not found
.M-x package-refresh-contents
y luegoM-x package-install
.