pages/sphinx/emacs29/doc/build/CapConSecciones/16_BusqReemp.html

223 KiB
Raw Blame History

<html class="writer-html5" lang="es" data-content_root="../"> <head> </head>
GNU/Emacs 29.1
Traducción Revisón: 1.70
GNU/Emacs 29.1

16 Búsqueda y Reemplazo

Como otros editores, Emacs tiene comandos para buscar apariciones de una cadena. También tiene comandos para reemplazar ocurrencias de una cadena con una cadena diferente. Como así también hay comandos que hacen lo mismo, pero buscan patrones en lugar de cadenas fijas.

También puede buscar en varios archivos bajo el control de xref (vea 29.4.1.3. Buscar y Reemplazar con Identificadores) o a través del comando Dired A (vea 31.7 Operar con Archivos), o pedirle al programa grep que lo haga (vea 28.4 Buscar con Grep en Emacs).

16.1 Búsqueda Incremental

El comando principal de búsqueda de Emacs es incremental: empieza a buscar en cuanto escribe el primer carácter de la cadena de búsqueda. A medida que escribe la cadena de búsqueda, Emacs le muestra dónde se encontraría la cadena (tal y como la ha escrito hasta ahora). Cuando haya tecleado suficientes caracteres para identificar el lugar que desea, puede detenerse. Dependiendo de lo que planee hacer a continuación, puede que necesite o no terminar la búsqueda explícitamente con RETURN (RET).

Ctrl-s (C-s)

Búsqueda incremental hacia delante (isearch-forward).

Ctrl-r (C-r)

Búsqueda incremental hacia atrás (isearch-backward).

También puede invocar la búsqueda incremental desde el menú Edit->Search (Edición->Búsqueda) de la barra de menús.

16.1.1 Conceptos Básicos de la Búsqueda Incremental

Ctrl-s (C-s)

Búsqueda incremental hacia delante (isearch-forward).

Ctrl-r (C-r)

Búsqueda incremental hacia atrás (isearch-backward).

C-s (isearch-forward) inicia una búsqueda incremental hacia adelante. Lee los caracteres del teclado y mueve el punto justo después del final de la siguiente aparición de esos caracteres en el búfer.

Por ejemplo, si teclea Ctrl-s (C-s) y luego F (F), el cursor se situará tras la primera F que aparezca en el búfer después del punto de inicio. Si entonces teclea O (O, o mayúscula), el cursor se mueve justo después de la primera FO; la F en esa FO podría no ser la primera F encontrada previamente. Después de otra O, el cursor se mueve justo después del primer FOO.

En cada paso, Emacs resalta la coincidencia actual -el texto del buffer que coincide con la cadena de búsqueda- usando la cara isearch (ver 15.8. Caras de Texto). Consulte 16.12 Adaptar la Búsqueda a sus Necesidades, para conocer las distintas opciones que personalizan este resaltado. La cadena de búsqueda actual también se muestra en el área de eco.

Si se equivoca al escribir la cadena de búsqueda, escriba DEL (isearch-delete-char). Cada DEL cancela el último elemento de entrada introducido durante la búsqueda. Emacs registra un nuevo elemento de entrada cada vez que escribe un comando que cambia la cadena de búsqueda, la posición del punto, el éxito o fracaso de la búsqueda, la dirección de la búsqueda, la posición del otro extremo del resultado de la búsqueda actual, o la «envoltura» de la búsqueda. Consulte 16.1.4 Errores en la Búsqueda Incremental, para más información sobre cómo tratar una búsqueda fallida.

Cuando esté satisfecho con el lugar al que ha llegado, escriba RETURN (RET, isearch-exit). Esto detiene la búsqueda, dejando el cursor donde lo trajo la búsqueda. Además, cualquier comando no especialmente significativo en las búsquedas detiene la búsqueda y se ejecuta a continuación. Así, tecleando Ctrl-a (C-a) se sale de la búsqueda y se mueve al principio de la línea; tecleando una de las teclas de flecha se sale de la búsqueda y se ejecuta el comando de movimiento respectivo; etc. RET sólo es necesario si el siguiente comando que desea escribir es un carácter de impresión, DEL, RET u otro carácter especial dentro de las búsquedas (C-q, C-w, C-r, C-s, C-y, M-y, M-r, M-c, M-e y algunos otros que se describen más adelante). Puede ajustar los comandos que salen de la búsqueda; consulte 16.1.6 No Salir de la Búsqueda Incremental.

Como excepción especial, si se introduce RET cuando la cadena de búsqueda está vacía, se inicia la búsqueda no incremental (consulte 16.2 Búsqueda no Incremental). (Esto puede personalizarse; consulte 16.2 Búsqueda no Incremental).

Para abandonar la búsqueda y volver al lugar donde comenzó, escriba ESCESCESC (ESC ESC ESC, isearch-cancel) o Ctrl-g Ctrl-g (C-g C-g, isearch-abort).

Al salir de la búsqueda incremental, se añade el valor original del punto al anillo de marcas, sin activar la marca; por lo tanto, puede usar Ctrl-u Ctrl-SPACE (C-u C-SPC) o Ctrl-x Ctrl-x (C-x C-x) para volver al lugar donde se encontraba antes de iniciar la búsqueda. Ver 12.4 El Anillo de Marcas. (Emacs sólo hace esto si la marca no estaba ya activa; si la marca estaba activa cuando empezó la búsqueda, tanto C-u C-SPC como C-x C-x irán a la marca).

Para buscar hacia atrás, use Ctrl-r (C-r, isearch-backward) en lugar de C-s para iniciar la búsqueda. Una búsqueda hacia atrás encuentra coincidencias que terminan antes del punto de inicio, del mismo modo que una búsqueda hacia delante encuentra coincidencias que empiezan después.

16.1.2 Repetición de la Búsqueda Incremental

Supongamos que busca FOO hacia adelante y encuentra una coincidencia, pero no la que esperaba encontrar: el FOO que buscaba aparece más adelante en el búfer. En este caso, escriba otra combinación Ctrl-s (C-s, isearch-repeat-forward) para pasar a la siguiente aparición de la cadena de búsqueda, o Ctrl-r (C-r, isearch-repeat-backward) para pasar a la aparición anterior. Puede repetir estos comandos tantas veces como desee. Alternativamente, puede proporcionar un argumento numérico de prefijo n a C-s y C-r para encontrar la enésima aparición siguiente o anterior. Si se excede, puede cancelar algunos comandos C-s con DEL. Del mismo modo, cada C-r (isearch-repeat-backward) en una búsqueda incremental hacia atrás repite la búsqueda hacia atrás.

Si hace una pequeña pausa durante la búsqueda incremental, Emacs resalta todas las otras posibles coincidencias para la cadena de búsqueda que están presentes en la pantalla. Esto le ayuda a anticipar a dónde puede llegar tecleando Ctrl-s (C-s) o Ctrl-r (C-r) para repetir la búsqueda. Las otras coincidencias se resaltan de forma diferente a la coincidencia actual, usando la cara personalizable lazy-highlight (ver 15.8. Caras de Texto). Si no le gusta esta característica, puede desactivarla poniendo isearch-lazy-highlight a nil. Para otras personalizaciones relacionadas con el resaltado de coincidencias, consulte 16.12 Adaptar la Búsqueda a sus Necesidades.

Después de salir de una búsqueda, puede volver a buscar la misma cadena escribiendo sólo Ctrl-s Ctrl-s (C-s C-s). La primera C-s es la tecla que invoca la búsqueda incremental, y la segunda C-s significa volver a buscar la última cadena buscada. Del mismo modo, Ctrl-r Ctrl-r (C-r C-r) busca hacia atrás la última cadena de búsqueda. Para determinar la última cadena de búsqueda, no importa si esa cadena se buscó con C-s o C-r.

Si está buscando hacia delante pero se da cuenta de que estaba buscando algo antes del punto de partida, escriba C-r para cambiar a una búsqueda hacia atrás, sin cambiar la cadena de búsqueda. Del mismo modo, C-s en una búsqueda hacia atrás cambia a una búsqueda hacia delante.

Cuando cambie la dirección de una búsqueda, el primer comando que escriba permanecerá, por defecto, en la misma coincidencia, y el cursor se moverá al otro extremo de la coincidencia. Para pasar inmediatamente a otra coincidencia, personalice la variable isearch-repeat-on-direction-change a t.

Si una búsqueda está fallando y pide repetirla tecleando otra vez C-s, vuelve a empezar desde el principio del búfer. La repetición de una búsqueda inversa fallida con C-r comienza de nuevo desde el final. A esto se le llama dar la vuelta, y una vez que esto ha sucedido, aparece Wrapped en la ventana de búsqueda. Si sigue yendo más allá del punto de inicio original de la búsqueda, cambiará a Overwrapped lo que significa que está volviendo a visitar coincidencias que ya ha visto.

Puede controlar lo que ocurre cuando no hay más coincidencias personalizando la opción de Usuario isearch-wrap-pause. Si es t (por defecto), señaliza un error. (Si es no, emite un ding y finaliza inmediatamente después de alcanzar la última coincidencia. Si es no-ding, se envolverá inmediatamente, pero no se emitirá un ding. Con los valores no y no-ding la búsqueda intentará rodear también al teclear un carácter. Por último, si es nil, no se ajustará nunca, sino que se detendrá en la última coincidencia.

Para reutilizar cadenas de búsqueda anteriores, use el anillo de búsqueda. Los comandos M-p (isearch-ring-retreat) y M-n (isearch-ring-advance) se mueven a través del anillo para elegir una cadena de búsqueda para reutilizar. Estos comandos dejan el elemento del anillo de búsqueda seleccionado en el minibuffer, donde puede editarlo. Escriba Ctrl-s / Ctrl-r (C-s/C-r) o RET para aceptar la cadena e iniciar la búsqueda. El número de cadenas de búsqueda utilizadas más recientemente guardadas en el anillo de búsqueda se especifica mediante la variable search-ring-max, 16 por defecto.

Para editar la cadena de búsqueda actual en el minibuffer sin sustituirla por elementos del anillo de búsqueda, escribe Alt-e (M-e, isearch-edit-string) o haga clic con ratón-1 en el minibuffer. Escriba RETURN (RET), Ctrl-s (C-s) o Ctrl-r (C-r) para terminar de editar la cadena y buscarla. Teclee Ctrl-f (C-f) o (RIGHT) para añadir a la cadena de búsqueda los caracteres siguientes al punto del buffer desde el que inició la búsqueda.

16.1.3 Búsqueda de Texto traído del Anillo de Muertes (Yanking)

En muchos casos, querrá utilizar texto en o cerca del punto como su cadena de búsqueda. Los comandos descritos en esta subsección le permiten hacerlo cómodamente.

Ctrl-w (C-w, isearch-yank-word-or-char) añade el siguiente carácter o palabra en el punto a la cadena de búsqueda. Es una forma sencilla de buscar otra aparición del texto en el punto. (La decisión de copiar un carácter o una palabra es heurística.) Con un argumento numérico prefijo n, añade los n caracteres o palabras siguientes.

Ctrl-Altw (C-M-w, isearch-yank-symbol-or-char) añade el siguiente carácter o símbolo en el punto a la cadena de búsqueda. Es una forma sencilla de buscar otra aparición del símbolo en el punto. (La decisión de copiar un carácter o un símbolo es heurística.) Con un argumento numérico de prefijo n, añade los n caracteres o símbolos siguientes.

Alt-s Ctrl-e (M-s C-e, isearch-yank-line) añade el resto de la línea actual a la cadena de búsqueda. Si el punto ya está al final de la línea, añade la línea siguiente. Con un argumento prefijo n, añade las n líneas siguientes.

Del mismo modo, Ctrl-Alt-z (C-M-z, isearch-yank-until-char) añade a la cadena de búsqueda todo lo que va desde el punto hasta la siguiente aparición de un carácter especificado (sin incluir dicho carácter). Esto es especialmente útil para macros de teclado, por ejemplo en lenguajes de programación o de marcado en los que ese carácter marca un límite de token. Con un argumento numérico de prefijo n, el comando añade todo desde el punto hasta la enésima aparición del carácter especificado.

Dentro de la búsqueda incremental, C-y (isearch-yank-kill) añade la muerte actual a la cadena de búsqueda. M-y (isearch-yank-pop), si se invoca después de C-y durante la búsqueda incremental, sustituye el texto añadido por una eliminación anterior, de forma similar al comando M-y (yank-pop) habitual. Hacer clic con ratón-2 en el área de eco añade la selección X actual (véase 13.3.2 Cortar y Pegar con Otras Aplicaciones de Ventana) a la cadena de búsqueda (isearch-yank-x-selection).

Ctrl-Alt-d (C-M-d, isearch-del-char) borra el último carácter de la cadena de búsqueda, y Ctrl-Alt-y (C-M-y, isearch-yank-char) añade el carácter después del punto a la cadena de búsqueda. Un método alternativo para añadir el carácter después del punto es entrar en el minibuffer con M-e (véase 16.1.2 Repetición de la Búsqueda Incremental) y teclear Ctrl-f (C-f) o (RIGHT, DERECHA) al final de la cadena de búsqueda en el minibuffer. Cada Ctrl-f o que escriba añade otro carácter después de punto a la cadena de búsqueda.

Normalmente, cuando la búsqueda no distingue entre mayúsculas y minúsculas, el texto que se introduce en la cadena de búsqueda se convierte a minúsculas, de modo que la búsqueda sigue sin distinguir entre mayúsculas y minúsculas (véase 26.7. Comandos de Conversión de Mayúsculas y Minúsculas). Sin embargo, si el valor de la variable search-upper-case (véase 16.9. Coincidencia Laxa Durante la Búsqueda) es distinto de not-yanks, se desactiva esta conversión a minúsculas.

Para iniciar una nueva búsqueda incremental con el texto cerca del punto yanked en la cadena de búsqueda inicial, escriba Alt-s Alt-. (M-s M-.) que ejecuta el comando isearch-forward-thing-at-point. Si la región estaba activa, entonces introduce el texto de la región en la cadena de búsqueda. En caso contrario, intenta extraer una URL, un símbolo o una expresión que se encuentre cerca del punto. La opción de usuario isearch-forward-thing-at-point define lo que se va a extraer.

16.1.4 Errores en la Búsqueda Incremental

Si su cadena no se encuentra en absoluto, el área de eco dice Failing I-Search (Fallo de I-Search), y el cursor se mueve más allá del lugar donde Emacs encontró tanto de su cadena como pudo. Así, si busca FOOT, y no hay FOOT, puede ver el cursor después de FOO en FOOT. En el área de eco, la parte de la cadena de búsqueda que no ha encontrado coincidencias se resalta con la cara isearch-fail.

En este punto, hay varias cosas que puede hacer. Si se ha equivocado al teclear la cadena, use DEL para cancelar una entrada anterior (vea 16.1.1 Conceptos Básicos de la Búsqueda Incremental), Ctrl-Alt-d (C-M-d) para borrar un carácter cada vez, o Alt-e (M-e) para editarla. Si le gusta el lugar que ha encontrado, puede teclear RETURN (RET) para permanecer en él. O puede teclear Ctrl-g (C-g), que elimina de la cadena de búsqueda los caracteres que no se pudieron encontrar (la T en FOOT), dejando los que sí se encontraron (el FOO en FOOT). Un segundo C-g en ese punto cancela la búsqueda por completo, devolviendo el punto a donde estaba cuando se inició la búsqueda.

La orden de salir, C-g, hace cosas especiales durante las búsquedas; lo que hace depende del estado de la búsqueda. Si la búsqueda ha encontrado lo que especificó y está esperando la entrada, C-g cancela toda la búsqueda, moviendo el cursor de vuelta al punto donde comenzó la búsqueda. Si se teclea Ctrl-g (C-g) cuando hay caracteres en la cadena de búsqueda que no han sido encontrados, porque Emacs todavía los está buscando, o porque ha fallado en encontrarlos, entonces los caracteres de la cadena de búsqueda que no han sido encontrados son descartados de la cadena de búsqueda. Una vez eliminados, la búsqueda se ha realizado con éxito y está a la espera de más entradas, por lo que una segunda C-g cancelará toda la búsqueda.

16.1.5 Entrada Especial para la Búsqueda Incremental

Además de los caracteres descritos en las subsecciones anteriores, algunos de los caracteres que se introducen durante la búsqueda incremental tienen efectos especiales. A continuación se describen.

Para activar la coincidencia de espacios laxos (véase 16.9. Coincidencia Laxa Durante la Búsqueda), escriba Alt-s SPACE (M-s SPC).

Para cambiar la distinción entre mayúsculas y minúsculas de la búsqueda, escriba Alt-c (M-c) o Alt-s c (M-s c). Véase 26.7. Comandos de Conversión de Mayúsculas y Minúsculas. Si la cadena de búsqueda incluye letras mayúsculas, la búsqueda distingue entre mayúsculas y minúsculas por defecto.

Para cambiar si la búsqueda considerará o no caracteres similares y equivalentes como coincidencia, escriba Alt-s ' (M-s '). Véase plegado de caracteres en 16.9. Coincidencia Laxa Durante la Búsqueda. Si la cadena de búsqueda incluye caracteres acentuados, se desactiva el plegado de caracteres durante esa búsqueda.

Para activar o desactivar la búsqueda de texto invisible, escriba Alt-s i (M-s i, isearch-toggle-invisible). Véase Ocultar Mostrar esquemas en 26.9.4 Comandos de Visibilidad del Modo Esquema.

Para alternar entre la búsqueda incremental sin expresiones regulares y con expresiones regulares, escriba Alt-r (M-r) o Alt-s r (M-s r, isearch-toggle-regexp). Vease 16.5 Búsqueda por Expresiones Regulares.

Para alternar entre el modo de símbolos, escriba Alt-s _ (M-s _). Véase 16.4 Búsqueda por Símbolos.

Para buscar un carácter de nueva línea, escriba Ctrl-j (C-j) como parte de la cadena de búsqueda.

Para buscar caracteres no ASCII, utilice uno de los siguientes métodos durante la búsqueda incremental:

  • Escriba Ctrl-q (C-q, isearch-quote-char), seguido de un carácter no gráfico o una secuencia de dígitos octales. Esto añade un carácter a la cadena de búsqueda, de forma similar a la inserción en un búfer mediante C-q (véase 8.1 Inserción de Texto ). Por ejemplo, C-q C-s durante la búsqueda incremental añade el carácter control-S a la cadena de búsqueda.

  • Use un método de entrada (véase 23.3 Métodos de Entrada). Si un método de entrada está activado en el búfer actual al iniciar la búsqueda, el mismo método estará activo en el minibúfer al escribir la cadena de búsqueda. Mientras escribe la cadena de búsqueda, puede alternar el método de entrada con Ctrl-` (``C-`, isearch-toggle-input-method). También puede activar un método de entrada no predeterminado con Ctrl-^ (C-^, isearch-toggle-specified-input-method), que solicita el nombre del método de entrada. Cuando un método de entrada está activo durante la búsqueda incremental, el mensaje de búsqueda incluye el mnemotécnico del método de entrada, de la siguiente manera:

    I-search [im]:
    

donde im es el mnemónico del método de entrada activo. Cualquier método de entrada que active durante la búsqueda incremental permanece activado en el búfer actual después. Por último, puede activar temporalmente un método de entrada transitorio (véase Método de Entrada Transitorio en 23.4 Selección de un Método de Entrada) con Ctrl-x ` (``C-x `, isearch-transient-input-method) para insertar un único carácter en la cadena de búsqueda utilizando un método de entrada, y desactivar automáticamente el método de entrada después.

  • Escriba Ctrl-x 8RETURN (C-x 8 RET, isearch-char-by-name), seguido de un nombre Unicode o un punto de código en hexadecimal. Esto añade el carácter especificado a la cadena de búsqueda, de forma similar al comando habitual insert-char (véase 8.1 Inserción de Texto).

También puede incluir secuencias Emoji en la cadena de búsqueda. Escriba Ctrl-x 8eRETURN (C-x 8 e RET, isearch-emoji-by-name), seguido del nombre Unicode de un Emoji (por ejemplo, smiling face (cara sonriente) o heart whith arrow (corazón con flecha)). Esto añade el Emoji especificado a la cadena de búsqueda. Si no conoce el nombre del Emoji que desea buscar, puede usar Ctrl-x8el (C-x 8 e l, emoji-list) y Ctrl-x 8e (C-x 8 e d, emoji-describe) (consulte 23.3 Métodos de Entrada).

Si se teclea Alt-s o (M-s o) en la búsqueda incremental, se invoca isearch-occur, que ejecuta occur con la cadena de búsqueda actual. Véase 16.11. Otros Comandos de Búsqueda y Bucle.

Si se escribe Alt-% (M-%, isearch-query-replace) en la búsqueda incremental, se invoca query-replace o query-replace-regexp (dependiendo del modo de búsqueda) y se usa la cadena de búsqueda actual como cadena a reemplazar. Un argumento de prefijo negativo significa reemplazar hacia atrás. Véase 16.10.4 Sustitución de Consultas. Si se escribe Ctrl-Alt-% (C-M-%, isearch-query-replace-regexp), se invoca query-replace-regexp con la cadena de búsqueda actual usada como expreg para reemplazar.

Al escribir Alt-TAB (M-TAB) en la búsqueda incremental se invoca isearch-complete, que intenta completar la cadena de búsqueda utilizando el anillo de búsqueda (las cadenas de búsqueda anteriores que utilizó) como una lista de alternativas de finalización. Véase 9.4 Completado. En muchos sistemas operativos, la secuencia de teclas M-TAB es capturada por el gestor de ventanas, por lo que deberá volver a enlazar isearch-completar a otra secuencia de teclas si desea utilizarla (consulte 50.3.5. Cambiar las combinaciones de teclas interactivamente).

Puede salir de la búsqueda dejando las coincidencias resaltadas escribiendo Alt-s hr (M-s h r, isearch-highlight-regexp). Esto ejecuta highlight-regexp (véase 15.14 Resaltado Interactivo), pasándole la regexp (expresión regular) derivada de la cadena de búsqueda y pidiéndole la cara a utilizar para resaltar. Para resaltar líneas enteras que contengan coincidencias (en lugar de sólo las coincidencias), escriba Alt-s hl (M-s h l, isearch-highlight-lines-matching-regexp). En ambos casos, para eliminar el resaltado, escriba Alt-s hu (M-s h u, unhighlight-regexp).

Cuando la búsqueda incremental está activa, puede escribir Ctrlh Ctrlh (C-h C-h, isearch-help-map) para acceder a las opciones de ayuda interactiva, incluida una lista de combinaciones de teclas especiales. Estas combinaciones de teclas forman parte del mapa de teclas isearch-mode-map (véase 50.3.1 Mapas de teclas).

Cuando la búsqueda incremental está activada, al teclear Alt-s Alt-> (M-s M->) se irá a la última aparición de la cadena de búsqueda, y Alt-s Alt-< (M-s M-<) se irá a la primera aparición. Con un argumento numérico de prefijo n, estos comandos irán a la enésima aparición de la cadena de búsqueda contando desde el principio o el final del búfer, respectivamente.

16.1.6 No Salir de la Búsqueda Incremental

Esta subsección describe cómo controlar si al teclear un comando no específicamente significativo de las búsquedas se sale de ella antes de ejecutar el comando. También describe tres categorías de órdenes que se pueden escribir sin salir de la búsqueda incremental actual, aunque no formen parte esta.

Normalmente, al teclear un comando que no está vinculado a la búsqueda incremental se sale de ella antes de ejecutar el comando. De este modo, el comando opera en el búfer desde la que invocó la búsqueda. Sin embargo, si personaliza la variable search-exit-option a append, los caracteres que escriba que no sean interpretados por la búsqueda incremental simplemente se añaden a la cadena de búsqueda. Esto permite incluir en la cadena de búsqueda caracteres de control, como C-a, que normalmente saldrían de la búsqueda e invocarían el comando vinculado a ellos en el búfer.

Argumentos de Prefijo

En la búsqueda incremental, cuando se escribe un comando que especifica un argumento prefijo (véase 8.10 Argumentos Numéricos), por defecto se aplicará a la siguiente acción de la búsqueda o al comando que sale de la búsqueda. En otras palabras, introducir un argumento prefijo no terminará por sí mismo la búsqueda.

En versiones anteriores de Emacs, la introducción de un argumento prefijo siempre terminaba la búsqueda. Puede volver a este comportamiento estableciendo la variable isearch-allow-prefix a nil.

Cuando isearch-allow-scroll es distinto de nil (véase más abajo), los argumentos de prefijo tienen siempre el comportamiento por defecto descrito anteriormente, es decir, no terminan la búsqueda, aunque isearch-allow-prefix sea nil.

Comandos de Desplazamiento

Normalmente, los comandos de desplazamiento salen de la búsqueda incremental. Pero si cambia la variable isearch-allow-scroll a un valor no nulo, podrá utilizar la barra de desplazamiento, así como comandos de desplazamiento de teclado como C-v, M-v y C-l (véase 15.1 Desplazamiento), que tienen una propiedad scroll-command no nula, sin salir de la búsqueda. Esto sólo se aplica cuando se invocan estos comandos a través de sus secuencias de teclas vinculadas; si se escribe Alt-x (M-x), se saldrá de la búsqueda. Puede dar argumentos prefijados a estos comandos de la forma habitual. Normalmente, esta función no permite desplazarse por la coincidencia actual, pero si se personaliza isearch-allow-scroll con el valor especial unlimited, se elimina esta restricción.

La función isearch-allow-scroll también afecta a otros comandos, como C-x 2 (split-window-below) y C-x ^ (enlarge-window), que no se desplazan exactamente pero sí afectan a la posición del texto en la pantalla. De hecho, afecta a cualquier comando que tenga una propiedad isearch-scroll no nula. Así que puede controlar qué comandos se ven afectados cambiando estas propiedades.

Por ejemplo, para hacer que C-h l se pueda usar dentro de una búsqueda incremental en todas las futuras sesiones de Emacs, use C-h c para encontrar qué comando ejecuta (ver 11.2 Documentación de una Tecla), que es view-lossage. Luego puede poner la siguiente línea en su archivo init (ver 11.2 Documentación de una Tecla):

(put 'view-lossage 'isearch-scroll t)

Esta función puede aplicarse a cualquier comando que no cambie permanentemente el punto, el contenido del búfer, los datos coincidentes, el búfer actual o la ventana y el marco seleccionados. El comando no debe intentar por sí mismo una búsqueda incremental. Esta función se desactiva si isearch-allow-scroll es nil (valor por defecto).

Del mismo modo, si cambia la variable isearch-allow-motion a un valor no nulo, se habilita el uso de los comandos de movimiento del teclado M-< (Alt-<) , M-> (Alt->), C-v (Ctrl-v) y M-v (Alt-v), para desplazarse respectivamente a la primera aparición de la cadena de búsqueda actual en el búfer, la última, la primera después de la ventana actual y la última antes de la ventana actual. La dirección de búsqueda no cambia cuando se usan estos comandos de movimiento, a menos que cambie la variable isearch-motion-changes-direction a un valor no nulo, en cuyo caso la dirección de búsqueda es hacia adelante después de M-< y C-v, y hacia atrás después de M-> y M-v.

Comandos de Movimiento

Cuando isearch-yank-on-move está configurado a shift, puede extender la cadena de búsqueda manteniendo pulsada la tecla Shift mientras escribe comandos de movimiento del cursor. Tirará del texto que termine en la nueva posición después de mover el punto en el búfer actual.

Cuando isearch-yank-on-move es t, puede ampliar la cadena de búsqueda sin utilizar la tecla Mayús (Shift) para los comandos de movimiento del cursor, pero sólo se aplica a determinados comandos de movimiento que tienen la propiedad isearch-move en sus símbolos.

16.1.7. Buscar en el Minibuffer

Si inicia una búsqueda incremental mientras el minibúfer está activo, Emacs busca en el contenido de este. A diferencia de la búsqueda en un búfer ordinario, la cadena de búsqueda no se muestra en el área de eco, porque ésta se usa para mostrar el minibúfer.

Si falla una búsqueda incremental en el minibúfer, intente buscar en el historial del propio minibúfer. Véase 9.5 Historial del Minibúfer. Puede visualizar el minibúfer y su historial como una serie de páginas, con el primer elemento del historial en la primera página y el contenido del minibúfer actual en la última. Una búsqueda hacia adelante, Ctrl-s (C-s), busca hacia páginas posteriores; una búsqueda hacia atrás, Ctrl-r (C-r), busca hacia páginas anteriores. Al igual que en la búsqueda normal en el búfer, una búsqueda fallida puede envolverse, yendo de la última página a la primera o viceversa.

Cuando la coincidencia actual se encuentra en un elemento del historial, dicho elemento se introduce en el minibúfer. Si sale de la búsqueda incremental normalmente (por ejemplo, tecleando RETURN (RET)), permanece en el minibúfer. Al cancelar la búsqueda, con Ctrl-g (C-g), se restaura el contenido del minibúfer cuando se inició la búsqueda.

16.2 Búsqueda no Incremental

Emacs también tiene comandos convencionales de búsqueda no incremental, que requieren que escriba la cadena de búsqueda completa antes de que comience la búsqueda.

Ctrl-s RETURN cadena RETURN (C-s RET cadena RET)

Busca cadena.

Ctrl-r RETURN cadena RETURN (C-r RET cadena RET)

Búsqueda hacia atrás de cadena.

Para iniciar una búsqueda no incremental, escriba primero Ctrl-s RETURN (C-s RET). Esto entra en el minibúfer para leer la cadena de búsqueda; termina la cadena con RET, y entonces tiene lugar la búsqueda. Si no se encuentra la cadena, el comando de búsqueda indica un error.

Cuando se teclea Ctrl-s RETURN (C-s RET), el C-s invoca la búsqueda incremental como de costumbre. Ese comando está especialmente programado para invocar el comando de búsqueda no incremental, si la cadena que especifica está vacía. (De lo contrario, un argumento vacío sería inútil.) Ctrl-r RETURN (C-r RET) hace lo mismo, invocando el comando de búsqueda no incremental hacia atrás.

La búsqueda no incremental también puede invocarse desde el menú Edit->Search (Edición->Búsqueda) de la barra de menús.

También puede usar dos comandos más simples, M-x search-forward y M-x search-backward. Estos comandos buscan las cadenas literales que especifique y no admiten ninguna de las funciones de búsqueda laxa (consulte 16.9. Coincidencia Laxa Durante la Búsqueda), excepto la combinación de mayúsculas y minúsculas.

16.3 Búsqueda por Palabras

Una búsqueda de palabras encuentra una secuencia de palabras sin tener en cuenta el tipo de puntuación entre ellas. Por ejemplo, si introduce una cadena de búsqueda formada por dos palabras separadas por un solo espacio, la búsqueda coincidirá con cualquier secuencia de esas dos palabras separadas por uno o más espacios, nuevas líneas u otros caracteres de puntuación. Esto resulta especialmente útil para buscar en documentos de texto, ya que no tiene que preocuparse de si las palabras que busca están separadas por nuevas líneas o espacios. Tenga en cuenta que los modos principales para lenguajes de programación u otros modos especializados pueden modificar la definición de una palabra para adaptarla a sus necesidades sintácticas.

Alt-s w (M-s w)

Si la búsqueda incremental está activa, conmuta el modo de búsqueda por palabra (isearch-toggle-word); de lo contrario, inicia una búsqueda incremental por palabra hacia adelante (isearch-forward-word).

Altf-s RETURN palabra RETURN (M-s w RET palabra RET)

Busca palabras, usando una búsqueda no incremental de palabras hacia adelante.

Alt-s w Ctrl-r RETURN palabra RETURN (M-s w C-r RET palabras RET)

Busca palabras hacia atrás, usando una búsqueda de palabras no incremental.

Alt-s Alt-w (M-s M-w)

Busca en la Web el texto de la región.

Para iniciar una búsqueda incremental de palabras hacia adelante, escriba Alt-s w (M-s w). Si la búsqueda incremental no está ya activa, se ejecuta el comando isearch-forward-word. Si la búsqueda incremental ya está activa (ya sea hacia adelante o hacia atrás), M-s w ejecute el comando isearch-toggle-word, que cambia a una búsqueda de palabras manteniendo la dirección de la búsqueda y la cadena de búsqueda actual sin cambios. Puede volver a desactivar la búsqueda por palabra escribiendo M-s w de nuevo.

Para iniciar una búsqueda de palabras no incremental, escriba Alt-s wRETURN (M-s w RET) para una búsqueda hacia adelante, o Alts w Ctrl-r RETURN (M-s w C-r RET) para una búsqueda hacia atrás. Estos comandos ejecutan la búsqueda de palabras hacia delante y la búsqueda de palabras hacia atrás, respectivamente.

Las búsquedas de palabras incrementales y no incrementales difieren ligeramente en la forma de encontrar una coincidencia. En una búsqueda no incremental, cada palabra de la cadena de búsqueda debe coincidir exactamente con una palabra entera. En una búsqueda incremental, la coincidencia es más laxa: mientras escribe la cadena de búsqueda, no es necesario que la primera y la última palabra coincidan con palabras completas. Esto se hace para que la búsqueda pueda realizarse de forma incremental a medida que se escribe. Esta laxitud adicional no se aplica al resaltado impreciso (véase 16.1 Búsqueda Incremental), que siempre coincide con palabras enteras. Mientras escribe la cadena de búsqueda, aparece Pending (Pendiente) en el indicador de búsqueda hasta que use una tecla de repetición de búsqueda como C-s.

Los comandos de búsqueda de palabras no realizan plegado (o desdoblamiento) de caracteres, y la activación de la concordancia laxa de espacios en blanco (véase 16.9. Coincidencia Laxa Durante la Búsqueda) no tiene ningún efecto sobre ellos.

Para buscar en la Web el texto de la región, escriba Alt-s Alt-w (M-s M-w). Este comando realiza una búsqueda en Internet de las palabras de la región usando el motor de búsqueda cuya URL está especificada por la variable eww-search-prefix (ver EWW en The Emacs Web Browser Manual). Si la región no está activa, o no contiene ninguna palabra, este comando pide al Usuario una URL o palabras clave para buscar.

16.4 Búsqueda por Símbolos

Una búsqueda de símbolos es muy parecida a una búsqueda ordinaria, excepto en que los límites de la búsqueda deben coincidir con los límites de un símbolo. El significado de símbolo en este contexto depende del modo principal, y normalmente se refiere a un token de código fuente, como un símbolo Lisp en modo Emacs Lisp. Por ejemplo, si realiza una búsqueda incremental de símbolos para el símbolo Lisp forward-word, no coincidiría con isearch-forward-word. Por tanto, esta función es útil sobre todo para buscar código fuente.

Alt-s _ (M-s _)

Si la búsqueda incremental está activa, conmute el modo de búsqueda de símbolos (isearch-toggle-symbol); de lo contrario, inicie una búsqueda incremental de símbolos hacia delante (isearch-forward-symbol).

Alt-s . (M-s .)

Inicia una búsqueda incremental de símbolos hacia adelante con el símbolo encontrado cerca del punto añadido inicialmente a la cadena de búsqueda.

Alt-s RETURN simbolo RET (M-s _ RET simbolo RET)

Busca símbolo hacia adelante, de forma no incremental.

Alt-s _ Ctrl-r RET simbolo RETURN (M-s _ C-r RET simbolo RET)

Busca símbolo hacia atrás, de forma no incremental.

Para iniciar una búsqueda incremental de símbolos hacia adelante, escriba Alt-s _ (M-s _) o Alt-s . (M-s .) si el símbolo a buscar está cerca del punto). Si la búsqueda incremental no está ya activa, M-s _ ejecuta el comando isearch-forward-symbol y M-s . ejecuta el comando isearch-forward-symbol-at-point. Con un argumento de prefijo numérico n, M-s . buscará la siguiente aparición del símbolo en el punto; los valores negativos de n buscan hacia atrás. Si la búsqueda incremental ya está activa, M-s _ cambia a una búsqueda de símbolos, conservando la dirección de la búsqueda y la cadena de búsqueda actual; puede desactivar la búsqueda de símbolos escribiendo M-s _ de nuevo. En la búsqueda incremental de símbolos, mientras escribe la cadena de búsqueda, sólo se requiere que el principio de la cadena de búsqueda coincida con el principio de un símbolo, y aparece Pending (Pendiente) en el indicador de búsqueda hasta que use una tecla de repetición de búsqueda como C-s.

Para iniciar una búsqueda de símbolos no incremental, escriba Alt-s _ RETURN (M-s _ RET) para una búsqueda hacia delante, o Alt-s _ Ctrlr RETURN (M-s _ C-r RET) para una búsqueda hacia atrás. En las búsquedas de símbolos no incrementales, el principio y el final de la cadena de búsqueda deben coincidir con el principio y el final de un símbolo, respectivamente.

Los comandos de búsqueda de símbolos no realizan desdoblamiento de caracteres, y la activación de la concordancia laxa de espacios en blanco (véase 16.9. Coincidencia Laxa Durante la Búsqueda) no tiene ningún efecto sobre ellos.

16.5 Búsqueda por Expresiones Regulares

Una expresión regular (o expreg para abreviar) es un patrón que denota una clase de cadenas alternativas con las que coincidir. Emacs proporciona formas incrementales y no incrementales de buscar una coincidencia para una expreg. La sintaxis de las expresiones regulares se explica en la siguiente sección.

Ctrl-Alt-s (C-M-s)

Comienza la búsqueda incremental de expreg (isearch-forward-regexp).

Ctrl-Alt-r (C-M-r)

Comienza la búsqueda incremental inversa de expresiones regulares (isearch-backward-regexp).

La búsqueda incremental de una expreg se realiza escribiendo Ctrl-Alt-s (C-M-s, isearch-forward-regexp), invocando a C-s con un argumento de prefijo (cuyo valor no importa), o escribiendo M-r dentro de una búsqueda incremental hacia adelante. Este comando lee una cadena de búsqueda de forma incremental, igual que C-s, pero trata la cadena de búsqueda como una expreg en lugar de buscar una coincidencia exacta con el texto del búfer. Cada vez que se añade texto a la cadena de búsqueda, se alarga la expreg y se busca la nueva. Para buscar una expresión regular hacia atrás, utilice C-M-r (isearch-backward-regexp), C-r con un argumento de prefijo, o M-r dentro de una búsqueda incremental hacia atrás.

Todas las secuencias de teclas especiales de una búsqueda incremental ordinaria (véase 16.1.5 Entrada Especial para la Búsqueda Incremental) hacen cosas similares en una búsqueda incremental de expresiones regulares. Por ejemplo, si se escribe Ctrl-s (C-s) inmediatamente después de iniciar la búsqueda, se recupera la última expreg de búsqueda incremental utilizado y se busca hacia adelante. Las búsquedas incrementales expreg y no expreg tienen valores predeterminados independientes. También tienen anillos de búsqueda independientes, a los que puede acceder con Alt-p (M-p) y Alt-n (M-n). El número máximo de expresiones regulares de búsqueda guardados en el anillo de búsqueda viene determinado por el valor de regexp-search-ring-max, 16 por defecto.

A diferencia de la búsqueda incremental ordinaria, la búsqueda incremental de expresiones regulares no usa la concordancia de espacio laxo por defecto. Para activar esta función, emplee M-s SPC (isearch-toggle-lax-whitespace). De este modo, cualquier SPACE (SPC) escrito en la búsqueda incremental de expresiones regulares coincidirá con cualquier secuencia de uno o más caracteres de espacio en blanco. La variable search-whitespace-regexp especifica la expreg para la coincidencia de espacios laxos. Véase 16.1.5 Entrada Especial para la Búsqueda Incremental.

Además, a diferencia de la búsqueda incremental ordinaria, la búsqueda incremental de expreg no puede usar el plegado de caracteres (consulte 16.9. Coincidencia Laxa Durante la Búsqueda). (Si activa el plegado de caracteres durante la búsqueda incremental de expreg con Alt-s ' (M-s '), la búsqueda se convierte en una búsqueda de no expresiones regulares y el patrón de búsqueda que ha escrito se interpreta como una cadena literal).

En algunos casos, añadir caracteres a la expresión regular en una búsqueda incremental puede hacer que el cursor retroceda y comience de nuevo. Por ejemplo, si ha buscado foo y añade \|bar, el cursor retrocede en caso de que el primer bar preceda al primer foo. (El indicador cambiará y dirá Pending (Pendiente) para notificar al Usuario que se ha producido este recalculo). Véase 16.6 Sintaxis de las Expresiones Regulares.

La búsqueda de expreg hacia delante y hacia atrás no son simétricas, porque la coincidencia expreg en Emacs siempre opera hacia delante, empezando por el principio de la misma. Por lo tanto, la búsqueda expreg hacia adelante escanea hacia adelante, intentando una coincidencia hacia adelante en cada posición inicial posible. La búsqueda expreg hacia atrás escanea en esa dirección, intentando una coincidencia hacia delante en cada posición de inicio posible. Estos métodos de búsqueda no son imágenes en espejo.

La búsqueda no incremental de una expresión regular se realiza con los comandos re-search-forward y re-search-backward. Puede invocarlos con M-x, o mediante la búsqueda incremental de expresiones regulares con Ctrl-Alt-s RETURN (C-M-s RET) y Ctrl-Alt-r RETURN (C-M-r RET). Cuando invoca estos comandos con M-x, buscan la expresión regular exacta que especifique y, por lo tanto, no admiten ninguna función de búsqueda laxa (consulte 16.9. Coincidencia Laxa Durante la Búsqueda), excepto la combinación de mayúsculas y minúsculas.

Si usa los comandos de búsqueda incremental expreg con un argumento de prefijo, realizan una búsqueda de cadena ordinaria, como isearch-forward y isearch-backward. Véase 16.1 Búsqueda Incremental.

16.6 Sintaxis de las Expresiones Regulares

Esta sección (y este manual en general) describe las características de las expresiones regulares que los Usuarios suelen usar. Vea Expresiones Regulares en El Manual de Referencia de Emacs Lisp, para características adicionales usadas principalmente en programas Lisp.

Las expresiones regulares tienen una sintaxis en la que unos pocos caracteres son construcciones especiales y el resto son ordinarios. Un carácter ordinario coincide con ese mismo carácter y nada más. Los caracteres especiales son $^.*+?[\. El carácter ] es especial si termina una alternativa de caracteres (véase más adelante). El carácter - es especial dentro de una alternativa de caracteres. Cualquier otro carácter que aparezca en una expresión regular es ordinario, a menos que lo preceda una \. (Cuando utilice expresiones regulares en un programa Lisp, cada \ debe estar duplicado; vea el ejemplo al final de esta sección).

Por ejemplo, f no es un carácter especial, por lo que es ordinario, y por lo tanto f es una expresión regular que coincide con la cadena f y con ninguna otra. (No coincide con la cadena ff.) Del mismo modo, o es una expresión regular que sólo coincide con o. (Cuando se ignoran las distinciones entre mayúsculas y minúsculas, estas expresiones regulares también coinciden con F y O, pero consideramos esto una generalización de «la misma cadena», en lugar de una excepción).

Dos expresiones regulares a y b cualesquiera pueden concatenarse. El resultado es una expresión regular que coincide con una cadena si a coincide con alguna parte del principio de esa cadena y b coincide con el resto de la cadena. Como ejemplo trivial, concatenar las expresiones regulares foo y o da como resultado la expresión regular fo, que sólo coincide con la cadena fo. Para hacer algo menos trivial, necesita usar uno de los caracteres especiales. Aquí tiene una lista de ellos.

. (punto)

Es un carácter especial que coincide con cualquier carácter excepto con una nueva línea. Por ejemplo, la expresión regular a.b coincide con cualquier cadena de tres caracteres que empiece por a y termine por b.

*

No es una construcción en sí misma; es un operador postfijo que significa hacer coincidir la expresión regular precedente repetidamente cualquier número de veces, tantas veces como sea posible. Así, o* coincide con cualquier número de o's, incluyendo ninguna.

* se aplica siempre a la expresión precedente más pequeña posible. Así, fo* tiene repetida una o, no una fo. O sea que coincide con f, fo, foo, etc.

El procesador de sintáxis ejecuta una construcción * emparejando, inmediatamente, tantas repeticiones como pueda encontrar. Luego continúa con el resto del patrón. Si esto falla, se realiza un retroceso, descartando algunas de las coincidencias de la construcción modificada con * en caso de que esto haga posible la coincidencia con el resto del patrón. Por ejemplo, al comparar ca*ar con la cadena caaar, a* intenta primero coincidir con las tres a; pero el resto del patrón es ar y sólo queda r por coincidir, por lo que este intento falla. La siguiente alternativa es que a* sólo coincida con dos a. Con esta opción, el resto de la expresión regular coincide correctamente.

+

Es un operador postfijo, similar a *, excepto en que debe coincidir con la expresión precedente al menos una vez. Así, ca+r coincide con las cadenas car y caaaar, pero no con la cadena cr, mientras que ca*r coincide con las tres cadenas.

?

es un operador postfijo, similar a *, excepto en que puede coincidir con la expresión precedente una vez o ninguna. Así, ca?r coincide con car o cr, y nada más.

*?, +?, ??

Son variantes no exigentes de los operadores anteriores. Los operadores normales *, +, ? coinciden tanto como pueden, siempre que la expresión regular global pueda seguir siendo similar. Con un ? a continuación, coincidirán lo menos posible.

De esta forma, tanto ab* como ab*? pueden coincidir con la cadena a y la cadena abbbb; pero si intenta hacer coincidir ambas con el texto abbb, ab* coincidirá con todo (la coincidencia válida más larga), mientras que ab*? coincidirá sólo con a (la coincidencia válida más corta).

Los operadores no arbitrarios hacen coincidir la cadena más corta posible a partir de un punto de partida dado; sin embargo, en una búsqueda hacia delante, siempre se elige el punto de partida más temprano posible. Así, si busca a.*?$ contra el texto abbab seguido de una nueva línea, coincide con toda la cadena. Como puede coincidir a partir de la primera a, lo hace.

[ ... ]

Es un conjunto de caracteres alternativos, o un conjunto de caracteres, que empieza con [ y termina en ].

En el caso más sencillo, los caracteres entre los dos corchetes son los que pueden coincidir con este conjunto. De esta forma, [ad] coincide con una a o una d, y [ad]* coincide con cualquier cadena compuesta sólo por a's y d's (incluida la cadena vacía). Por lo tanto, c[ad]*r coincide con cr, car, cdr, caddaar, etc.

También puede incluir rangos de caracteres en un juego de caracteres, escribiendo los caracteres inicial y final con un - entre ellos. Así, [a-z] coincide con cualquier letra ASCII minúscula. Los rangos pueden mezclarse libremente con caracteres individuales, como en [a-z$%.], que coincide con cualquier letra ASCII minúscula o $, % o punto. Otro ejemplo: [α-ωί] coincide con todas las letras griegas minúsculas.

También puede incluir determinadas clases de caracteres especiales en un conjunto de caracteres. Un [: y su par equivalente :] encierran una clase de caracteres dentro de un conjunto de caracteres alternativos. Por ejemplo, [[:alnum:]] coincide con cualquier letra o dígito. Vea Clases de Caracteres en el Manual de Referencia de Emacs Lisp, para una lista de clases de caracteres.

Para incluir un ]] en un conjunto de caracteres, debe convertirlo en el primer carácter. Por ejemplo, []a] coincide con ']' o 'a'. Para incluir un -, escriba - como último carácter del conjunto, aunque también puede ponerlo primero o después de un rango. De esta forma, []-] coincide tanto con ] como con -.

Para incluir ^ en un conjunto, colóquelo en cualquier lugar menos al principio del conjunto. (Al principio, complementa el conjunto, véase más adelante).

Cuando use un rango en una búsqueda sin distinción entre mayúsculas y minúsculas, debe escribir ambos extremos del rango en mayúsculas, o ambos en minúsculas, o ambos deben ser no-letras. El comportamiento de un rango mixto como 'A-z' está mal definido, y puede cambiar en futuras versiones de Emacs.

[^ ]

[^ inicia un juego de caracteres complementados, que coincide con cualquier carácter excepto los especificados. Así, [^a-z0-9A-Z] coincide con todos los caracteres excepto las letras y dígitos ASCII.

^ no es especial en un juego de caracteres a menos que sea el primer carácter. El carácter que sigue al ^ se trata como si fuera el primero (en otras palabras, - y ] no son especiales en este caso).

Un juego de caracteres complementado puede coincidir con una nueva línea, a menos que ésta se mencione como uno de los caracteres que no deben coincidir. Esto contrasta con el tratamiento de las expresiones regulares en programas como grep.

^

Es un carácter especial que coincide con la cadena vacía, pero sólo al principio de una línea del texto que se está comparando. De lo contrario, no coincide con nada. Así, ^foo coincide con un foo que aparece al principio de una línea.

Por razones de compatibilidad histórica, ^ sólo puede utilizarse con este significado al principio de la expresión regular, o después de \( o \|.

$

Es similar a ^ pero sólo coincide con el final de una línea. De este modo, x+$ coincide con una cadena de una x o más al final de una línea.

Por razones de compatibilidad histórica, $ sólo puede usarse con este significado al final de la expresión regular, o antes de \) o \|.

\

Tiene dos funciones: entrecomilla los caracteres especiales (incluido \) e introduce construcciones especiales adicionales.

Dado que \ entrecomilla caracteres especiales, \$ es una expresión regular que sólo coincide con $, y \[ es una expresión regular que sólo coincide con [, y así sucesivamente.

Consulte la siguiente sección para conocer las construcciones especiales que empiezan por \.

Nota

Nota: por compatibilidad histórica, los caracteres especiales se tratan como ordinarios si se encuentran en contextos en los que sus significados especiales no tienen sentido. Por ejemplo, *foo trata * como ordinario ya que no hay ninguna expresión precedente sobre la que * pueda actuar. Es una mala práctica depender de este comportamiento; es mejor entrecomillar el carácter especial de todos modos, independientemente de dónde aparezca.

Como un ´ no es especial dentro de un conjunto de caracteres alternativos, nunca puede eliminar el significado especial de -, ^ o ]. No debe entrecomillar estos caracteres cuando no tengan un significado especial. Esto no aclararía nada, ya que las barras invertidas pueden preceder legítimamente a estos caracteres cuando tienen un significado especial, como en [^\] ([^\\] para la sintaxis de cadenas de Lisp), que coincide con cualquier carácter excepto una barra invertida.

16.7 Barra Invertida en Expresiones Regulares

En la mayoría de los casos, \ seguido de cualquier carácter sólo coincide con ese carácter. Sin embargo, hay varias excepciones: las secuencias de dos caracteres que empiezan por \ tienen un significado especial. El segundo carácter de la secuencia es siempre un carácter normal cuando se utiliza solo. He aquí una tabla de construcciones usando la barra invertida (\).

\|

Especifica una alternativa. Dos expresiones regulares a y b con \| entre ellas forman una expresión que coincide con algún texto si a coincide con él o b coincide con él. Funciona intentando coincidir con a y, si falla, intenta coincidir con b.

Así, foo\|bar coincide con foo o bar, pero no con ninguna otra cadena.

\| se aplica a las expresiones circundantes más grandes posibles. Sólo una agrupación \( ... \) circundante puede limitar el poder de agrupación de \|.

Existe una capacidad de retroceso completa para manejar múltiples usos de \|.

\( \)

Es un constructo de agrupación que sirve para tres propósitos:

  1. Para encerrar un conjunto de alternativas \| para otras operaciones. Así, \(foo\|bar\)x coincide con foox o barx.

  2. Para encerrar una expresión complicada sobre la que puedan operar los operadores postfijos *, + y ?. De esta forma, ba\(na\)* coincide con bananana, etc., con cualquier (cero o más) número de cadenas na.

  3. Para registrar una subcadena coincidente para futuras consultas.

Esta última aplicación no es consecuencia de la idea de agrupación parentética; es una característica independiente que se asigna como segundo significado a la misma construcción \( ... \). En la práctica no suele haber conflicto entre los dos significados; cuando lo hay, se puede usar un grupo parental, que se describe a continuación.

\(?: \)

Especifica un grupo alternativo que no registra la subcadena coincidente; no se puede hacer referencia a él con \d (véase más adelante). Esto es útil para combinar mecánicamente expresiones regulares, de forma que pueda añadir grupos con fines sintácticos sin interferir con la numeración de los grupos a los que se pretende hacer referencia.

\d

Coincide con el mismo texto que correspondió a la d-ésima ocurrencia de una construcción \( ... \). Esto se denomina referencia retrospectiva.

Tras el final de una construcción \( ... \), el emparejador recuerda el principio y el final del texto emparejado por esa construcción. Entonces, más adelante en la expresión regular, puede usar \ seguido del dígito d para significar «coincide con el mismo texto que se asemeja a la d-enésima construcción \( ... \)».

A las cadenas que coinciden con las nueve primeras construcciones \( ... \) que aparecen en una expresión regular se les asignan números del 1 al 9 en el orden en que aparecen los paréntesis abiertos en la expresión regular. Por lo tanto, puede usar de \1 a \9 para referirse al texto coincidente con las construcciones \( ... \) correspondientes.

Por ejemplo, \(.*\)\1 coincide con cualquier cadena sin nueva línea que esté compuesta por dos mitades idénticas. \(.*\) coincide con la primera mitad, que puede ser cualquier cosa, pero \1 que le sigue debe coincidir exactamente con el mismo texto.

Si una determinada construcción \( ... \) coincide más de una vez (lo que puede ocurrir fácilmente si va seguida de *), sólo se registra la última coincidencia.

\{m\}

Es un operador postfijo que especifica m repeticiones, es decir, la expresión regular precedente debe coincidir exactamente m veces seguidas. Por ejemplo, x\{4\} coincide con la cadena xxxx y nada más.

\{m,n\}

Es un operador postfijo que especifica entre m y n repeticiones, es decir, la expresión regular precedente debe coincidir al menos m veces, pero no más de n veces. Si se omite n, no hay límite superior, pero la expresión regular precedente debe coincidir al menos m veces.

\{0,1\} es equivalente a ?.
\{0,\} es equivalente a *.
\{1,\} es equivalente a +.
\`

Coincide con la cadena vacía, pero sólo al principio de la cadena o del búfer (o de su parte accesible) con el que se está comparando.

\'

Coincide con la cadena vacía, pero sólo al final de la cadena o del búfer (o de su parte accesible) con el que se está comparando.

\=

Coincide con la cadena vacía, pero sólo en el punto.

\b

Coincide con la cadena vacía, pero sólo al principio o al final de una palabra. De este modo, \bfoo\b coincide con cualquier aparición de foo como palabra separada. \bballs?\b coincide con ball o balls como palabra separada.

\b coincide al principio o al final del búfer, independientemente del texto que aparezca junto a él.

\B

Coincide con la cadena vacía, pero no al principio o al final de una palabra.

\<

Coincide con la cadena vacía, pero sólo al principio de una palabra. \< coincide al principio del búfer sólo si le sigue un carácter constitutivo de palabra.

\>

Coincide con la cadena vacía, pero sólo al final de una palabra. \> coincide al final del búfer sólo si el contenido termina con un carácter constitutivo de palabra.

\w

Coincide con cualquier carácter constitutivo de palabra. La tabla de sintaxis determina qué caracteres son. Ver Tablas de Sintaxis en el Manual de Referencia de Emacs Lisp.

\W

Coincide con cualquier carácter que no sea un constituyente de palabra.

\_<

Coincide con la cadena vacía, pero sólo al principio de un símbolo. Un símbolo es una secuencia de uno o varios caracteres constituyentes de símbolos. Un carácter constituyente de símbolo es un carácter cuya sintaxis es w o _. \_< sólo coincide al principio del búfer si le sigue un carácter constituyente de símbolo. Al igual que con las palabras, la tabla de sintaxis determina qué caracteres son constituyentes de símbolo.

\_>

Coincide con la cadena vacía, pero sólo al final de un símbolo. \_> coincide al final del búfer sólo si el contenido termina con un carácter constituyente de símbolo.

\sc

Coincide con cualquier carácter cuya sintaxis sea c. Aquí c es un carácter que designa una clase particular de sintaxis: así, w para constituyente de palabra, - o `` `` para espacio en blanco, . para puntuación ordinaria, etc. Véase Tabla de Clases de Sintaxis en el Manual de Referencia de Emacs Lisp.

\Sc

Coincide con cualquier carácter cuya sintaxis no sea c.

\cc

Coincide con cualquier carácter que pertenezca a la categoría c. Por ejemplo, \cc coincide con caracteres chinos, \cg con caracteres griegos, etc. Para obtener la descripción de las categorías conocidas, escriba Alt-x describe-categories RETURN (M-x describe-categories RET).

\cc

Coincide con cualquier carácter que no pertenezca a la categoría c.

Las construcciones que pertenecen a palabras y sintaxis son controladas por la configuración de la tabla de sintaxis. Ver Tablas de Sintaxis en el Manual de Referencia de Emacs Lisp.

16.8 Ejemplo de Expresión Regular

He aquí un ejemplo de expresión regular a la expreg que Emacs utiliza, por defecto, para reconocer el final de una frase, sin incluir el espacio siguiente (es decir, la variable sentence-end-base):

[.?!][]\"')}]*

Contiene dos partes sucesivas: un conjunto de caracteres que coincide con punto, ? o !, y un conjunto de caracteres que coincide con corchetes, comillas o paréntesis, repetido cero o más veces.

16.9. Coincidencia Laxa Durante la Búsqueda

Normalmente, se desea que los comandos de búsqueda no tengan en cuenta ciertas diferencias menores entre la cadena de búsqueda que se escribe y el texto que se busca. Por ejemplo, las secuencias de caracteres de espacios en blanco de diferente longitud suelen considerarse equivalentes; las diferencias entre mayúsculas y minúsculas no suelen importar; etc. Esto se conoce como equivalencia de caracteres.

Esta sección describe las características de búsqueda laxa de Emacs y cómo adaptarlas a sus necesidades.

Por defecto, los comandos de búsqueda realizan una coincidencia de espacios laxa: cada espacio, o secuencia de espacios, coincide con cualquier secuencia de uno o más caracteres de espacio en blanco del texto. Más concretamente, Emacs hace coincidir cada secuencia de caracteres de espacio en la cadena de búsqueda con una expresión regular especificada por la opción de Usuario search-whitespace-regexp. El valor por defecto de esta opción considera cualquier secuencia de espacios y tabuladores como espacios en blanco. Así, foo bar coincide con foo  bar, foo   bar, foo    bar, etc. (pero no con foobar). Si desea que los espacios coincidan con secuencias de nuevas líneas así como con espacios y tabuladores, personalice la opción para que su valor sea la expresión regular [ \t\n]+. (El comportamiento predeterminado de la búsqueda incremental de expresiones regulares es diferente; consulte 16.5 Búsqueda por Expresiones Regulares).

Si desea que los caracteres de espacios en blanco coincidan exactamente, puede desactivar la coincidencia de espacios laxos escribiendo Alt-SPACE (M-s SPC, isearch-toggle-lax-whitespace) dentro de una búsqueda incremental. Otra orden M-s SPC vuelve a activar la concordancia de espacios laxos. Para desactivar la coincidencia laxa de espacios en blanco en todas las búsquedas, cambie search-whitespace-regexp a nil; entonces, cada espacio de la cadena de búsqueda coincidirá exactamente con un espacio.

Las búsquedas en Emacs ignoran por defecto las mayúsculas y minúsculas del texto que buscan, si especifica la cadena de búsqueda en minúsculas. De este modo, si especifica buscar foo, entonces Foo y fOO también coinciden. Las expresiones regulares, y en particular los conjuntos de caracteres, se comportan de forma similar: [ab] coincide con a o A o b o B. Esta característica se conoce como case folding y es compatible con los modos de búsqueda incremental y no incremental.

Nota

La separación de mayúsculas y minúsculas (case folding) es el proceso de hacer que dos textos que sólo difieren en mayúsculas y minúsculas sean idénticos a efectos de comparación, es decir, con el fin de hacer coincidir cadenas. Esto es distinto del mapeo de mayúsculas y minúsculas, que está pensado principalmente para fines de visualización.

Una letra mayúscula en cualquier lugar de la cadena de búsqueda hace que ésta distinga entre mayúsculas y minúsculas. Así, la búsqueda de Foo no encuentra foo ni FOO. Esto se aplica tanto a la búsqueda por expresión regular como a la búsqueda por cadena literal. El efecto cesa si se suprime la letra mayúscula de la cadena de búsqueda. La variable search-upper-case controla esto: si es distinta de nil, un carácter en mayúsculas en la cadena de búsqueda hace que la búsqueda distinga entre mayúsculas y minúsculas; si se establece en nil, se desactiva este efecto de los caracteres en mayúsculas. El valor por defecto de esta variable es not-yanks, que hace que la búsqueda distinga entre mayúsculas y minúsculas si hay letras mayúsculas en la cadena de búsqueda, y también hace que el texto traído desde el anillo de muertes en la cadena de búsqueda (véase 16.1.3 Búsqueda de Texto traído del Anillo de Muertes (Yanking)) se escriba en minúsculas, de modo que tales búsquedas no distinguen entre mayúsculas y minúsculas por defecto.

Si establece la variable case-fold-search en nil, todas las letras deben coincidir exactamente, incluidas las mayúsculas y minúsculas. Esta es una variable por búfer; alterar la variable normalmente afecta sólo al búfer actual, a menos que cambie su valor por defecto. Véase 50.2.3 Variables Locales. Esta variable también se aplica a las búsquedas no incrementales, incluidas las realizadas por los comandos de reemplazo (consulte 16.10. Comandos de Reemplazo) y los comandos de comparación del historial del minibúfer (consulte 9.5 Historial del Minibúfer).

Si se escribe o Alt-c o Alt-s c (M-c o M-s c, isearch-toggle-case-fold) dentro de una búsqueda incremental, se cambia la sensibilidad a mayúsculas/minúsculas de esa búsqueda. El efecto no se extiende más allá de la búsqueda incremental actual, pero anula el efecto de añadir o eliminar una letra mayúscula en la búsqueda actual.

Algunas variables relacionadas controlan la distinción entre mayúsculas y minúsculas en la búsqueda y la coincidencia de comandos o actividades específicos. Por ejemplo, tags-case-fold-search controla la sensibilidad a mayúsculas y minúsculas para find-tag. Para encontrar estas variables, escriba Alt-x apropos-variable RETURN case-fold-search RETURN (M-x apropos-variable RET case-fold-search RET).

La distinción entre mayúsculas y minúsculas no tiene en cuenta las diferencias entre caracteres, por lo que los caracteres en mayúsculas coinciden con las variantes en minúsculas y viceversa. Una generalización de la distinción entre mayúsculas y minúsculas es el desdoblamiento de caracteres, que no tiene en cuenta clases más amplias de distinciones entre caracteres similares. Por ejemplo, la letra a coincide con todos sus primos acentuados, como ä y á, sin tener en cuenta los signos diacríticos que distinguen estas variantes. Además, la a coincide con otros caracteres que se le parecen o que la tienen como parte de su representación gráfica, como U+00AA INDICADOR ORDINAL FEMENINO y U+24D0 LETRA BAJA LATÍN CIRCULADA A (que parece una a minúscula dentro de un círculo). Del mismo modo, el carácter ASCII de comillas dobles " coincide con todas las demás variantes de comillas dobles definidas por el estándar Unicode. Por último, el plegado de caracteres puede hacer que una secuencia de uno o más caracteres coincida con otra secuencia de longitud diferente: por ejemplo, la secuencia de dos caracteres ff coincide con U+FB00 LIGATURA PEQUEÑA LATINA FF y la secuencia (a) coincide con U+249C LETRA PEQUEÑA LATINA A ENENTONADA. Las secuencias de caracteres que no son idénticas, pero coinciden en el plegado de caracteres, se conocen como secuencias de caracteres equivalentes.

Generalmente, los comandos de búsqueda en Emacs no realizan por defecto el desdoblamiento de caracteres para que coincidan con secuencias de caracteres equivalentes. Puede activar este comportamiento personalizando la variable search-default-mode a char-fold-to-regexp. Consulte 16.12 Adaptar la Búsqueda a sus Necesidades. Dentro de una búsqueda incremental, si escribe Alt-s ' (M-s ', isearch-toggle-char-fold) se activa el plegado de caracteres, pero sólo para esa búsqueda. (Los comandos de reemplazo tienen un valor predeterminado diferente, controlado por una opción aparte; véase 16.10.3. Comandos de Reemplazo y Coincidencias Laxas).

Por defecto, al escribir una variante explícita de un carácter, como ä, como parte de la cadena de búsqueda, no coincide con su carácter base, como a. Pero si personaliza la variable char-fold-symmetric a t, los comandos de búsqueda tratan los caracteres equivalentes de la misma manera y el uso de cualquiera de un conjunto de caracteres equivalentes en una cadena de búsqueda encuentra cualquiera de ellos en el texto buscado, de modo que al escribir un carácter acentuado ä coincide con la letra a, así como con todas las demás variantes como á.

Puede añadir nuevos plegados usando la variable personalizable char-fold-include, o eliminar los existentes usando la variable personalizable char-fold-exclude. También puede personalizar char-fold-override a t para desactivar todas las equivalencias de caracteres excepto las que Usted mismo añada usando char-fold-include.

16.10. Comandos de Reemplazo

Emacs proporciona varios comandos para realizar operaciones de búsqueda y reemplazo. Además del simple comando M-x replace-string, existe M-% (query-replace), que presenta cada ocurrencia del patrón de búsqueda y le pregunta si desea reemplazarlo.

Los comandos de sustitución operan normalmente sobre el texto desde el punto hasta el final del búfer. Cuando la región está activa, operan sobre ella en su lugar (véase 12 La marca y la región). Los comandos de reemplazo básicos sustituyen una cadena de búsqueda (o expreg) por una cadena de reemplazo. Es posible realizar varias sustituciones en paralelo, utilizando el comando expand-region-abbrevs (véase 30.3 Control de la Expansión de Abreviaturas).

16.10.1 Reemplazo Incondicional

Alt-x replace-string RETURN cadena RETURN nueva-cadena RETURN
(M-x replace-string RET cadena RET nueva-cadena RET)

Sustituye cada aparición de cadena por nueva cadena.

Para reemplazar cada instancia de foo después del punto por bar, use el comando M-x replace-string con los dos argumentos foo y bar. El reemplazo sólo se produce en el texto posterior al punto, por lo que si desea cubrir todo el búfer debe ir primero al principio. Todas las ocurrencias hasta el final del búfer son reemplazadas; para limitar el reemplazo a una parte del búfer, active la región alrededor de esa parte. Cuando la región está activada, el reemplazo se limita a la región (véase 12.4 El Anillo de Marcas).

Cuando se termina de ejecutar replace-string, deja el punto en la última ocurrencia reemplazada. Añade la posición anterior del punto (donde se emitió la orden replace-string) al anillo de marcas, sin activar la marca; utilice Ctrl-u Ctrl-SPAcE (C-u C-SPC) para volver allí. Véase 12.4 El Anillo de Marcas.

Un argumento de prefijo restringe el reemplazo a las coincidencias que están rodeadas por límites de palabra.

Consulte 16.10.3. Comandos de Reemplazo y Coincidencias Laxas, para obtener detalles sobre la distinción entre mayúsculas y minúsculas y el desdoblamiento de caracteres en los comandos de reemplazo.

16.10.2. Reemplazo de Expresiones Regulares (expreg)

El comando M-x replace-string reemplaza las coincidencias exactas de una sola cadena. El comando similar M-x replace-regexp reemplaza cualquier coincidencia para un patrón de expresión regular especificado (véase 16.6 Sintaxis de las Expresiones Regulares).

Alt-x replace-regexp RETURN expreg RETURN nueva-cadena RETURN
(M-x replace-regexp RET expreg RET nueva-cadena RET)

Sustituye cada coincidencia de expreg por nueva-cadena.

En replace-regexp, la nueva cadena no tiene por qué ser constante: puede referirse a todo o parte de lo que coincide con la expreg. \& en nueva-cadena significa que se sustituye toda la coincidencia. \d en nueva-cadena, donde d es un dígito que empieza por 1, representa lo que coincidió con la nésima agrupación entre paréntesis de expreg. (Esto se denomina «referencia retrospectiva».) \# se refiere al recuento de sustituciones ya realizadas en este comando, como número decimal. En el primer reemplazo, \# significa 0; en el segundo, 1; y así sucesivamente. Por ejemplo,

M-x replace-regexp RET c[ad]+r RET \&-safe RET

sustituye (por ejemplo) adr por cadr-safe y cddr por cddr-safe.

M-x replace-regexp RET \(c[ad]+r\)-safe RET \1 RET

efectúa la transformación inversa. Para incluir un \ en el texto a reemplazar, debe introducir \\.

Si desea introducir parte de la cadena de sustitución a mano cada vez, use \? en la cadena de sustitución. Cada reemplazo le pedirá que edite la cadena de reemplazo en el minibúfer, poniendo el punto donde estaba el \?.

El resto de esta subsección está pensada para tareas especializadas y requiere conocimientos de Lisp. La mayoría de los lectores pueden saltársela.

Puede usar expresiones Lisp para calcular partes de la cadena de sustitución. Para ello, escriba \, seguido de la expresión en la cadena de sustitución. Cada sustitución calcula el valor de la expresión y lo convierte en texto sin entrecomillar (si es una cadena, esto significa usar el contenido de la cadena), y lo usa en la cadena de sustitución en lugar de la propia expresión. Si la expresión es un símbolo, un espacio en la cadena de sustitución después del nombre del símbolo va con el nombre del símbolo, por lo que el valor los sustituye a ambos.

Dentro de una expresión de este tipo, puede usar algunas secuencias especiales. \& y \d se refieren aquí, como es habitual, a la coincidencia completa como cadena, y a una subcomparación como cadena. d puede ser varios dígitos, y el valor de \d es nulo si la agrupación denésima entre paréntesis no coincide. También puede usar \#& y \#d para referirse a esas coincidencias como números (esto es válido cuando la coincidencia o subcomparación tiene la forma de un numeral). \# también indica el número de sustituciones ya realizadas.

Por ejemplo, podemos intercambiar x e y de esta manera:

M-x replace-regexp RET \(x\)\|y RET
\,(if \1 "y" "x") RET

Para computar cadenas de reemplazo para \,, la función format es a menudo útil (ver Formateando Cadenas en El Manual de Referencia de Emacs Lisp). Por ejemplo, para añadir cadenas numeradas consecutivamente como ABC00042 a las columnas 73 a 80 (a menos que ya estén ocupadas), puede usar

M-x replace-regexp RET ^.\{0,72\}$ RET
\,(format "%-72sABC%05d" \& \#) RET

16.10.3. Comandos de Reemplazo y Coincidencias Laxas

Esta subsección describe el comportamiento de los comandos de reemplazo con respecto a las coincidencias laxas (ver 16.9. Coincidencia Laxa Durante la Búsqueda) y cómo personalizarlo. En general, los comandos de reemplazo suelen ser más estrictos que los comandos de búsqueda.

A diferencia de la búsqueda incremental, los comandos de reemplazo no usan la concordancia de espacios laxa (ver coincidencia de espacios laxa 16.9. Coincidencia Laxa Durante la Búsqueda) por defecto. Para habilitar la concordancia de espacios laxa para el reemplazo, cambie la variable replace-lax-whitespace a no-nil. (Esto sólo afecta a cómo Emacs encuentra el texto a reemplazar, no al texto de reemplazo).

Una variable compañera replace-regexp-lax-whitespace controla si query-replace-regexp usa la concordancia laxa de espacios en blanco cuando busca patrones.

Si el primer argumento de una orden replace está en minúsculas, la orden ignora las mayúsculas y minúsculas en la búsqueda de ocurrencias para reemplazar, siempre que case-fold-search no sea nula y search-upper-case tampoco sea nula. Si search-upper-case (véase search-upper-case en 16.9. Coincidencia Laxa Durante la Búsqueda) es nil, el hecho de que la búsqueda ignore mayúsculas o minúsculas se determina únicamente mediante case-fold-search, independientemente de las mayúsculas o minúsculas del primer argumento de la orden. Si case-fold-search es nil, las mayúsculas y minúsculas siempre son significativas en todas las búsquedas.

Además, cuando el segundo argumento de un comando de sustitución está total o parcialmente en minúsculas, los comandos de sustitución intentan conservar el patrón de mayúsculas y minúsculas de cada aparición. Así, el comando

M-x replace-string RET foo RET bar RET

sustituye foo en minúsculas por bar en minúsculas, FOO en mayúsculas por BAR y Foo en mayúsculas por Bar. (Estas tres alternativas - minúsculas, mayúsculas y mayúsculas, son las únicas que replace-string puede distinguir).

Si se usan letras mayúsculas en la cadena de sustitución, permanecerán en mayúsculas cada vez que se inserte el texto. Si se usan mayúsculas en el primer argumento, el segundo argumento siempre se sustituye exactamente como se indica, sin conversión de mayúsculas y minúsculas. Del mismo modo, si el valor de case-replace o case-fold-search es nulo, la sustitución se realiza sin conversión de mayúsculas y minúsculas.

Por defecto, los comandos de reemplazo no usan el plegado de caracteres (ver plegado de caracteres (también conocido como secuencia de caracteres equivalentes) en 16.9. Coincidencia Laxa Durante la Búsqueda) cuando buscan el texto a reemplazar. Para habilitar el plegado de caracteres en query-replace y replace-string, establece la variable replace-char-fold a un valor no nulo. (Este ajuste no afecta al texto de reemplazo, sólo a cómo Emacs encuentra el texto a reemplazar. Tampoco afecta a replace-regexp).

16.10.4 Sustitución de Consultas

Alt-% cadena RETURN nueva-cadena RETURN
(M-% cadena RET nueva-cadena RET)

Sustituye algunas ocurrencias de cadena por nueva-cadena.

Ctrl-Alt-% nueva-cadena RETURN
(C-M-% expreg RET nueva-cadena RET)

Sustituye algunas coincidencias de expreg por nueva-cadena.

Si desea cambiar sólo algunas de las apariciones de foo por bar, y no todas, use M-% (query-replace). Este comando busca las apariciones de foo una a una, muestra cada una de ellas y le pregunta si desea sustituirla. Aparte de la consulta, query-replace funciona igual que replace-string (véase 16.10.1 Reemplazo Incondicional ). En particular, conserva mayúsculas y minúsculas siempre que case-replace no sea nulo, como suele ser el caso (consulte 16.10.3. Comandos de Reemplazo y Coincidencias Laxas). Un argumento numérico significa que sólo se tienen en cuenta las ocurrencias delimitadas por caracteres delimitadores de palabras. Un argumento prefijo negativo reemplaza hacia atrás.

C-M-% realiza una búsqueda y sustitución de expreg (query-replace-regexp). Funciona como replace-regexp, salvo que realiza consultas como query-replace.

Con estos comandos puede reutilizar sustituciones anteriores. Cuando query-replace o query-replace-regexp pide la cadena de búsqueda, use M-p y M-n para mostrar sustituciones anteriores en la forma desde -> a, donde desde es el patrón de búsqueda, a es su sustitución, y el separador entre ellos viene determinado por el valor de la variable query-replace-from-to-separator. Escriba RETURN (RET) para seleccionar el sustituto deseado. Si el valor de esta variable es nulo, las sustituciones no se añaden al historial de comandos y no pueden reutilizarse.

Estos comandos resaltan la coincidencia actual usando la cara query-replace. Puede desactivar este resaltado estableciendo la variable query-replace-highlight a nil. Resaltan otras coincidencias usando lazy-highlight al igual que la búsqueda incremental (ver 16.1 Búsqueda Incremental); esto puede desactivarse estableciendo query-replace-lazy-highlight a nil. Por defecto, query-replace-regexp mostrará la cadena de sustitución sustituida para la coincidencia actual en el minibúfer. Si desea mantener las secuencias especiales \& y \n sin expandir, personalice la variable query-replace-show-replacement. Al igual que search-highlight-submatches resalta las subexpresiones en la búsqueda incremental (consulte 16.12 Adaptar la Búsqueda a sus Necesidades), la variable query-replace-highlight-submatches define si se resaltan las subexpresiones en los comandos de sustitución expreg.

La variable query-replace-skip-read-only, si no es nula, hará que los comandos de reemplazo ignoren las coincidencias en texto de sólo lectura. El valor por defecto es no ignorarlas.

Los caracteres que puede escribir cuando se le muestre una coincidencia de cadena o expreg son:

SPACE (SPC)
y (y)

Sustituye la ocurrencia por nueva-cadena.

DEL
Delete
BACKSPACE
n n

Salta a la siguiente ocurrencia sin reemplazar la actual.

, (,, coma)

Reemplaza esta ocurrencia y muestra el resultado. A continuación, se le pide otro carácter de entrada para decirle qué hacer a continuación. Dado que el reemplazo ya se ha hecho, DEL y SPC son equivalentes en esta situación; ambos se mueven a la siguiente ocurrencia.

Puede teclear Ctrl-r (C-r) en este punto (ver más abajo) para alterar el texto reemplazado. También puede deshacer el reemplazo con el comando deshacer (por ejemplo, teclee Ctrl-x u ((C-x u); vea 17.1 Deshacer); esto sale de la consulta-reemplazo (termina el comando query-replace), así que si quiere hacer más reemplazos debe usar Ctrl-x ESCESCRETURN (C-x ESC ESC RET) para reiniciar (vea 9.6 Repetición de Comandos del Minibúfer).

RETURN (RET)
q (q)

Sale sin hacer más sustituciones.

. (., punto)

Reemplaza esta ocurrencia y luego sale sin buscar más ocurrencias.

! (!)

Reemplaza todas las ocurrencias restantes sin preguntar de nuevo.

^ (^)

Vuelve a la posición de la ocurrencia anterior (o de lo que solía ser una ocurrencia), en caso de que la haya cambiado por error o quiera volver a examinarla.

u (u)

Deshace la última sustitución y vuelve al punto en el que se realizó dicha sustitución.

U (U)

Deshace todas las sustituciones y vuelve al punto donde se realizó la primera.

Ctrl-r (C-r)

Entra en un nivel de edición recursiva, en caso de que la ocurrencia necesite ser editada en lugar de simplemente reemplazada por nueva-cadena. Cuando haya terminado, salga del nivel de edición recursiva con Ctrl-Alt-c (C-M-c) para pasar a la siguiente ocurrencia. Véase 46 Niveles de Edición Recursiva.

Ctrl-w (C-w)

Borra la aparición y, a continuación, se puede introducir un nivel de edición recursiva como con C-r. Use la edición recursiva para insertar texto para reemplazar la ocurrencia borrada de la cadena. Cuando termine, salga del nivel de edición recursiva con Ctrl-Alt-c (C-M-c) para proceder a la siguiente ocurrencia.

e (e`)

Edita la cadena de sustitución en el minibúfer. Cuando salga del minibúfer tecleando RETURN (RET), el contenido del minibúfer sustituirá a la aparición actual del patrón. También se convierten en la nueva cadena de sustitución para cualquier otra aparición.

E (E)

Es como e, pero el siguiente reemplazo se hará con mayúsculas y minúsculas exactas. Es decir, si tiene una query-replace (consulta-reemplazo) de foo a bar, un texto como Foo será normalmente reemplazado por Bar. Use este comando para hacer el reemplazo actual con mayúsculas y minúsculas exactas.

Ctrl-l (C-l)

Vuelve a mostrar la pantalla. A continuación, debe escribir otro carácter para especificar qué hacer con esta ocurrencia.

Y (Y, Upper-case)

Reemplaza todas las ocurrencias restantes en todos los otros búferes en reemplazos multibúfer (como el comando Dired Q que realiza reemplazos de consulta en archivos seleccionados). Responderá a esta pregunta y a todas las preguntas posteriores de la serie con un «yes» (si), sin más interacción por parte del Usuario.

N (N, upper-case)

Salta al búfer siguiente en sustituciones multibúfer sin sustituir las ocurrencias restantes en el búfer actual. Responda «no» a esta pregunta, no hace preguntas sobre el búfer actual y continúa con el siguiente búfer de la secuencia.

Ctrl-h (C-h)
? (?)
F1 (F1)

Muestra un mensaje que resume estas opciones. A continuación, debe escribir otro carácter para especificar qué hacer con esta ocurrencia.

Aparte de esto, cualquier otro carácter sale de la consulta-reemplazo (query-replace) y se vuelve a leer como parte de una secuencia de teclas. De este modo, si escribe Ctrl-k (C-k), sale de la consulta-reemplazo y pasa al final de la línea. En particular, C-g simplemente sale de la consulta-reemplazo.

Para reiniciar una consulta-reemplazo una vez que se ha salido, utilice Ctrl-x ESCESC (C-x ESC ESC), que repite la consulta-reemplazo porque ha utilizado el minibúfer para leer sus argumentos. Véase 9.6 Repetición de Comandos del Minibúfer.

La opción search-invisible (búsqueda-invisible) determina cómo query-replace trata el texto invisible. Véase Búsqueda de Contornos en 26.9.4 Comandos de Visibilidad del Modo Esquema.

Véase 31.7 Operar con Archivos, para el comando Q de Dired que realiza el reemplazo por consulta en los archivos seleccionados. Véase también 31.10 Transformación de Nombres de Archivos en Dired, para los comandos de Dired para renombrar, copiar o enlazar archivos reemplazando las coincidencias expreg en los nombres de archivos.

16.11. Otros Comandos de Búsqueda y Bucle

A continuación se muestran otros comandos que buscan coincidencias para expresiones regulares (expreg). Todos ellos ignoran mayúsculas y minúsculas en la búsqueda, si el patrón no contiene letras mayúsculas y la búsqueda de mayúsculas y minúsculas no es nula. Aparte de multi-occur y multi-occur-in-matching-búfers, que siempre buscan en todo el búfer, todos los comandos operan en el texto desde el punto hasta el final del búfer, o en la región si está activa.

Alt-s multi-isearch-buffer (M-x multi-isearch-buffer)

Pregunta por uno o más nombres de búferes, terminando con RETURN (RET); luego, comienza una búsqueda incremental multi-búfer en esos búferes. (Si la búsqueda falla en un búfer, el siguiente C-s intenta buscar en el siguiente búfer especificado, y así sucesivamente). Con un argumento de prefijo, solicita una expresión regular y comienza una búsqueda incremental en varios búferes que coincidan con dicha expresión.

Alt-x multi-isearch-buffers-regexp (M-x multi-isearch-buffers-regexp)

Este comando es igual que multi-isearch-búfers (multi-búsqueda-búfers), excepto que realiza una búsqueda de expresión regular incremental.

Alt-x multi-isearch-files (M-x multi-isearch-files)

Solicita uno o más nombres de archivos, terminados en RETURN (RET); a continuación, inicia una búsqueda incremental de varios archivos en ellos. (Si la búsqueda falla en un archivo, el siguiente C-s intenta buscar en el siguiente archivo especificado, y así sucesivamente). Con un argumento de prefijo, solicita una expresión regular y comienza una búsqueda incremental en varios archivos que coincidan con dicha expresión.

Alt-x multi-isearch-files-regexp (M-x multi-isearch-files-regexp)

Este comando es igual que multi-isearch-files, excepto que realiza una búsqueda incremental de expresiones regulares (expreg).

En algunos modos que establecen la variable local de búfer multi-isearch-next-búfer-function (por ejemplo, en el modo Change Log) se activa automáticamente una búsqueda incremental de varios archivos.

Alt-x occur (M-x occur)
Alt-s o (M-s o)

Solicita una expresión regular (expreg) y muestra una lista con cada línea del búfer que contiene una coincidencia. Si escribe Alt-n (M-n) en el indicador, puede reutilizar las cadenas de búsqueda de búsquedas incrementales anteriores. El texto coincidente se resalta con la cara de coincidencia. Un argumento numérico n especifica que se deben mostrar n líneas de contexto antes y después de cada línea coincidente.

El número predeterminado de líneas de contexto se especifica mediante la variable list-matching-lines-default-context-lines. Cuando list-matching-lines-jump-to-current-line es distinto de cero, la línea actual se muestra resaltada con la cara list-matching-lines-current-line-face y el punto se establece en la primera coincidencia después de dicha línea.

También puede ejecutar M-s o cuando está activa una búsqueda incremental; esto utiliza la cadena de búsqueda actual.

Tenga en cuenta que las coincidencias para la expresión regular (expreg) que escriba se extienden para incluir líneas completas, y una coincidencia que comienza antes de que termine la coincidencia anterior no se considera una coincidencia.

El búfer *Occur* usa el modo Occur como modo principal. Puede utilizar las teclas n y p para desplazarse a la coincidencia siguiente o anterior; con argumento numérico prefijo, estos comandos desplazan esa cantidad de coincidencias. Las teclas numéricas están ligadas al argumento numérico, por lo que 5n (5 n) se mueve a la quinta coincidencia siguiente (no tiene que teclear Ctrl-u (C-u)). SPACE (SPC) y DEL desplazan el búfer *Occur* hacia arriba y hacia abajo. Al hacer clic en una coincidencia o mover el punto allí y escribir RETURN (RET) se visita la posición correspondiente en el búfer original que se buscó. o y C-o muestran la coincidencia en otra ventana; C-o no selecciona esa ventana. Alternativamente, puede usar el comando Alt-g Alt-n (M-g M-n, next-error) para visitar las ocurrencias una a una (ver 28.2 Modo Compilación). Finalmente, q (q) sale de la ventana que muestra el búfer *Occur* y entierra el búfer.

Tecleando e (e) en el búfer *Ocurr* hace que el búfer sea escribible y entra en el modo Occur Edit, en el que puede editar las líneas coincidentes y hacer que esas ediciones se reflejen en el texto del búfer de origen. Teclee Ctrl-c Ctrl-c (C-c C-c) para salir del modo Occur Edit y volver al modo Occur.

El comando M-x list-matching-lines es un sinónimo de M-x occur.

Alt-x multi-occur (M-x multi-occur)

Este comando es igual que occur, excepto que es capaz de buscar a través de múltiples búferes. Le pide que especifique los nombres de los búferes uno por uno.

Alt-x multi-occur-in-matching-buffers (M-x multi-occur-in-matching-buffers)

Este comando es similar a multi-occur, excepto que los búferes a buscar se especifican mediante una expresión regular que coincide con los nombres de archivos visitados. Con un argumento de prefijo, usa la expresión regular para coincidir con los nombres de los búferes.

Alt-x how-many (M-x how-many)

Pide una expresión regular e imprime el número de coincidencias en el búfer después del punto. Si la región está activa, esto opera en la región en su lugar.

Alt-x flush-lines (M-x flush-lines)

Cuando el comando termina, imprime el número de líneas coincidentes borradas.

Este comando borra la línea actual si contiene una coincidencia que empiece después del punto. Si la región está activa, opera sobre la región en su lugar; si una línea parcialmente contenida en la región contiene una coincidencia totalmente contenida en la región, se borra.

Si una coincidencia se divide en varias líneas, flush-lines borra todas esas líneas. Elimina las líneas antes de empezar a buscar la siguiente coincidencia; por lo tanto, ignora una coincidencia que empiece en la misma línea en la que terminó otra coincidencia.

Alt-x keep-lines (M-x keep-lines)

Solicita una expresión regular (expreg) y borra cada línea que no contenga una coincidencia, operando en el texto después del punto. Si el punto no está al principio de una línea, este comando siempre mantiene la línea actual. Si la región está activa, el comando opera sobre la región en su lugar; nunca borra las líneas que sólo están parcialmente contenidas en la región (una nueva línea que termina una línea cuenta como parte de esa línea).

Si una coincidencia se divide en varias líneas, este comando conserva todas esas líneas.

Alt-x matching-lines (M-x kill-matching-lines)

Como flush-lines, pero también añade las líneas coincidentes al anillo de muertes. El comando añade las líneas coincidentes al anillo de muestres como una sola cadena, incluyendo las nuevas líneas que las separan.

Alt-x copy-matching-lines (M-x copy-matching-lines)

Como kill-matching-lines, pero las líneas coincidentes no se eliminan del búfer.

16.12 Adaptar la Búsqueda a sus Necesidades

En esta sección se describen diversas personalizaciones relacionadas con la búsqueda que no se han descrito en otros apartados.

El modo de búsqueda por defecto para la búsqueda incremental se especifica mediante la variable search-default-mode. Puede ser nil, t o una función. Si es nil, el modo por defecto es hacer búsquedas literales sin plegar (desdoblar) caracteres, pero con plegar mayúsculas/minúsculas y coincidencias lax-whitespace determinadas por case-fold-search y search-whitespace-regexp, respectivamente (véase 16.9. Coincidencia Laxa Durante la Búsqueda). Si el valor es t, la búsqueda incremental se realiza por defecto mediante búsquedas de expreg. El valor predeterminado especifica una función que sólo realiza el plegado (o desdoblamiento) de mayúsculas y minúsculas y la concordancia lax-whitespace.

La coincidencia actual de una búsqueda incremental en curso se resalta usando la cara isearch. Este resaltado puede desactivarse estableciendo la variable search-highlight en nil.

Cuando se buscan expresiones regulares (por ejemplo con C-M-s), las subexpresiones reciben un resaltado especial dependiendo de la variable search-highlight-submatches. Si el valor de esta variable es nulo, no se realiza ningún resaltado especial, pero si el valor es distinto de nulo, el texto que coincida con construcciones \( ... \) (también conocidas como «subexpresiones») en la expresión regular se resaltará con caras distintas. Por defecto, se definen dos caras distintas, denominadas isearch-group-1 e isearch-group-2. Con estas dos caras, las subexpresiones impares se resaltarán usando la cara isearch-group-1 y las subexpresiones pares se resaltarán usando la cara isearch-group-2. Por ejemplo, al buscar foo-\([0-9]+\)\([a-z]+\), la parte coincidente con [0-9]+ se resaltará con la cara isearch-group-1, y la parte coincidente con [a-z]+ se resaltará con isearch-group-2. Si define caras adicionales utilizando el mismo esquema de numeración, es decir, isearch-group-3, isearch-group-4, …, la cara isearch-group-M se utilizará para resaltar la Mnésima, N+MN/ésima, 2N+MNésima, … subexpresiones, donde N es el número total de caras de la forma isearch-group-M.

Las demás coincidencias de la cadena de búsqueda visibles en pantalla se resaltan mediante la cara lazy-highlight. Establecer la variable isearch-lazy-highlight a nil desactiva este resaltado. Aquí hay otras variables que personalizan el resaltado difuso:

lazy-highlight-initial-delay

Tiempo en segundos que se debe esperar antes de resaltar las coincidencias visibles. Sólo se aplica si la cadena de búsqueda tiene menos de caracteres que lazy-highlight-no-delay-length.

lazy-highlight-no-delay-length

Para cadenas de búsqueda al menos tan largas como el valor de esta variable, el resaltado más lento de las coincidencias comienza inmediatamente.

lazy-highlight-interval

Tiempo en segundos entre el resaltado de coincidencias sucesivas.

lazy-highlight-max-at-a-time

El número máximo de coincidencias a resaltar antes de comprobar la entrada. Un número grande puede tardar algún tiempo en resaltarse, así que si quiere continuar buscando y teclee C-s o C-r durante ese tiempo, Emacs no responderá hasta que termine de resaltar todas esas coincidencias. Por lo tanto, valores más pequeños hacen que Emacs responda mejor.

isearch-lazy-count

Muestra el número actual de coincidencias y el número total de coincidencias en la consulta de búsqueda.

lazy-count-prefix-format
lazy-count-suffix-format Estas dos variables determinan el formato de mostrar el número actual y total de coincidencias para isearch-lazy-count.

Normalmente, al teclear RETURN (RET) dentro de la búsqueda incremental cuando la cadena de búsqueda está vacía, se lanza una búsqueda no incremental. (En realidad, le permite editar la cadena de búsqueda y el siguiente RETURN realiza la búsqueda). Sin embargo, si personaliza la variable search-nonincremental-instead a nil, al teclear RETURN siempre se saldrá de la búsqueda incremental, aunque la cadena de búsqueda esté vacía.

Por defecto, los comandos de búsqueda incremental y consulta-reemplazo (query-replace) coinciden con el texto invisible, pero ocultan dichas coincidencias en cuanto la coincidencia actual se desplaza fuera del texto invisible. Si personaliza la variable isearch-hide-immediately a nil, cualquier texto invisible en el que se hayan encontrado coincidencias permanecerá en pantalla hasta que finalice la búsqueda o termine la ejecución el comando replace.

La búsqueda incremental en terminales lentos, como las pantallas conectadas a máquinas remotas a través de una conexión lenta, puede resultar molesta debido a la necesidad de redibujar grandes partes de la pantalla a medida que avanza la búsqueda. Emacs proporciona un modo de visualización especial para terminales lentos, mediante el cual la búsqueda abre una pequeña ventana separada y muestra el texto que rodea a la coincidencia en esa ventana. Las ventanas pequeñas se muestran más rápido, por lo que se alivia el molesto efecto de la velocidad lenta. La variable search-slow-speed determina el umbral de velocidad en baudios por debajo del cual Emacs usará este modo de visualización. La variable search-slow-window-lines controla el número de líneas de la ventana que Emacs abre para mostrar los resultados de la búsqueda; por defecto es 1 línea. Normalmente, esta ventana aparecerá en la parte inferior de la ventana que muestra el búfer donde se inicia la búsqueda, pero si el valor de search-slow-window-lines es negativo, significa que se pondrá la ventana en la parte superior y se le dará el número de líneas que sea el valor absoluto de search-slow-window-lines.


© Derechos de autor 2023, Tano.

Compilado con Sphinx usando un tema proporcionado por Read the Docs.
</html>