Una de las funciones más importantes de cualquier editor es la de buscar y sustituir texto de una manera eficiente y sencilla para el usuario. Otros editores más gráficos despliegan un diálogo modal con un campo de edición donde escribir lo que buscamos y por qué debemos reemplazarlo. Emacs para eso tiene el minibuffer. Los comandos más utilizados, podríamos decir: los más básicos, son C-s ( isearch-forward ) y C-r ( isearch-backward ). Al invocarlos nos pedirá que introduzcamos una cadena en el minibuffer y veremos cómo el cursor va saltando a la siguiente ─o la anterior, según el comando─ cadena en el buffer que se corresponda con lo buscado. Como el movimiento se aprende andando, vamos a verlo buscando algo, como por ejemplo:

Pulsa la combinación C-s , fíjate que el área de prompt muestra la cadena I-search: . Pulsa una s , fíjate que el cursor salta a la siguiente «s» del buffer y muestra todas las eses marcadas. Pulsa una o , fíjate de nuevo, que salta a la siguiente ocurrencia de «so» y marca todas las coincidencias. Pulsa una l . De nuevo el cursor salta a la primera aparición de la palabra «sol» y marca las otras ocurrencias.

Pulsa C-g para anular la búsqueda... el cursor vuelve donde estaba ¿Por qué? ¿Qué ha pasado? Este es uno de los casos en que la posición del punto no sigue al cursor. Tenlo en cuenta si lo que haces es buscar una cadena en particular para moverte hasta allí, tienes que forzar que se desplace el punto una vez encuentres el sitio, simplemente moviendo el cursor con C-b o C-f o con las teclas de cursor, en el área de eco nos dirá Mark saved where search started.

Podemos reanudar la última búsqueda. Ahora si pulsamos C-s C-s , vemos que reaparece «sol» en el espacio y salta a la siguiente aparición de la cadena. Por supuesto, los mismos pasos son correctos para una búsqueda hacia atrás, pero con la combinación C-r . Además, si ahora pulsamos C-r C-r , Emacs asumirá que la cadena guardada para la última búsqueda: «sol», es la adecuada para buscar hacia atrás. Si un término no se encuentra el mensaje del prompt será Failing I-Search: y nos dará opción a modificar la cadena de búsqueda que estamos utilizando.

Además de esa búsqueda simple, podemos utilizar también otra búsqueda más compleja y completa mediante expresiones regulares pulsando C-M-s y C-M-r . Si no sabes qué son las expresiones regulares no te preocupes, seguramente no las necesitarás para el trabajo que puedas hacer con Emacs, pues son cosas más útiles para programadores. Si sí sabes qué son y te interesa el tema, busca en la ayuda ( C-h r ) el apartado sobre regexp search y recuerda que puedes alternar entre una búsqueda regexp y no-regexp pulsando la combinación M-s ó M-s r ( isearch-toggle-regexp ).

Sin embargo, aunque la búsqueda es importante, es más potente la sustitución. Igual que con la acción de buscar, la acción de sustituir también cuenta con su versión compleja mediante regexp , que no voy a contar aquí, porque la mayoría de los usuarios apenas las utilizamos.

Si buscamos modos de reemplazar una cadena en un texto en la ayuda, seguramente tropecemos con el comando replace-string . Está muy bien, porque eso reemplaza una cadena por otra... pero sólo una vez. Eso es suficiente en muchas ocasiones, sin embargo, es habitual que esa sustitución deba repetirse por todo el texto, para lo cual es más útil el comando M-% ( query-replace ). Realiza los siguientes pasos:

Ve al principio del buffer primer-texto.org pulsando la combinación M-< . Pulsa la tecla M-% y aparecerá en el área de prompt el mensaje: Query replace. Escribe la cadena «sol» (como verás ahora el cursor se mantiene situado en el mismo sitio. Al pulsar <RET> preguntará Query replace sol with. Teclea «luna» y verás que al pulsar <RET> ha saltado a la primera aparición de la cadena «sol» Pulsa y y verás cómo se sustituye «sol» por «luna» y saltará a la siguiente ocurrencia.

Así podremos saltar de una ocurrencia a otra pulsando y cuando queremos sustituir y n cuando no. Si queremos sustituir todas las apariciones sin que pregunte más, pulsaremos ! . Si lo que queremos es que deje de buscar pulsaremos q o si lo que queremos es que haga esta última sustitución y salga, utilizaremos el .

Existen más teclas, como la posibilidad de arrepentirte de todas las sustituciones con U o de la última con u , pero son menos frecuentes y es mejor que las consultes en la ayuda.

También hay que recordar que:

las sustituciones pueden modificar la posición del punto, no como la mera búsqueda, que como hemos visto antes sólo movía el cursor, y no hay sustituciones hacia atrás, por lo que si quieres realizar un query-replace te aconsejo que antes vayas al principio del buffer.

¿Qué tal si practicas un poco la sustitución? Estamos toqueteando un fichero de pruebas, siéntete libre de torturarlo hasta hacerlo incomprensible.