ubiquitous tutorial the pagina oficial vim emacs comparison text-editor

tutorial - ¿Qué editores de Emacs, Vim y JEdit admiten múltiples puntos de inserción de texto simultáneos?



vim vs emacs (11)

En EMACS, podrías / lo harías con Mx find-grep y una macro. Si realmente insistes en que sea completamente automático, entonces incluirías el find-next en la macro.

Pero, sinceramente, esto me parece una especie de característica de Microsoft: sí, se agrega a la lista de características, pero ¿para qué molestarse? ¿Y recordarías que existió en seis meses, cuando quieres volver a usarlo?

Antecedentes: JEdit (y algunos otros editores de texto también) admiten una característica llamada Puntos de inserción de texto simultáneos múltiples . (al menos eso es lo que estoy llamando aquí).

Para entender lo que esto significa, eche un vistazo al enlace.

De todas las características en uso en los editores de texto modernos, la investigación inicial parece indicar que esta es una característica que ni Emacs ni Vim realmente admiten. Si es correcto, esto sería bastante excepcional ya que es bastante difícil encontrar una función de editor de texto que no haya llegado a por lo menos uno de estos dos editores de la vieja escuela.

Pregunta: ¿Alguien ha visto o implementado alguna vez esta función en Emacs, Vim o en ambos? Si es así, indícame un enlace, guión, referencia o resumen que explique los detalles.

Si conoce una forma alternativa de hacer lo mismo (o algo similar), hágamelo saber.


La mejor forma de hacer esto es el. comando que repite el último cambio. Entonces, por ejemplo, si cambio un puntero a una referencia y tengo un montón de obj-> func que quiero cambiar a obj.func entonces busco obj->, hago 2cw para cambiar el obj-> obj ., luego haz nnn hasta que se cambien todas las instancias.

Tal vez no sea tan flexible como lo que está hablando, pero funciona con frecuencia y es muy intuitivo y rápido cuando lo hace.


No creo que esta característica tenga un análogo directo ni en Emacs ni en Vim, lo que no quiere decir que todo lo que se puede lograr con esta función no sea posible de alguna manera con los dos editores de la "vieja escuela". Y como en la mayoría de las cosas Emacs y Vim, los usuarios avanzados probablemente podrían lograr esa tarea muy rápido, incluso si los simples mortales como yo pudiéramos pasar cinco minutos averiguando la búsqueda correcta de grep y reemplazándola con referencias retros apropiadas, por ejemplo.


moccur-edit.el casi hace lo que quieres. Se muestran todas las ubicaciones que coinciden con la expresión regular, y la edición de las coincidencias realiza cambios en la fuente correspondiente. Sin embargo, la edición se realiza en una sola instancia de la ocurrencia.

Me imagino que sería sencillo extenderlo para que pueda editarlos todos simultáneamente (al menos en el caso simple).

Hay una demostración de esto aquí .

Resulta que las versiones más nuevas de moccur-edit no aplican cambios en tiempo real; debe aplicar los cambios. Los cambios ahora también se pueden deshacer (buena victoria).


Debería ser algo así en vim:

%s/paint./((.*),//1.paint(/

O algo así, soy muy malo en las expresiones regulares "simuladas".

La idea es sustituir el patrón:

/paint(object,/

con

/object.paint(/

Entonces, sí, es "compatible"




Otra ligera similitud: en Emacs, las características de edición de rectángulo proporcionadas por cua-selection-mode (o cua-mode ) automáticamente le otorgan múltiples puntos de inserción en el borde izquierdo o derecho del rectángulo marcado, de modo que puede escribir un prefijo común o sufijo a todas esas líneas.

p.ej:
Mx cua-selection-mode RET (habilite el modo menor global, si aún no usa este modo o cua-mode)
C-RET abajo hacia abajo (marca un rectángulo de 1x3 caracteres)
escriba prefijo aquí
C-RET (desmarcar el rectángulo para volver a la edición normal)


Parecía simple hacer una versión básica de esto en Emacs lisp. Esto es para cuando solo quieres dos lugares para insertar texto en paralelo:

(defun cjw-multi-insert (text) "insert text at both point and mark" (interactive "sText:") (insert-before-markers text) (save-excursion (exchange-point-and-mark) (insert-before-markers text)))

Cuando lo ejecuta, solicita texto y lo inserta en ambos puntos (posición actual) y marca. Puede establecer la marca con C-SPC . Esto podría extenderse fácilmente para N posiciones diferentes. Una función como set-insert-point registraría la posición actual (almacenada como un marcador Emacs) en una lista y luego cuando ejecute el comando multi-insert, simplemente recorrerá la lista agregando texto en cada una.

No estoy seguro de qué sería una forma simple de manejar una característica más general de "edición múltiple".



Esto se ve como Búsqueda / reemplazo de expresión regular para Dummies. El problema comienza cuando el usuario no se da cuenta de que la generalización propuesta por la computadora es incorrecta. Y el problema empeora cuando la generalización alternativa seleccionada produce un desastre en la región de edición número 1200, que está fuera de la pantalla.

Dicho eso, no, no hay apoyo en Emacs hasta donde yo sé.