12 La marca y la región
Emacs, como muchas otras aplicaciones, le permite seleccionar alguna parte arbitraria del texto del buffer e invocar comandos que operan sobre dicho texto seleccionado. En Emacs, llamamos región al texto seleccionado; su manejo es muy similar al del texto seleccionado en otros programas, pero también hay diferencias importantes.
La región es la porción del buffer entre la marca y la posición actual del punto. Puede definir una región colocando la marca en algún lugar (por ejemplo, con el comando C-SPC
) y moviendo el punto hasta donde desee que termine la región. (O puede usar el ratón para definir una región).
La región siempre se extiende entre el punto y la marca, independientemente de cuál de ellos se encuentre antes en el texto; cada vez que mueve el punto, la región cambia.
Al colocar la marca en una posición del texto, ésta se activa. Cuando la marca está activa, decimos también que la región está activa; Emacs indica su extensión resaltando el texto dentro de ella, usando la cara de la region
(ver 50.1.5. Personalización de Caras).
Después de ciertos comandos que no son de movimiento, incluyendo cualquier comando que cambie el texto en el buffer, Emacs desactiva automáticamente la marca; esto apaga el resaltado. También puede desactivar explícitamente la marca en cualquier momento, tecleando Ctrl-g (C-g
) (véase 51 Salir y Abortar).
Muchos comandos limitan el texto sobre el que actúan a la región activa. Por ejemplo, el comando Alt-% (M-%
) (que reemplaza el texto coincidente) normalmente funciona en toda la porción accesible del buffer, pero si tiene una región activa, funcionará sólo en esa región.
La marca es útil aunque no esté activa. Por ejemplo, puede desplazarse a ubicaciones de marcas anteriores usando el anillo de marcas. Véase 12.4 El Anillo de Marcas. Además, algunos comandos tendrán efecto incluso en una región inactiva (por ejemplo, upcase-region). También puede reactivar la región con comandos como Ctrl-x Ctrl-x (C-x C-x
).
El comportamiento anterior, que es el predeterminado en las sesiones interactivas, se conoce como modo Marca Transitoria. Deshabilitando el modo de Marca Transitoria cambia Emacs a un comportamiento alternativo, en el que la región normalmente no está resaltada. Véase 12.6 Selección mediante Mayúsculas (Shift).
Establecer la marca en un buffer no tiene efecto en las marcas de otros buffers. Cuando vuelva a un búfer con una marca activa, la marca estará en el mismo lugar que antes. Cuando varias ventanas muestran el mismo búfer, pueden tener diferentes valores de punto y, por tanto, diferentes regiones, pero todas comparten una posición de marca común. Véase 21 Varias Ventanas. Normalmente, sólo la ventana seleccionada resalta su región; sin embargo, si la variable highlight-nonselected-windows
es distinta de nil
, cada ventana resalta su propia región.
Existe otro tipo de región: la región rectangular. Véase 13.5 Rectángulos.
12.1 Fijar la Marca
A continuación se indican algunos comandos para fijar la marca:
Ctrl-SPACE (C-SPC
)
Coloca la marca en el punto y la activa (
set-mark-command
).
Ctrl-@ (C-@
)
Lo mismo que el anterior.
Ctrl-x Ctrl-x (C-x C-x
)
Coloca la marca en el punto y la activa; a continuación, mueve el punto donde estaba la marca (
exchange-point-and-mark
).
- Arrastrar con
ratón-1
Establece el punto y la marca alrededor del texto que arrastra.
ratón-3
Coloca la marca en el punto y, a continuación, desplaza el punto al lugar en el que hace clic (
mouse-save-then-kill
).- Desplazar con Teclas de Movimiento del Cursor
Fija la marca en el punto si la marca está inactiva, luego mueve el punto. Véase 12.6 Selección mediante Mayúsculas (Shift).
La forma más común de fijar la marca es con C-SPC
(set-mark-command
) [5]. Esto fija la marca donde está el punto, y la activa. A continuación, puede mover el punto, dejando la marca detrás.
Por ejemplo, supongamos que desea convertir parte del búfer a mayúsculas. Para ello, vaya a un extremo del texto deseado, escriba Ctrl-SPACE (C-SPC
) y mueva el punto hasta que la parte deseada del texto quede resaltada. Ahora teclee Ctrl-x Ctrl-u (C-x C-u
, upcase-region
, región de mayúsculas). Esto convierte el texto de la región a mayúsculas y desactiva la marca.
Siempre que la marca esté activa, puede desactivarla tecleando Ctrl-g (C-g
) (véase 51 Salir y Abortar). La mayoría de los comandos que operan sobre la región también desactivan automáticamente la marca, como C-x C-u
en el ejemplo anterior.
En lugar de activar la marca para operar en una región, también puede usarla para recordar una posición en el buffer (tecleando Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC
)), y más tarde saltar de nuevo allí (tecleando Ctrl-u Ctrl-SPACE (C-u C-SPC
)). Véase 12.4 El Anillo de Marcas, para más detalles.
El comando Ctrl-x Ctrl-x (C-x C-x
, exchange-point-and-mark
) intercambia las posiciones del punto y la marca. Ctrl-x Ctrl-x (C-x C-x
) es útil cuando está satisfecho con la posición del punto pero desea mover el otro extremo de la región (donde está la marca). Si es necesario, al usar C-x C-x
por segunda vez, la marca se coloca en la nueva posición y el punto vuelve a su posición original. Normalmente, si la marca está inactiva, este comando reactiva primero la marca donde se fijó por última vez, para asegurarse de que la región queda resaltada. Sin embargo, si lo llama con un argumento prefijo, deja la marca inactiva y la región sin resaltar; puede usarlo para saltar a la marca de forma similar a C-u C-SPC
.
También puede fijar la marca con el ratón. Si pulsa el botón izquierdo del ratón (down-mouse-1
) y arrastra el ratón a través de un rango de texto, esto establece la marca donde pulsó por primera vez el botón del ratón y pone el punto donde lo suelta. Alternativamente, pulsar el botón derecho del ratón (mouse-3
, ratón-3) fija la marca en el punto y luego mueve el punto al lugar donde pulsó. Para una descripción más detallada de estos comandos del ratón, véase 22.1 Comandos del Ratón para Edición.
Por último, puede fijar la marca manteniendo pulsada la tecla Mayús (Shift) mientras escribe determinados comandos de movimiento del cursor (como S-DERECHA
(Shift-→), S-C-f
(Shift-Ctrl-f), S-C-n
(Shift-Ctrl-n), etc.). Esto se denomina selección de mayúsculas. Establece la marca en el punto antes de mover el punto, pero sólo si no hay ninguna marca activa establecida mediante una selección de mayúsculas anterior o comandos del ratón. La marca establecida por comandos del ratón y por la selección con mayúsculas se comporta de forma ligeramente diferente a la marca habitual: cualquier comando de movimiento del cursor sin mayúsculas posterior la desactiva automáticamente. Para más detalles, consulte 12.6 Selección mediante Mayúsculas (Shift).
Muchos comandos que insertan texto, como Ctrl-y (C-y
, yank
), fijan la marca en el otro extremo del texto insertado, sin activarla. Esto le permite volver fácilmente a esa posición (véase 12.4 El Anillo de Marcas). Puede saber que un comando hace esto cuando muestra Mark set
(Marca fijada) en el área de eco.
En X, cada vez que la región activa cambia, Emacs guarda el texto de la región en la selección primaria. Esto le permite insertar ese texto en otras aplicaciones X haciendo clic con ratón-2
. Ver 13.3.2 Cortar y Pegar con Otras Aplicaciones de Ventana.
12.2 Comandos para Marcar Objetos Textuales
Estos son los comandos para colocar el punto y la marca alrededor de un objeto textual, como una palabra, una lista, un párrafo o una página:
Alt-@ (M-@
)
Coloca la marca al final de la palabra siguiente (
mark-word
). Esto no mueve el punto.
Ctrl-Alt-@ (C-M-@
)
Marca el final de la siguiente expresión compuesta (
mark-sexp
). Esto no mueve el punto.
Alt-h (M-h
)
Mueve el punto al principio del párrafo actual, y fija la marca al final (
mark-paragraph
).
Ctrl-Alt h (C-M-h
)
Mueve el punto al principio de la definición de función actual y fija la marca al final (
mark-defun
).
Ctrl-x Ctrl-p (C-x C-p
)
Mueve el punto al principio de la página actual, y fija la marca al final (
mark-page
).
Ctrl-x h (C-x h
)
Mueve el punto al principio del buffer, y fija la marca al final (
mark-whole-buffer
).
M-@
, (mark-word
, marcar palabra) coloca la marca al final de la palabra siguiente (véase 26.1 Palabras, para obtener información sobre las palabras). Las invocaciones repetidas de este comando amplían la región haciendo avanzar la marca una palabra cada vez. Como excepción, si la marca está activa y situada antes del punto, M-@
desplaza la marca hacia atrás desde su posición actual una palabra cada vez.
Este comando también acepta un argumento numérico n, que le indica que avance la marca n palabras. Un argumento negativo -n hace retroceder la marca n palabras.
Del mismo modo, C-M-@
(marca-sexp
) coloca la marca al final de la siguiente expresión equilibrada (véase 27.4.1 Expresiones con Paréntesis Equilibrados). Las invocaciones repetidas extienden la región a expresiones posteriores, mientras que los argumentos numéricos positivos o negativos desplazan la marca hacia delante o hacia atrás el número de expresiones especificado.
Los demás comandos de la lista anterior establecen tanto el punto como la marca, para delimitar un objeto en el búfer. M-h
(mark-paragraph
) marca párrafos (véase véase 26.4 Páginas), C-M-h
(mark-defun
) marca definiciones de nivel superior (véase 27.2 Definiciones de Nivel Superior, o Defuns), y C-x C-p
(mark-page
) marca páginas. Las invocaciones repetidas juegan de nuevo el mismo papel, extendiendo la región a objetos consecutivos; de forma similar, los argumentos numéricos especifican por cuántos objetos mover la marca.
C-x h
(mark-whole-buffer
) establece todo el buffer como región, poniendo el punto al principio y la marca al final.
12.3 Operar en la Región
Una vez que tenga una región, aquí tiene algunas formas de operar sobre ella:
Matar con Ctrl-w (
C-w
, ver 13 Matar y Mover Texto).Copiar en el anillo de muerte con Alt-w (
M-w
, vea 13.2 Tirar de un Texto).Convertir mayúsculas y minúsculas con Ctrl-x Ctrl-l (
C-x C-l
) o Ctrl-x Ctrl-u (C-x C-u
) (ver 26.7. Comandos de Conversión de Mayúsculas y Minúsculas).Deshacer los cambios en su interior con Ctrl-u Ctrl-:kbd`/` (
C-u C-/
, ver 17.1 Deshacer).Reemplazar texto con Alt-% (
M-%
, ver 16.10.4 Sustitución de Consultas).Aplicar sangría con Ctrl-x TAB (
C-x TAB
) o Ctrl-Alt-\ (C-M-\
, ver 25 Indentación).Rellenar como texto con Alt-x (
M-x
)fill-region
(véase 26.6 Rellenar Texto).Comprobar la ortografía de las palabras que contiene con Alt-$ (
M-$
, consulte 17.4 Comprobar y Corregir la Ortografía).Evaluar como código Lisp con
M-x
eval-region
(vea 28.9. Evaluación de Expresiones Emacs Lisp).Guardar en un registro con Ctrl-x rs (
C-x r s
, vea 14 Registros).Guardarlo en un buffer o en un fichero (vea 13.4 Acumular Texto).
Algunos comandos tienen un comportamiento por defecto cuando la marca está inactiva, pero operan en la región si la marca está activa. Por ejemplo, M-$
(ispell-word
) normalmente comprueba la ortografía de la palabra en el punto, pero comprueba el texto en la región si la marca está activa (véase 17.4 Comprobar y Corregir la Ortografía). Normalmente, estos comandos utilizan su comportamiento por defecto si la región está vacía (es decir, si la marca y el punto están en la misma posición). Si desea que operen en la región vacía, cambie la variable use-empty-active-region
a t
.
Como se describe en 8.3 Borrar Texto Borrar texto, los comandos DEL
(backward-delete-char
) y Delete
(delete-forward-char
) también actúan de esta forma. Si la marca está activa, borran el texto de la región. (Como excepción, si proporciona un argumento numérico n, donde n no es uno, estos comandos borran n caracteres independientemente de si la marca está activa). Si cambia la variable delete-active-region
a nil
, estos comandos no actuarán de forma diferente cuando la marca esté activa. Si cambia el valor a kill (matar), estos comandos matan la región en lugar de borrarla (véase 13 Matar y Mover Texto).
Otros comandos operan siempre sobre la región y no tienen un comportamiento predeterminado. Estos comandos suelen llevar la palabra región en sus nombres, como C-w
(kill-region
) y C-x C-u
(upcase-region
). Si la marca está inactiva, actúan sobre la región inactiva, es decir, sobre el texto situado entre el punto y la posición en la que se estableció la marca por última vez (véase 12.1 Fijar la Marca). Para desactivar este comportamiento, cambie la variable mark-even-if-inactive
a nil
. Entonces estos comandos señalarán un error si la marca está inactiva.
Por defecto, la inserción de texto se produce normalmente incluso si la marca está activa; por ejemplo, al escribir a se inserta el carácter a
y, a continuación, se desactiva la marca. El modo Borrar selección (Delete Selection mode), un modo secundario, modifica este comportamiento: si activa este modo, la inserción de texto mientras la marca está activa hace que el texto de la región se borre primero. Sin embargo, puede ajustar este comportamiento personalizando la opción delete-selection-temporary-region
(borrar-selección-región-temporal). Su valor predeterminado es nil
, pero puede establecerlo en t
, en cuyo caso sólo se reemplazarán las regiones temporalmente activas: las que se establezcan arrastrando el ratón (véase 12.1 Fijar la Marca) o mediante selección con Mayúsculas (véase 12.6 Selección mediante Mayúsculas (Shift)), así como mediante Ctrl-u Ctrl-x Ctrl-x (C-u C-x C-x
) cuando el Modo de Marca Transitoria esté desactivado. Puede ajustar aún más el comportamiento estableciendo delete-selection-temporary-region
en selection
: entonces no se reemplazarán las regiones temporales mediante C-u C-x C-x
, sino sólo las activadas al arrastrar el ratón o mediante shift-selection. Para activar o desactivar el modo Eliminar selección (Delete Selection mode), escriba M-x delete-selection-mode
.
12.4 El Anillo de Marcas
Cada búfer recuerda las ubicaciones anteriores de la marca, en el anillo de marcas. Los comandos que fijan la marca también empujan la marca anterior a este anillo. Uno de los usos del anillo de marcas es recordar puntos a los que puede querer volver.
Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC
)
Coloca la marca, empujándola sobre el anillo de marca, sin activarla.
Ctrl-u Ctrl-SPACE (C-u C-SPC
)
Mueve el punto a donde estaba la marca y restaure la marca del anillo de marcas anteriores.
El comando C-SPC C-SPC
es útil cuando se quiere usar la marca para recordar una posición a la que se desea volver. Empuja el punto actual al anillo de marca, sin activar la marca (lo que haría que Emacs resaltara la región). En realidad se trata de dos invocaciones consecutivas de C-SPC
(set-mark-command
); la primera C-SPC
activa la marca, y la segunda C-SPC
la desactiva. (Cuando el modo de marca transitoria (Transient Mark mode) está desactivado, C-SPC C-SPC
activa en su lugar el modo de marca transitoria temporalmente; véase 12.7 Desactivar el Modo de Marca Transitoria).
Para volver a una posición marcada, use set-mark-command
con un argumento prefijo: C-u C-SPC
. Esto mueve el punto a donde estaba la marca, y desactiva la marca si estaba activa. Cada C-u C-SPC
posterior salta a una posición anterior almacenada en el anillo de marcas. Las posiciones por las que se desplaza de este modo no se pierden; van al final del anillo.
Si establece set-mark-command-repeat-pop
como no nulo, inmediatamente después de escribir C-u C-SPC
, puede escribir C-SPC
en lugar de C-u C-SPC
para recorrer el anillo de marcas. Por defecto, set-mark-command-repeat-pop
es nil
.
Cada búfer tiene su propio anillo de marcas. Todos los comandos de edición utilizan el anillo de marcas del búfer actual. En particular, C-u C-SPC
siempre permanece en el mismo búfer.
La variable mark-ring-max
especifica el número máximo de entradas a mantener en el anillo de marcas. Por defecto es de 16 entradas. Si existen tantas entradas y se introduce otra, se descarta la más antigua de la lista. Repitiendo C-u C-SPC
hace un ciclo a través de las posiciones actualmente en el anillo.
Si desea volver al mismo lugar una y otra vez, puede que el anillo de marcas no sea lo suficientemente práctico. Si es así, puede grabar la posición en un registro para recuperarla más tarde (consulte 14.1 Guardar Posiciones en Registros).
12.5 El Anillo de Marcas Global
Además del anillo de marcas ordinario que pertenece a cada búfer, Emacs tiene un único anillo de marcas global. Cada vez que establezca una marca, ésta se registra en el anillo de marcas global además del propio anillo de marcas del búfer actual, si ha cambiado de búfer desde el anterior ajuste de marca. Por lo tanto, el anillo de marca global registra una secuencia de memorias intermedias en las que ha estado y, para cada memoria intermedia, un lugar en el que ha establecido la marca. La longitud del anillo de marca global está controlada por global-mark-ring-max
, y es 16 por defecto.
El comando Ctrl-x Ctrl-SPACE (C-x C-SPC
, pop-global-mark
) salta al búfer y a la posición de la última entrada en el anillo global. También gira el anillo, de modo que los usos sucesivos de C-x C-SPC
le llevan a búferes y posiciones de marca anteriores.
12.6 Selección mediante Mayúsculas (Shift)
Si mantiene pulsada la tecla Shift mientras escribe un comando de movimiento del cursor, se establece la marca antes de mover el punto, de modo que la región se extiende desde la posición original del punto hasta su nueva posición. Esta función se denomina selección con Mayúsculas (shift-selection). Es similar a la forma en que se selecciona texto en otros editores.
La marca establecida a través de la selección de Mayúsculas se comporta de forma un poco diferente a la descrita anteriormente. En primer lugar, además de las formas habituales de desactivar la marca (como cambiar el texto del búfer o teclear Ctrl-g (C-g
)), la marca se desactiva con cualquier comando de movimiento del cursor sin desplazamiento. En segundo lugar, cualquier comando de movimiento del cursor desplazado posterior evita volver a activar la marca. Por lo tanto, una serie de comandos de movimiento del cursor desplazado ajustará continuamente la región.
La selección mediante mayúsculas sólo funciona si la tecla de movimiento del cursor desplazado no está asociada a un comando independiente (véase 50 Personalización). Por ejemplo, si vincula Shift-Ctrl-f (S-C-f
) a otro comando, al teclear Shift-Ctrl-f se ejecutará ese comando en lugar de realizar una versión de Ctrl-f (C-f
, forward-char
) con selección de mayúsculas.
Una marca establecida mediante comandos del ratón se comporta igual que una marca establecida mediante la selección por desplazamiento (véase 12.1 Fijar la Marca). Por ejemplo, si especifica una región arrastrando el ratón, puede seguir ampliando la región mediante comandos de movimiento del cursor desplazado. En ambos casos, cualquier comando de movimiento del cursor sin desplazamiento desactiva la marca.
Para desactivar la selección por mayúsculas, establezca el modo shift-select-mode
(modo selección por desplazamiento) en nil
. Al hacerlo, no se desactiva el establecimiento de la marca mediante comandos del ratón. Si establece shift-select-mode
en el valor permanent
, las teclas de movimiento del cursor que no hayan sido desplazadas por shift no desactivarán la marca, por lo que, por ejemplo, la región establecida por comandos anteriores puede ampliarse mediante shift-selection (selección de mayúsculas), y las teclas de movimiento del cursor no desplazadas ampliarán la región establecida por selección de mayúsculas.
12.7 Desactivar el Modo de Marca Transitoria
El comportamiento por defecto de la marca y la región, en el que al fijar la marca se activa ésta y se resalta la región, se denomina Transient Mark mode (modo Marca Transitoria). Se trata de un modo menor que está activado por defecto en las sesiones interactivas. Puede activarse con M-x transient-mark-mode
, o con la opción Highlight Active Region
(Resaltar Región Activa) del menú Options
(Opciones). Si se desactiva, Emacs pasa a un modo de funcionamiento alternativo:
Al fijar la marca, con comandos como Ctrl-SPACE (
C-SPC
) o Ctrl-x Ctrl-x (C-x C-x
), no se resalta la región. Por lo tanto, no se puede saber con sólo mirar dónde se encuentra la marca; hay que acordarse. La solución habitual a este problema es fijar la marca y utilizarla pronto, antes de que se le olvide dónde está. También puede comprobar dónde está la marca utilizandoC-x C-x
, que intercambia las posiciones del punto y de la marca (véase 12.1 Fijar la Marca).Algunos comandos, que normalmente actúan sobre la región cuando la marca está activa, ya no lo hacen. Por ejemplo, normalmente (
M-%
,query-replace
, consulta-reemplazo) realiza reemplazos dentro de la región, si la marca está activa. Cuando el modo de marca transitoria está desactivado, siempre actúa desde el punto hasta el final de la memoria intermedia. Los comandos que actúan de este modo se identifican en su propia documentación.
Mientras el modo Marca Transitoria (Transient Mark mode) está desactivado, puede activarlo temporalmente utilizando Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC
) o Ctrl-u Ctrl-x Ctrl-x (C-u C-x C-x
).
Ctrl-SPACE Ctrl-SPACE (C-SPC C-SPC
)
Establece la marca en el punto (como
C-SPC
normal) y activa el modo Marca Transitoria (Transient Mark mode) sólo una vez, hasta que la marca se desactiva. (En realidad, no se trata de un comando independiente; está usando el comandoC-SPC
dos veces).
Ctrl-u Ctrl-x x (C-u C-x C-x
)
Intercambia punto y marca, activa la marca y habilita temporalmente el modo Marca Transitoria (Transient Mark mode), hasta la siguiente desactivación de la marca. (Se trata del comando
C-x C-x
,exchange-point-and-mark
, con un argumento de prefijo).
Estos comandos establecen o activan la marca, y habilitan el modo Marca Transitoria sólo hasta que se desactiva la marca. Una de las razones por las que es posible que desee utilizarlos es que algunos comandos operan en todo el búfer intermedia en lugar de en la región cuando el modo Marca transitoria está desactivado. La activación momentánea del modo Marca Transitoria permite utilizar estos comandos en la región.
Cuando especifique una región con el ratón (véase 12.1 Fijar la Marca), o con la selección de mayúsculas (véase 12.6 Selección mediante Mayúsculas (Shift)), también se activará temporalmente el modo Marca Transitoria y se resaltará la región.