2008-12-28 6 views
21

Antecedentes: JEdit (y algunos otros editores de texto, así) apoyan una función llamada Multiple simultaneous text insertion points. (al menos eso es lo que estoy llamando aquí).¿Qué editores de Emacs, Vim y JEdit admiten múltiples puntos de inserción de texto simultáneos?

Para entender lo que esto significa, echar un vistazo en el 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 ambos Emacs y Vim no son compatibles. 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 una de estos dos editores de la vieja escuela.

Pregunta: ¿Alguien ha visto o implementado 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 conoces una forma alternativa de hacer lo mismo (o similar) que, por favor hágamelo saber.

+0

¿Es realmente útil? – PEZ

+0

Útil? Eso es debatible. Sin embargo, la característica parece estar cobrando impulso en algunos editores de texto de alto perfil recientemente, por lo que definitivamente es superior al nivel de "puramente académico". – dreftymac

+0

He estado sentado aquí pensando en todas las veces que usaría esto en mi último proyecto ... y no lo hubiera hecho. Realmente huele como una solución en busca de un problema. El hecho de que otros editores tengan una carrera característica no significa que sea necesario. – jpeacock

Respuesta

8

La manera más fácil de hacerlo es la. 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

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

+1

Estaba va a sugerir el. comando también ¡Es una característica increíblemente poderosa! – PEZ

3

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.

6

En EMACS, podría/haría con M-x find-grep y una macro. Si realmente insistes en que sea totalmente automático, 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?

7

moccur-edit.el casi hace lo que quiere. 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.

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

No es una demostración de que encontró here.

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

-2

Parece que la búsqueda de expresiones regulares/Reemplazar 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 esto, no, no hay soporte en Emacs hasta donde yo sé.

+2

** // El problema comienza cuando la muestra que babea no se da cuenta // ** Siéntase libre de dejar de leer aquí. – dreftymac

1

Debería ser algo como esto en vim:

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

O algo por el estilo, soy muy malo en expresiones regulares "falsas".

La idea es sustituir el patrón:

/paint(object,/ 

con

/object.paint(/ 

Así que, sí, es "compatible"

0

No. Esto sería bastante difícil de hacer con una interfaz de usuario principalmente basada en consola.

Dicho esto, hay características similares en vim emacs (y, aunque no lo he utilizado casi la misma cantidad) - buscar y reemplazar, ya que la gente ha dicho, y más de manera similar, la columna del modo de inserción: http://pivotallabs.com/users/brian/blog/articles/350-column-edit-mode-in-vi

1

Parecía simple hacer una versión básica de esto en Emacs lisp. Esto es para los que sólo quieren 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 se ejecuta, se le solicita para el texto y lo inserta en tanto punto (posición actual) y la 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 Emacs marker) en una lista y luego cuando ejecute el comando de inserción múltiple, simplemente recorrerá la lista agregando texto en cada una.

No estoy seguro de lo que sería una manera simple de manejar una característica más general de "edición múltiple".

1

Otra ligera similitud: En Emacs, las funciones de edición rectángulo proporcionados por cua-selection-mode (o cua-mode) automáticamente le da inserción de múltiples puntos abajo del borde izquierdo o derecho del rectángulo marcado, por lo que puede escribir un prefijo común o sufijo a todas esas líneas

p. Ej.:
Mxcua-selection-modeRET (activar el modo menor global, si aún no utiliza tal o cua-modo)
C-RETabajoabajoabajo (marca un 1x3 rectángulo de caracteres)
prefijo de tipo aquí
C-RET (desmarcar el rectángulo para volver a la edición normal)

Cuestiones relacionadas