13 Matar y Mover Texto

En Emacs, kill (matar) significa borrar texto y copiarlo en el anillo de muertes (kill ring). Yanking (desplazar, tirar de o copiar desde) significa traer texto del anillo de muertes de vuelta al búfer. (Algunas aplicaciones utilizan los términos «cortar» y «pegar» para operaciones similares). El anillo de muertes se llama así porque se puede visualizar como un conjunto de bloques de texto dispuestos en un anillo, al que se puede acceder en orden cíclico. Véase 13.2.1 Anillo de Muertes.

Los comandos kill (matar) y yanking (tirar de) son la forma más común de mover o copiar texto dentro de Emacs. Es muy versátil, porque hay comandos para matar muchos tipos diferentes de unidades sintácticas.

13.1 Borrar y Matar

La mayoría de las órdenes que borran texto del búfer lo guardan en el anillo de muertes (ver 13.2.1 Anillo de Muertes). Se conocen como comandos kill, y sus nombres normalmente contienen la palabra kill (por ejemplo, kill-line). El kill ring (anillo de muertes) almacena varias muertes recientes, no sólo el último, por lo que matar es una operación muy segura: no tiene que preocuparse mucho por perder texto que haya matado previamente. El anillo de muertes es compartido por todos los búferes, por lo que el texto que es matado en un búfer puede ser arrastrado a otro búfer.

Cuando se usa Ctrl-/ (C-/, undo, deshacer) para deshacer un comando de eliminación (ver 17.1 Deshacer), el texto eliminado vuelve al búfer, pero no se elimina del anillo de muertes.

En las pantallas gráficas, al matar el texto también se copia en el portapapeles del sistema. Ver 13.3 Operaciones de «cortar y pegar» en Entornos Gráficos de Escritorio.

Los comandos que borran el texto pero no lo guardan en el anillo de muertes se conocen como comandos de borrado; sus nombres suelen contener la palabra delete (borrar). Entre ellos se incluyen Ctrl-d (C-d, delete-char) y DEL (DEL, delete-backward-char), que borran sólo un carácter cada vez, y los comandos que borran sólo espacios o nuevas líneas. Los comandos que pueden borrar cantidades significativas de datos no triviales generalmente realizan una operación de borrado.

También puede utilizar el ratón para matar y tirar. Vea 13.3 Operaciones de «cortar y pegar» en Entornos Gráficos de Escritorio.

13.1.1 Borrado

Borrado* significa borrar texto y no guardarlo en el anillo de muertes. En su mayor parte, los comandos de Emacs que borran texto son los que borran sólo un carácter o sólo espacios en blanco.

DEL
BACKSPACE

Borra el carácter anterior, o el texto de la región si está activa (delete-backward-char).

Delete

Borra el siguiente carácter, o el texto de la región si está activa (delete-forward-char).

Ctrl-d (C-d)

Borra el siguiente carácter (delete-char).

Alt-\ (M-\)

Borra los espacios y tabuladores alrededor del punto (delete-horizontal-point).

Alt-SPACE (M-SPC)

Borra los espacios y tabuladores alrededor del punto, dejando un solo espacio (just-one-space).

Ctrl-x Ctrl-o (C-x C-o)

Borra las líneas en blanco alrededor de la línea actual (delete-blank-lines).

Alt-^ (M-^)

Une dos líneas eliminando la nueva línea intermedia, junto con cualquier sangría que la siga (delete-indentation).

Ya hemos descrito los comandos básicos de borrado DEL (delete-backward-char), delete (delete-forward-char) y C-d (delete-char). Véase 8.3 Borrar Texto. Con un argumento numérico, borran el número especificado de caracteres. Si el argumento numérico se omite o es uno, DEL y delete borran todo el texto de la región si está activa (véase 12.3 Operar en la Región).

Los otros comandos de borrado son los que borran sólo caracteres de espacio en blanco: espacios, tabuladores y nuevas líneas. M-\ (delete-horizontal-space, borrar-espacio-horizontal) borra todos los espacios y caracteres de tabulación antes y después del punto. Con un argumento de prefijo, sólo borra los espacios y tabuladores antes del punto.

just-one-space (sólo-un-espacio) hace lo mismo pero deja un único espacio antes del punto, independientemente del número de espacios que existieran previamente (incluso si antes no había ninguno). Con un argumento numérico n, deja n espacios antes del punto si n es positivo; si n es negativo, borra las nuevas líneas además de los espacios y tabuladores, dejando -n espacios antes del punto.

El comando cycle-spacing (M-SPC) actúa como una versión más flexible de just-one-space. Realiza diferentes acciones de limpieza de espacio definidas por cycle-spacing-actions, de forma cíclica, si se llama repetidamente en sucesión.

C-x C-o (delete-blank-lines, borrar-líneas-en-blanco) borra todas las líneas en blanco después de la línea actual. Si la línea actual está en blanco, borra también todas las líneas en blanco anteriores a la línea actual (dejando una línea en blanco, la línea actual). En una sola línea en blanco, borra esa línea.

M-^ (delete-indentation, eliminar-indentación) une la línea actual y la línea anterior, suprimiendo una nueva línea y todos los espacios circundantes, dejando normalmente un solo espacio. Véase 25 Indentación.

El comando delete-duplicate-lines (borrar-línas-duplicadas) busca en la región líneas idénticas, y elimina todas menos una copia de cada una. Normalmente mantiene la primera instancia de cada línea repetida, pero con un argumento de prefijo Ctrl-u (C-u) mantiene la última. Con un argumento de prefijo Ctrl-u Ctrl-u (C-u C-u), sólo busca líneas idénticas adyacentes. Este es un modo de operación más eficiente, útil cuando las líneas ya han sido ordenadas. Con un argumento de prefijo Ctrl-u Ctrl-u Ctrl-u (C-u C-u C-u), conserva las líneas en blanco repetidas.

13.1.2 Matar por Líneas

Ctrl-k (C-k)

Mata el resto de la línea, o una o más líneas (kill-line).

Ctrl-Shift-BACKSPACE (C-S-backspace)

Mata toda una línea a la vez (kill-whole-line).

La orden de matar más sencilla es C-k (kill-line). Si se usa al final de una línea, elimina el carácter de nueva línea con el que termina la línea, fusionando la línea siguiente con la actual (de este modo, se elimina por completo una línea en blanco). De lo contrario, C-k elimina todo el texto desde el punto hasta el final de la línea; si el punto estaba originalmente al principio de la línea, la deja en blanco.

Los espacios y tabuladores al final de la línea se ignoran al decidir qué caso se aplica. Siempre que el punto esté después del último carácter de la línea que no sea un espacio en blanco, puede estar seguro de que C-k eliminará la nueva línea. Para eliminar toda una línea que no esté en blanco, vaya al principio y escriba C-k dos veces.

En este contexto, «línea» significa una línea de texto lógica, no una línea de pantalla (ver 8.8 Líneas de Continuación).

Cuando a C-k se le da un argumento positivo n, elimina n líneas y las nuevas líneas que las siguen (el texto en la línea actual antes del punto no se elimina). Con un argumento negativo -n, elimina n líneas anteriores a la línea actual, junto con el texto de la línea actual anterior al punto. C-k con un argumento cero elimina el texto anterior al punto en la línea actual.

Si la variable kill-whole-line es distinta de nil, C-k al principio de una línea elimina toda la línea, incluida la nueva línea siguiente. Esta variable es normalmente nula.

C-S-backspace (kill-whole-line) elimina una línea completa incluyendo su nueva línea, independientemente de la posición del punto dentro de la línea. Tenga en cuenta que muchos terminales de texto le impedirán escribir la secuencia de teclas C-S-backspace.

13.1.3 Otros Comandos de Muerte

Ctrl-w (C-w)

Mata la región (kill-region).

Alt-w (M-w)

Copia la región en el anillo de muertes (kill-ring-save).

Alt-d (M-d)

Mata la siguiente palara (kill-word). Vea 26.1 Palabras.

Alt-BACKSPACE (M-Del)

Mata una palabra hacia atrás (backward-kill-word).

Ctrl-x BACKSPACE (C-x DEL)

Mata hasta el principio de la frase (backward-kill-sentence). Vea 26.2 Frases (u oraciones).

Alt-k (M-k)

Mata hasta final de la frase (kill-sentence).

Ctrl-Alt-k (C-M-k)

Mata la siguiente expresión equilibrada (kill-sexp). Véase 27.4.1 Expresiones con Paréntesis Equilibrados.

Alt-z caracter (M-z caracter)

Mata hasta la siguiente aparición de caracter (zap-to-char).

Alt-x zap-up-to-char caracter (M-x zap-up-to-char caracter)

20 Mata hasta, pero sin incluir, la siguiente aparición de caracter.

Uno de los comandos de eliminación más usados es C-w (kill-region), que elimina el texto de la región (véase 12 La marca y la región). Del mismo modo, M-w (kill-ring-save) copia el texto de la región en el anillo de muertes sin eliminarlo del búfer. Si la marca está inactiva cuando teclea Ctrl-w (C-w) o Alt-w (M-w), el comando actúa sobre el texto entre el punto y donde puso la marca por última vez (ver 12.3 Operar en la Región).

Emacs también proporciona comandos para matar unidades sintácticas específicas: palabras, con M-DEL y M-d (vea 26.1 Palabras); expresiones compuestas, con C-M-k (vea 27.4.1 Expresiones con Paréntesis Equilibrados); y frases, con C-x DEL y M-k (vea 26.2 Frases (u oraciones)).

El comando M-z (zap-to-char) combina matar con buscar: lee un carácter y mata desde el punto hasta (e incluyendo) la siguiente aparición de ese carácter en el búfer. Un argumento numérico actúa como contador de repeticiones; un argumento negativo significa buscar hacia atrás y matar el texto anterior al punto. Se mantiene un historial de los caracteres usados anteriormente, al que se puede acceder mediante las teclas Alt-p / Alt-n (M-p/M-n). Esto es útil sobre todo si el carácter que se va a utilizar tiene que introducirse mediante un método de entrada complicado. Un comando similar zap-up-to-char mata desde el punto hasta, pero sin incluir, la siguiente aparición de un carácter, con un argumento numérico que actúa como contador de repeticiones.

13.1.4 Opciones de Matado

Algunos búferes especializados contienen texto de sólo lectura, que no puede ser modificado y por lo tanto no puede ser eliminado. Los comandos de matar funcionan de forma especial en un búfer de sólo lectura: se mueven sobre el texto y lo copian al anillo de muertes, sin borrarlo realmente del búfer. Normalmente, también pitan y muestran un mensaje de error cuando esto ocurre. Pero si establece la variable kill-read-only-ok a un valor no nulo, sólo imprimen un mensaje en el área de eco para explicar por qué el texto no ha sido borrado.

Antes de guardar lo que se ha matado en el anillo de muertes, puede transformar la cadena usando kill-transform-function. Se llama con la cadena a matar, y debería devolver la cadena que quiere que se guarde. También puede devolver nil, en cuyo caso la cadena no se guardará en el anillo de muertes. Por ejemplo, si nunca quiere guardar una cadena con espacio en blanco puro en el anillo de muertes, puede decir:

(setq kill-transform-function
   (lambda (string)
     (and (not (string-blank-p string))
          string)))

Si cambia la variable kill-do-not-save-duplicates a un valor no nulo, las muertes subsiguientes idénticas producen una única entrada de kill-ring, sin duplicación.

13.2 Tirar de un Texto

yanking significa reinsertar un texto previamente eliminado. La forma habitual de mover o copiar un texto es eliminarlo y arrastrarlo a otro lugar.

Ctrl-y (C-y)

Tira (jala) en el punto de la última muerte en el búfer (yank).

Alt-y (M-y)

Puede sustituir el texto que acaba de eliminar por un lote anterior de texto eliminado (yank-pop), o permitir seleccionar de la lista de lotes de texto eliminados anteriormente. Véase 13.2.2 Borrar Muertes Anteriores.

Ctrl-Alt-w (C-M-w)

Hace que la siguiente orden, si es una orden de muertes, se añada a la muerte anterior (append-next-kill). Véase 13.2.3 Añadir Muertes.

El comando básico para copiar (extraer o tirar) desde el anillo de muertes (yanking) es C-y (yank). Inserta la muerte más reciente, dejando el cursor al final del texto insertado. También coloca la marca al principio del texto insertado, sin activar la marca; esto le permite saltar fácilmente a esa posición, si lo desea, con Ctrl-u Ctrl-SPACE (C-u C-SPC) (véase 12.4 El Anillo de Marcas).

Con un argumento de prefijo simple (C-u C-y), el comando deja el cursor delante del texto insertado y activa la marca al final. El uso de cualquier otro argumento prefijo especifica una marca anterior; por ejemplo, Ctrl-u 4 Ctrl-y (C-u 4 C-y) reinserta la cuarta marca más reciente. Véase 13.2.2 Borrar Muertes Anteriores.

En las pantallas gráficas y en las pantallas con modo texto, C-y comprueba primero si otra aplicación ha colocado algún texto en el portapapeles del sistema más recientemente que la última vez que Emacs lo mató. Si es así, inserta el texto del portapapeles en su lugar. Así, Emacs trata efectivamente las operaciones de «cortar» o «copiar» del portapapeles realizadas en otras aplicaciones como muertes de Emacs, excepto que no se registran en el anillo de muertes. Ver 13.3 Operaciones de «cortar y pegar» en Entornos Gráficos de Escritorio, para más detalles.

13.2.1 Anillo de Muertes

El anillo de muertes (kill ring) es una lista de bloques de texto que han sido eliminados previamente. Sólo hay un kill ring, compartido por todos los búferes, por lo que puede matar texto en un búfer y arrancarlo en otro búfer. Esta es la forma habitual de mover texto de un búfer a otro. (Hay otros métodos: por ejemplo, puede almacenar el texto en un registro; vea 14 Registros. Vea 13.4 Acumular Texto, para algunas otras formas de mover texto).

El número máximo de entradas en el anillo de muertes se controla mediante la variable kill-ring-max. Por defecto es 120. Si hace un nuevo kill (si mata texto) cuando se ha alcanzado este límite, Emacs hace espacio borrando la entrada más antigua en dicho anillo.

El contenido actual del anillo de muertes se almacena en una variable llamada kill-ring; puede ver el contenido completo del anillo de muertes con Ctrl-h v kill-ring (C-h v kill-ring).

13.2.2 Borrar Muertes Anteriores

Como se explica en 13.2 Tirar de un Texto, puede usar un argumento numérico a C-y para sacar texto que ya no es la muerte más reciente. Esto es útil si recuerda qué entrada del anillo de muertes quiere. Si no, puede usar el comando M-y (yank-pop) para recorrer las posibilidades o seleccionar uno de las muertes anteriores.

Si el comando anterior era una orden de jalar (un comando yank), M-y toma el texto que fue jalado (que fue empujado al anillo de muertes) y lo reemplaza con el texto de una muerte anterior. Así, para recuperar el texto de la penúltima muerte, primero use C-y para jalar de la última muerte, y luego use M-y para reemplazarlo con la muerte anterior. Esto sólo funciona después de un C-y u otro M-y. (Si M-y se invoca después de algún otro comando, funciona de forma diferente, ver más abajo).

Puede entender el modo de funcionamiento de M-y en términos de un puntero al último tirón (lo último que se ha llevado al anillo de muertes) que apunta a una entrada en el dicho anillo. Cada vez que se mata, el puntero del último tirón se mueve a la entrada recién hecha en la parte delantera del anillo. C-y elimina la entrada a la que apunta el puntero del último tirón. M-y después de un C-y u otro M-y mueve el puntero del último yank (tirón) a la entrada anterior, y el texto en el búfer cambia para coincidir. Suficientes comandos M-y uno tras otro pueden mover el puntero a cualquier entrada en el anillo, por lo que puede obtener cualquier entrada en el búfer. Finalmente, el puntero llega al final del anillo; el siguiente M-y vuelve a la primera entrada.

M-y mueve el puntero de la última entrada en el anillo, pero no cambia el orden de las entradas en él, que siempre va desde la muerte más reciente al principio hasta la más antigua que aún se recuerde.

Cuando se utiliza después de C-y o M-y, M-y puede recibir un argumento numérico, que le indica cuántas entradas debe avanzar el puntero a partir del último texto que se ha tirado o jalado desde el anillo de muertes (desde el último yank). Un argumento negativo mueve el puntero hacia la parte delantera del anillo; desde el frente del anillo, se mueve alrededor de la última entrada y continúa hacia adelante desde allí.

Una vez que el texto que está buscando es traído al búfer, puede dejar de ejecutar comandos M-y y el último texto jalado permanecerá allí. Es sólo una copia de la entrada del anillo de matar, por lo que editarlo en el búfer no cambia lo que hay en el anillo. Mientras no se realice una nueva muerte, el puntero de la última permanece en el mismo lugar en el anillo de muertes, por lo que repetir C-y arrancará (jalará, tirará) otra copia de la misma muerte anterior.

Cuando se llama a C-y con un argumento numérico, también se establece el puntero del último tirón a la entrada que se tira.

También puede invocar M-y después de un comando que no sea un comando yank. En ese caso, M-y le pregunta en el minibúfer por uno de las muertes anteriores. Puede usar los comandos de historial del minibúfer (ver 9.5 Historial del Minibúfer) para navegar o buscar entre las entradas del anillo de muertes hasta que encuentre la que desea reinsertar. O puede usar los comandos de completado (ver 9.4.2 Comandos de Completado) para completar una entrada de la lista de entradas del anillo de muerte o hacer aparecer el búfer Completions (Completado) con las entradas candidatas entre las que puede elegir. Después de seleccionar la entrada del anillo de muertes, puede editarla opcionalmente en el minibúfer. Por último, escriba RETURN (RET) para salir del minibúfer e insertar el texto del anillo de muertes seleccionado. Como en el caso de M-y después de otro comando yank, el puntero del último yank (tirón) queda apuntando al texto que acaba de extraer o jalar, ya sea uno de las muertes anteriores o una entrada del anillo de muertes que editó antes de insertarlo. (En este último caso, la entrada editada se añade al principio del anillo de muertes). Así que aquí, también, tecleando C-y sacará otra copia del texto que acaba de insertar.

Cuando se invoca con un argumento de prefijo simple Ctrl-u Alt-y (C-u M-y) después de un comando que no es un comando yank, M-y deja el cursor delante del texto insertado, y pone la marca al final, como hace C-y.

13.2.3 Añadir Muertes

Normalmente, cada orden de matar texto introduce una nueva entrada en el anillo de muertes. Sin embargo, dos o más órdenes de matar seguidas combinan su texto en una sola entrada, de forma que ejecutar una sola combinación de teclas Ctrl-y (C-y) arranca todo el texto como una unidad, tal y como estaba antes de ser matado.

Por lo tanto, si quiere matar el texto como una unidad, no es necesario que lo mate todo de una sola vez; puede seguir matando línea tras línea, o palabra tras palabra, hasta que lo haya matado todo, y aún podrá recuperarlo todo de una sola vez.

Los comandos que matan hacia delante desde un punto añaden texto al final del texto matado anteriormente. Los comandos que matan hacia atrás desde el punto añaden texto al principio. De esta forma, cualquier secuencia de comandos de eliminación hacia delante y hacia atrás pone todo el texto eliminado en una sola entrada sin reordenar. Los argumentos numéricos no rompen la secuencia de eliminación. Por ejemplo, supongamos que el búfer contiene este texto:

Esta es una línea ∗de texto de ejemplo.

con el punto mostrado por . Si escribe Alt-d Alt-BACKSPACE Alt-d Alt-BACKSPACE (M-d M-DEL M-d M-DEL), matando alternativamente hacia adelante y hacia atrás, terminará con una línea de ejemplo como una entrada en el anillo de matar, y Esto es  texto. en el búfer. (Observe el doble espacio entre es y texto, que puede limpiar con Alt-SPACE (M-SPC) o Alt-q (M-q)).

Otra forma de matar el mismo texto es retroceder dos palabras con Alt-b Alt-b (M-b M-b), y luego matar las cuatro palabras hacia adelante con Ctrl-u Alt-d (C-u M-d). Esto produce exactamente los mismos resultados en el búfer y en el kill ring. Alt-f Alt-f Ctrl-u Alt-BACKSPACE (M-f M-f C-u M-DEL) mata el mismo texto, yendo todo hacia atrás; una vez más, el resultado es el mismo. El texto en la entrada del kill ring siempre tiene el mismo orden que tenía en el búfer antes de que lo matara.

Si una orden de matar está separada de la última orden de matar por otras órdenes (no sólo argumentos numéricos), inicia una nueva entrada en el anillo de muertes. Pero puede forzarla a combinarse con el último texto matado, tecleando justo antes Ctrl-Alt-w (C-M-w, append-next-kill). C-M-w le dice al comando que le sigue, si es un comando de eliminación, que trate la eliminación como parte de la secuencia de eliminaciones anteriores. Como de costumbre, la orden de matar se añade al texto matado anteriormente si la orden mata hacia delante, y se antepone si la orden mata hacia atrás. De este modo, puede matar varios trozos de texto separados y acumularlos para volver a arrancarlos en un solo lugar.

Un comando de matar que sigue a M-w (kill-ring-save) no se añade al texto que M-w copió en el anillo de muertes.

13.3 Operaciones de «cortar y pegar» en Entornos Gráficos de Escritorio

En la mayoría de los entornos gráficos de escritorio, puede transferir datos (normalmente texto) entre diferentes aplicaciones utilizando una función del sistema llamada portapapeles. En X, existen otras dos facilidades similares: la selección primaria y la selección secundaria. Cuando Emacs se ejecuta en una pantalla gráfica, sus comandos kill y yank se integran con estas facilidades, de modo que puedes transferir texto fácilmente entre Emacs y otras aplicaciones gráficas.

Por defecto, Emacs usa UTF-8 como sistema de codificación para las transferencias de texto entre programas. Si encuentra que el texto pegado no es lo que esperaba, puede especificar otro sistema de codificación tecleando Ctrl-x RETURN x (C-x RET x) o Ctrl-x RETURN X (C-x RET X). También puede solicitar un tipo de datos diferente personalizando x-select-request-type. Véase 23.10 Sistemas Codificación para la Comunicación Interprocesos.

13.3.1 Utilizar el Portapapeles

El portapapeles es la herramienta que la mayoría de las aplicaciones gráficas utilizan para «cortar y pegar». Cuando el portapapeles existe, los comandos kill y yank de Emacs hacen uso de él.

Cuando mata algún texto con un comando como C-w (kill-region), o lo copia al anillo de muertes con un comando como M-w (kill-ring-save), ese texto también va al portapapeles.

Cuando un comando kill de Emacs pone texto en el portapapeles, normalmente se pierde el contenido del portapapeles existente. Opcionalmente, Emacs puede guardar el contenido existente del portapapeles en el kill ring (anillo de muertes), evitando que pierda los datos anteriores del portapapeles. Si save-interprogram-paste-before-kill se ha establecido en un número, entonces los datos se copian si son más pequeños (en caracteres) que este número. Si esta variable tiene cualquier otro valor que no sea nulo, los datos se copian siempre, con el riesgo de un alto consumo de memoria si los datos resultan ser grandes.

Los comandos Yank (los comandos de tirar o jalar texto), como C-y (yank), también usan el portapapeles. Si otra aplicación «posee» el portapapeles, es decir, si cortó o copió texto allí más recientemente que su último comando de eliminación en Emacs, entonces lo elimina del portapapeles en lugar del anillo de muertes.

Normalmente, girar el anillo de muertes con M-y (yank-pop) no altera el portapapeles. Sin embargo, si cambia yank-pop-change-selection a t, entonces M-y guarda el nuevo yank en el portapapeles.

Para evitar que los comandos kill y yank accedan al portapapeles, cambie la variable select-enable-clipboard a nil.

Los programas pueden poner en el portapapeles otras cosas además de texto plano. Por ejemplo, un navegador web normalmente le permitirá elegir «Copiar imagen» en las imágenes, y esta imagen se pondrá en el portapapeles. En plataformas capaces, Emacs puede extraer estos objetos con el comando yank-media, pero sólo en modos que lo soporten (ver Tirando de Archivos Media en el Manual de Referencia de Emacs Lisp).

Muchos entornos de escritorio X soportan una característica llamada gestor del portapapeles. Si sale de Emacs mientras es el actual «propietario» de los datos del portapapeles, y hay un gestor de portapapeles en ejecución, Emacs transfiere los datos del portapapeles al gestor de portapapeles para que no se pierdan. En algunas circunstancias, esto puede causar un retraso al salir del Editor; si desea evitar que Emacs transfiera datos al gestor del portapapeles, cambie la variable x-select-enable-clipboard-manager a nil.

Dado que las cadenas que contienen bytes NUL suelen truncarse al pasarlas por el portapapeles, Emacs sustituye dichos caracteres por «0» antes de transferirlos al portapapeles del sistema.

Antes de Emacs 24, los comandos kill y yank usaban la selección primaria (ver 13.3.2 Cortar y Pegar con Otras Aplicaciones de Ventana), no el portapapeles. Si prefiere este comportamiento, cambie select-enable-clipboard a nil, select-enable-primary a t, y mouse-drag-copy-region a t. En este caso, puede usar los siguientes comandos para actuar explícitamente sobre el portapapeles: clipboard-kill-region mata la región y la guarda en el portapapeles; clipboard-kill-ring-save copia la región al anillo de muertes y la guarda en el portapapeles; y clipboard-yank tira del contenido del portapapeles en el punto.

13.3.2 Cortar y Pegar con Otras Aplicaciones de Ventana

Bajo el Sistema X Window, PGTK y Haiku, existe una selección primaria que contiene el último tramo de texto seleccionado en una aplicación X (normalmente arrastrando el ratón). Normalmente, este texto puede insertarse en otras aplicaciones X mediante clics de ratón-2. La selección primaria está separada del portapapeles. Su contenido es más frágil; se sobrescribe cada vez que se selecciona texto con el ratón, mientras que el portapapeles sólo se sobrescribe mediante comandos explícitos de cortar o copiar.

En X, siempre que la región esté activa (véase 12 La marca y la región), el texto de la región se guarda en la selección primaria. Esto se aplica independientemente de si la región se hizo arrastrando o haciendo clic con el ratón (véase 22.1 Comandos del Ratón para Edición), o mediante comandos del teclado (por ejemplo, escribiendo Ctrl-SPACE (C-SPC) y moviendo el 20punto; véase 12.1 Fijar la Marca).

Si cambia la variable select-active-regions a only, Emacs guarda sólo las regiones temporalmente activas en la selección primaria, es decir, aquellas hechas con el ratón o con selección mediante mayúsculas (ver 12.6 Selección mediante Mayúsculas (Shift)). Si cambia select-active-regions a nil, Emacs evita guardar regiones activas en la selección primaria por completo.

Para insertar la selección primaria en un búfer de Emacs, haga clic con mouse-2 (mouse-yank-primary) donde quiera insertarla. Vea 22.1 Comandos del Ratón para Edición. También puede usar el comando yank normal de Emacs (C-y) para insertar este texto si select-enable-primary está activado (vea 13.3.1 Utilizar el Portapapeles).

Por defecto, Emacs mantiene la región activa incluso después de que se seleccione texto en otro programa; esto es contrario al comportamiento típico de X. Para hacer que Emacs desactive la región después de que otro programa coloque datos en la selección primaria, active el modo menor global lost-selection-mode.

MS-Windows no proporciona selección primaria, pero Emacs la emula dentro de una única sesión de Emacs almacenando internamente el texto seleccionado. Por lo tanto, todas las características y comandos relacionados con la selección primaria funcionan en Windows como lo hacen en X, para cortar y pegar dentro de la misma sesión, pero no entre sesiones de Emacs o con otras aplicaciones.

13.3.3 Selección Secundaria

Además de la selección primaria, el Sistema X Window proporciona una segunda facilidad similar conocida como selección secundaria. Hoy en día, pocas aplicaciones X hacen uso de la selección secundaria, pero puede acceder a ella usando los siguientes comandos de Emacs:

Establezca la selección secundaria, con un extremo en el lugar donde presiona el botón, y el otro extremo en el lugar donde lo suelta (mouse-set-secondary). El texto seleccionado se resalta, usando la cara de selección secundaria, a medida que lo arrastra. La ventana se desplaza automáticamente si arrastra el ratón fuera de la parte superior o inferior de la ventana, igual que mouse-set-region (ver 22.1 Comandos del Ratón para Edición).

Este comando no altera el anillo de muertes.

Alt-arrastrar-ratón-1 (M--arrastrar-ratón-1)

Establece la selección secundaria, con un extremo en el lugar donde se pulsa el botón, y el otro extremo en el lugar donde se suelta (mouse-set-secondary). El texto seleccionado se resalta, usando la cara de selección secundaria, a medida que lo arrastra. La ventana se desplaza automáticamente si arrastra el ratón fuera de la parte superior o inferior de la ventana, igual que mouse-set-region (ver 12.1 Fijar la Marca).

Este comando no altera el anillo de muertes.

Alt-ratón-1 (M-ratón-1)

Establece un extremo para la selección secundaria (mouse-start-secondary); use M-ratón-3 para establecer el otro extremo y completar la selección. Este comando cancela cualquier selección secundaria existente, cuando inicia una nueva.

Alt-ratón-3 (M-ratón-3)

Coloca la selección secundaria (mouse-secondary-save-then-kill), con un extremo en la posición en la que pulsó M-ratón-3, y el otro en la posición especificada previamente con M-ratón-1. Esto también pone el texto seleccionado en el anillo de muertes. Un segundo M-ratón-3 en el mismo lugar mata el texto seleccionado por la selección secundaria que se acaba de hacer.

Alt-ratón-2 (M-ratón-2)

Inserta la selección secundaria donde has hecho clic, colocando el punto al final del texto arrancado (mouse-yank-secondary).

El doble o triple clic de M-ratón-1 opera sobre palabras y líneas, de forma similar a M-ratón-1.

Si mouse-yank-at-point es distinto de cero, M-mouse-2 hace clic en el punto. Entonces no importa exactamente dónde haga clic, o incluso en cuál de las ventanas del marco haga clic. Ver 22.1 Comandos del Ratón para Edición. Esta opción de usuario también afecta a la búsqueda interactiva: si no es nula, al pulsar con el ratón en cualquier parte del marco se añadirá el texto a la cadena de búsqueda.

13.4 Acumular Texto

Normalmente copiamos o movemos texto matándolo y tirando de él, pero hay otros métodos convenientes para copiar un bloque de texto en muchos lugares, o para copiar muchos bloques de texto dispersos en un solo lugar. Aquí describimos los comandos para acumular trozos de texto dispersos en un búfer o en un fichero.

Alt-x append-to-buffer (M-x append-to-buffer)

Añade una región al contenido de un búfer especificado.

Alt-x preprend-to-buffer (M-x preprend-to-buffer)

Antepone una región al contenido de un búfer especificado.

Alt-x copy-to-buffer (M-x copy-to-buffer)

Copia la región en un búfer especificado, borrando el contenido antiguo de ese búfer.

Alt-x insert-buffer (M-x insert-buffer)

Inserta el contenido de un búfer especificado en el búfer actual en un punto.

Alt-x append-to-file (M-x append-to-file)

Añade una región al contenido de un archivo especificado, al final.

Para acumular texto en un búfer, utilice M-x append-to-buffer. Esto lee un nombre de búfer y luego inserta una copia de la región en el búfer especificado. Si especifica un búfer inexistente, append-to-buffer crea el búfer. El texto se inserta en cualquier punto de ese búfer. Si ha estado utilizando el búfer para editar, el texto copiado se inserta en el centro del texto del búfer, comenzando donde se encuentre el punto en ese momento.

El punto de ese búfer queda al final del texto copiado, de modo que los usos sucesivos de anexar al búfer acumulan el texto en el búfer especificado en el mismo orden en que fueron copiados. Estrictamente hablando, append-to-buffer no siempre añade texto al que ya está en el búfer; sólo lo añade si el punto de ese búfer está al final. Sin embargo, si append-to-buffer es el único comando que usa para alterar un búfer, entonces el punto siempre está al final.

M-x prepend-to-buffer es igual que append-to-buffer excepto en que el punto en el otro búfer se deja antes del texto copiado, de modo que los usos sucesivos de este comando añaden texto en orden inverso. M-x copy-to-buffer es similar, excepto en que cualquier texto existente en el otro búfer se borra, por lo que el búfer queda conteniendo sólo el texto recién copiado en él.

El comando Ctrl-x x i (C-x x i, insertar-buffer) se puede usar para recuperar el texto acumulado en otro búfer. Este comando pide el nombre de un búfer e inserta una copia de todo el texto de ese búfer en el búfer actual en el punto, dejando el punto al principio del texto insertado. También añade la posición del final del texto insertado al anillo de marca, sin activar la marca. Para más información sobre los búferes, véase 20 Uso de Varios Búferes.

En lugar de acumular texto en un búfer, puede añadir texto directamente a un archivo con M-x append-to-file. Esto solicita un nombre de archivo y añade el texto de la región al final del archivo especificado. El archivo se modifica inmediatamente en el disco.

Debería usar append-to-file sólo con ficheros que no estén siendo visitados en Emacs. Usarlo en un fichero que está editando en Emacs cambiaría el fichero a espaldas de Emacs, lo que puede llevar a perder parte de su edición.

Otra forma de mover texto es almacenarlo en un registro. Ver 14 Registros.

13.5 Rectángulos

Los comandos de rectángulo operan sobre áreas rectangulares del texto: todos los caracteres entre un cierto par de columnas, en un cierto rango de líneas. Emacs tiene comandos para matar y tirar de rectángulos, vaciarlos, rellenarlos con espacios en blanco o texto, o borrarlos. Los comandos de rectángulo son útiles con texto en formatos de varias columnas, y para cambiar el texto dentro o fuera de tales formatos.

Para especificar un rectángulo para un comando, ponga la marca en una esquina y apunte a la esquina opuesta. El rectángulo así especificado se denomina región rectangular (region-rectangle). Si el punto y la marca están en la misma columna, el rectángulo regional estará vacío. Si están en la misma línea, la región rectángular tiene una línea de altura.

La región rectangular se controla del mismo modo que la región. Pero recuerde que una combinación dada de valores de punto y marca puede interpretarse como una región o como un rectángulo, dependiendo del comando que los utilice.

Una región rectangular también puede marcarse con el ratón: haga clic y arrastre Ctrl-ratón-1 (C-ratón-1) desde una esquina del rectángulo a la opuesta.

Ctrl-x rk (C-x r k)

Mata el texto del rectángulo-región, guardando su contenido como el último rectángulo matado (kill-rectangle).

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

Guarda el texto del rectángulo-región como el último rectángulo matado (copy-rectangle-as-kill).

Ctrl-x rd (C-x r d)

Borra el texto de la región-rectángulo (delete-rectangle).

Ctrl-x r y (C-x r y)

Tira del último rectángulo matado con su esquina superior izquierda en el punto (yank-rectangle).

Ctrl-x r o (C-x r o)

Inserta un espacio en blanco para rellenar el espacio del rectángulo-región (open-rectangle). Esto empuja el contenido anterior del rectángulo de región hacia la derecha.

Ctrl-x rN (C-x r N)

Inserta números de línea a lo largo del borde izquierdo del rectángulo-región (rectangle-number-lines). Esto empuja el contenido anterior del rectángulo-región hacia la derecha.

Ctrl-x rc (C-x r c)

Borra el rectángulo-región sustituyendo todo su contenido por espacios (clear-rectangle).

Alt-x delete-whitespace-rectangle (M-x delete-whitespace-rectangle)

Elimina los espacios en blanco de cada una de las líneas del rectángulo especificado, empezando por la columna del borde izquierdo del rectángulo.

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

Sustituye el contenido del rectángulo por una cadena en cada línea (string-rectangle).

Alt-x string-insert-rectangle RETURN cadena RETURN
(M-x string-insert-rectangle RET cadena RET)

Inserta una cadena en cada línea del rectángulo.

Ctrl-x SPACE (C-x SPC)

Activa el modo de marca de rectángulo (rectangle-mark-mode). Cuando este modo está activo, el rectángulo de la región se resalta y se puede encoger/agrandar, y los comandos estándar kill y yank operan sobre él.

Las operaciones con rectángulos se dividen en dos clases: comandos para borrar o insertar rectángulos, y comandos para hacer rectángulos en blanco.

Hay dos formas de borrar el texto de un rectángulo: C-x r d (delete-rectangle) para borrar el texto completamente, o C-x r k (kill-rectangle) para eliminar el texto y guardarlo como el último rectángulo eliminado. En ambos casos, borrar la región rectangular (región-rectángulo) es como borrar el texto especificado en cada línea del rectángulo; si hay algún texto siguiente en la línea, se mueve hacia atrás para rellenar el hueco.

Matar un rectángulo no es matar en el sentido habitual; el rectángulo no se almacena en el anillo de muertes, sino en un lugar especial que sólo registra el rectángulo matado más reciente. Esto se debe a que «yankear» un rectángulo (tirar o jalar de un rectángulo) es tan diferente de «yankear» un texto lineal que hay que utilizar diferentes comandos de «yankear». El «yank-popping» no está definido para los rectángulos.

Ctrl-x r Alt-w (C-x r M-w, copy-rectangle-as-kill) es el equivalente de M-w para rectángulos: registra el rectángulo como el último rectángulo eliminado, sin borrar el texto del búfer.

Para borrar el último rectángulo eliminado, escriba Ctrl-x ry (C-x r y, yank-rectangle). La primera línea del rectángulo se inserta en el punto, la segunda línea del rectángulo se inserta en la misma posición horizontal una línea verticalmente por debajo, y así sucesivamente. El número de líneas afectadas viene determinado por la altura del rectángulo guardado.

Por ejemplo, puede convertir dos listas de una columna en una lista de dos columnas matando una de las listas de una columna como un rectángulo y, a continuación, desplazándola al lado de la otra lista.

También puede copiar rectángulos dentro y fuera de registros con Ctrl-x rrr (C-x r r r) y Ctrl-x rir (C-x r i r). Consulte 14.3 Guardar Rectángulos en Registros.

Hay dos comandos que puede usar para hacer rectángulos en blanco: Ctrl-x rc (C-x r c, clear-rectangle) borra el texto existente en el rectángulo-región, y Ctrl-x ro (C-x r o, open-rectangle) inserta un rectángulo en blanco.

M-x delete-whitespace-rectangle elimina los espacios en blanco horizontales a partir de una columna determinada. Esto se aplica a cada una de las líneas del rectángulo, y la columna viene especificada por el borde izquierdo del rectángulo. El borde derecho del rectángulo no afecta a este comando.

El comando Ctrl-x rN (C-x r N, rectangle-number-lines) inserta números de línea a lo largo del borde izquierdo del rectángulo-región. Normalmente, la numeración comienza a partir de 1 (para la primera línea del rectángulo). Con un argumento prefijo, el comando pide un número a partir del cual empezar, y una cadena de formato con la que imprimir los números (ver Formato de Cadenas en el Manual de Referencia de Emacs Lisp).

El comando Ctrl-x r t (C-x r t, string-rectangle) reemplaza el contenido de una región-rectángulo con una cadena en cada línea. No es necesario que la anchura de la cadena sea la misma que la del rectángulo. Si la anchura de la cadena es menor, el texto después del rectángulo se desplaza a la izquierda; si la cadena es mayor que el rectángulo, el texto después del rectángulo se desplaza a la derecha.

El comando M-x string-insert-rectangle es similar a string-rectangle, pero inserta la cadena en cada línea, desplazando el texto original a la derecha.

El comando Ctrl-x SPACE (C-x SPC, rectangle-mark-mode) alterna si se resalta la región-rectángulo o la región estándar (activando primero la región si es necesario). Cuando este modo está activado, los comandos que redimensionan la región (C-f, C-n, etc.) lo hacen de forma rectangular, y matar y desplazar operan sobre el rectángulo. Véase 13 Matar y Mover Texto. El modo persiste sólo mientras la región está activa.

El rectángulo de la región sólo funciona cuando la marca está activa. En particular, cuando el modo Marca transitoria está desactivado (véase 12.7 Desactivar el Modo de Marca Transitoria), además de teclear Ctrl-x SPACE deberá activar la marca.

A diferencia de la región estándar, la región-rectángulo puede tener sus esquinas extendidas más allá del final del búfer, o dentro de tramos de espacio en blanco en los que normalmente no puede entrar el punto, como en medio de un carácter TAB.

Cuando la región está activa (véase 12 La marca y la región) y en modo región rectangular (rectangle-mark-mode), C-x C-x ejecuta el comando rectangle-exchange-point-and-mark, que realiza un ciclo entre las cuatro esquinas del rectángulo-región. Esto resulta útil si desea modificar las dimensiones de dicha región antes de invocar una operación sobre el texto marcado.

13.6 Enlaces CUA

El comando M-x cua-mode configura las combinaciones de teclas que son compatibles con el sistema de Acceso Común de Usuario (Common User Access, CUA) usado en muchas otras aplicaciones.

Cuando el modo CUA está activado, las teclas Ctrl-x (C-x), Ctrl-c (C-c), Ctrl-v (C-v) y Ctrl-z (C-z) invocan comandos que cortan (kill), copian, pegan (yank) y deshacen (undo) respectivamente. Las teclas Ctrl-x (C-x) y Ctrl-c (C-c) ejecutan cortar y copiar sólo si la región está activa. De lo contrario, siguen actuando como teclas de prefijo, de modo que los comandos estándar de Emacs como Ctrl-x Ctrl-c (C-x C-c) siguen funcionando. Tenga en cuenta que esto significa que la variable mark-even-if-inactive no tiene efecto para C-x y C-c (vea 12.3 Operar en la Región).

Para introducir un comando Emacs como Ctrl-x Ctrl-f (C-x C-f) mientras la marca está activa, use uno de los siguientes métodos: mantenga pulsada la tecla Mayúscula (Shift) junto con la tecla del prefijo, por ejemplo, Shift-Ctrl-x Ctrl-f (S-C-x C-f), o teclee rápidamente la tecla del prefijo dos veces, por ejemplo, Ctrl-x Ctrl-x Ctrl-f (C-x C-x C-f).

Para desactivar la anulación de la vinculación estándar de Emacs por el modo CUA, manteniendo las otras características del modo CUA descritas a continuación, establezca la variable cua-enable-cua-keys a nil.

El modo CUA activa por defecto el modo Borrar-Selección (Delete-Selection mode) (véase 22.1 Comandos del Ratón para Edición), de forma que el texto escrito sustituye a la región activa. Para utilizar CUA sin este comportamiento, establezca la variable cua-delete-selection en nil.

El modo CUA proporciona soporte mejorado para rectángulos con resaltado de rectángulo visible. Utilice Ctrl-RETURN (C-RET) para iniciar un rectángulo, extenderlo utilizando los comandos de movimiento, y cortarlo o copiarlo utilizando C-x o C-c. RET mueve el cursor a la siguiente esquina (en el sentido de las agujas del reloj) del rectángulo, para que pueda ampliarlo fácilmente en cualquier dirección. El texto normal que escriba se inserta a la izquierda o a la derecha de cada línea del rectángulo (en el mismo lado que el cursor).

Puede utilizar este soporte de rectángulo sin activar CUA llamando al comando cua-rectangle-mark-mode. También existe el comando estándar rectangle-mark-mode, véase 13.5 Rectángulos.

Con CUA puede copiar fácilmente texto y rectángulos dentro y fuera de los registros proporcionando un prefijo numérico de un dígito a los comandos kill, copy y yank, por ejemplo, Ctrl-1 Ctrl-c (C-1 C-c) copia la región en el registro 1, y Ctrl-2 Ctrl-v (C-2 C-v) yanks el contenido del registro 2.

El modo CUA también dispone de una función de marca global que permite mover y copiar texto fácilmente entre búferes. Utilice Ctrl-Shift-SPACE (C-S-SPC) para activar o desactivar la marca global. Cuando dicha marca está activada, todo el texto que mate o copie se inserta automáticamente en ella, y el texto que escriba se inserta en esta (en la marca global) en lugar de en la posición actual.

Por ejemplo, para copiar palabras de varios búferes en una lista de palabras de un búfer determinado, establezca la marca global en el búfer de destino, luego navegue hasta cada una de las palabras que desee en la lista, márquela (por ejemplo, con Shift-Alt-f (S-M-f)), cópiela en la lista con (C-c) o Alt-w (M-w), e inserte una nueva línea después de la palabra en la lista de destino pulsando RET.