Me gustaría cambiar todas las apariciones de una cadena (digamos string1) con otra cadena (digamos string2) y viceversa. Para ser precisos, tengo un documento largo y estas cadenas ocurren muchas veces. Lo que hago actualmente es reemplazar string1 -> string3, luego string2 -> string1 y finalmente string3 -> string2.
Me pregunto si ya hay una función en emacs que haga esto. Otras soluciones son bienvenidas.
Editar : esto es en realidad un duplicado de la pregunta vinculada en el comentario. Pero el problema es que la respuesta aceptada de esa pregunta no siempre funciona (vea el comentario a continuación). Creo que es mejor esperar hasta que el autor de esa respuesta aceptada corrija su respuesta o salga alguna otra solución. En segundo lugar, antes de publicar mi pregunta, busqué en Google la pregunta y esa pregunta no apareció. Creo que a veces es útil tener dos preguntas duplicadas, ya que usan una redacción diferente y si un usuario encuentra la duplicada, puede encontrar la correcta.
Edición 2: la respuesta aceptada de la función Buscar / reemplazar como para intercambiar texto parece estar bien ahora.
fuente
backwards
yregion-noncontiguous-p
) en la llamada deperform-replace
hace que funcione aquí (emacs 24.3). Lo probaré en emacs 25 cuando tenga una ocasión antes de editar la otra respuesta.Respuestas:
Para el caso interactivo query-replace-regexp (CM-%) puede hacer esto, utilizando el relativamente desconocido \, para el reemplazo.
Si el texto de reemplazo contiene \, seguido de una expresión lisp, usa el valor de esa expresión como reemplazo. En este caso, la expresión es un "if" que toma una condición y el valor de retorno para los casos verdadero y falso.
En los comentarios se sugiere usar
Esto funciona porque \ 1 será "string1" si el patrón coincide con string1, y de lo contrario será nulo. Lisp toma cualquier valor no nulo como verdadero. Si bien esto funciona y es más corto, creo que mi respuesta es más útil. Creo que el código es más legible para alguien cuyo conocimiento es limitado. Tiene una segunda ventaja, ya que todavía funciona si el patrón "de" se da como
o incluso
fuente
\,(if \1 "string2" "string1")
, usando la expresión regular\(string1\)\|string2
.(emacs) Regexp Replace
.Bueno, tal vez con una macro esto sería fácil:
F3C-s
a
RETC-bM-tF4. El uso de esta macro en su pregunta grita este resultado:Estoy transponiendo posiciones entre cualquier palabra después de una
a
y esa palabra. Más tarde, puede editar dicha macro para transponer otras palabras sin necesidad de redefinir la macro completa, puede editar la macro con C-xC-kRET.fuente