20 Uso de Varios Búferes
El texto que está editando en Emacs reside en un objeto llamado búfer. Cada vez que visita un archivo, se usa un búfer para guardar el texto del archivo. Cada vez que invoca Dired, se usa un búfer para guardar el listado de directorios. Si envía un mensaje con C-x m
, se usa un búfer para guardar el texto del mensaje. Cuando se solicita la documentación de un comando, ésta aparece en un búfer llamado *Help*
(Ayuda).
Los búferes existen mientras están siendo usados, y son borrados («matados») cuando ya no son necesarios, ya sea por el Usuario (ver 20.4 Matar Búferes) o por Emacs (por ejemplo, cuando se sale del programa, ver 7 Cómo Salir de Emacs).
Cada búfer tiene un nombre único, que puede ser de cualquier longitud. Cuando un búfer se muestra en una ventana, su nombre se muestra en la línea de modo (ver 1.3 La Línea de Modo). La distinción entre mayúsculas y minúsculas es importante en los nombres de los búferes. La mayoría de los búferes se crean visitando archivos, y sus nombres se derivan de los nombres de los archivos; sin embargo, también se puede crear un búfer vacío con cualquier nombre que se desee. Un Emacs recién iniciado tiene varios búferes, incluyendo uno llamado *scratch*
, que puede usarse para evaluar expresiones Lisp y no está asociado a ningún archivo (ver 28.10. Búferes de Interacción Lisp).
En cualquier momento, sólo se selecciona un búfer, al que llamamos búfer actual. A veces decimos que un comando opera sobre «el búfer»; esto significa realmente que opera sobre el búfer actual. Cuando sólo hay una ventana Emacs, el búfer mostrado en esa ventana es el actual. Cuando hay múltiples ventanas, el búfer mostrado en la ventana seleccionada es el actual. Ver 21 Varias Ventanas.
El contenido de un búfer consiste en una serie de caracteres, cada uno de los cuales lleva opcionalmente un conjunto de propiedades de texto (ver 23.1 Introducción a los Juegos de Caracteres Internacionales) que pueden especificar más información sobre ese carácter.
Aparte de su contenido textual, cada búfer registra varios datos, como qué archivo está visitando (si lo hay), si está modificado y qué modos mayor y menor están en vigor (véase 24 Modos Mayores y Menores). Estos datos se almacenan en variables locales del búfer, variables que pueden tener un valor diferente en cada búfer. Véase 50.2.3 Variables Locales.
El tamaño de un búfer no puede ser mayor que un máximo, que está definido por la posición más grande del búfer representable por los enteros de Emacs. Esto se debe a que Emacs rastrea las posiciones del búfer usando ese tipo de datos. Para máquinas típicas de 64 bits, este tamaño máximo del búfer es 2^{61} - 2 bytes, o unos 2 EiB. Para máquinas típicas de 32 bits, el máximo suele ser 2^{29} - 2 bytes, o unos 512 MiB. El tamaño de los búferes también está limitado por la cantidad de memoria del sistema.
20.1 Creación y Selección de Búferes
Ctrl-x b búfer RETURN (C-x b
búfer RET
)
Selecciona o crea un búfer llamado búfer (
switch-to-buffer
).
Ctrl-x 4b (C-x 4 b
búfer RET
)
Similar, pero seleccionando búfer en otra ventana (
switch-to-buffer-other-window
).
Ctrl-x 5b (C-x 5 b
búfer RET
)
Similar, pero selecciona búfer en un marco separado (
switch-to-buffer-other-frame
).
Ctrl-x ← (C-x IZQUIERDA
)
Selecciona el búfer anterior en la lista de búferes (
previous-buffer
).
Ctrl-x → (C-x DERECHA
)
Selecciona el siguiente búfer de la lista de búferes (
next-buffer
).
C-u M-g M-g
)C-u M-g g
)Lee un número n y se desplaza a la línea n en el último búfer seleccionado distinto del búfer actual, en otra ventana.
El comando C-x b
(switch-to-buffer
) lee el nombre de un búfer usando el minibúfer. A continuación, actualiza ese búfer y lo muestra en la ventana seleccionada en ese momento. Una entrada vacía especifica el búfer que fue actual más recientemente entre los que no se muestran ahora en ninguna ventana.
Mientras escribe el nombre del búfer, puede usar los comandos habituales de completado e historial (véase 9 El Minibúfer). Tenga en cuenta que C-x b
, y los comandos relacionados, usan completado permisivo con confirmación para el completado del minibúfer: si teclea RETURN (RET
) cuando el texto del minibúfer nombra un búfer inexistente, Emacs imprime [Confirm]
(Confirmar) y debe teclear un segundo RETURN (RET
) para enviar ese nombre de búfer. Vea 9.4.3 Salida del Completado, para más detalles. Para otras opciones y características de completado, vea 24.3 Elección de los Modos de Archivo.
Si especifica un búfer que no existe, C-x b
crea un nuevo búfer vacío que no está visitando ningún archivo, y lo selecciona para editarlo. El valor por defecto de la variable major-mode
(modo-mayor) determina el modo mayor del nuevo búfer; el valor por defecto es el modo Fundamental. Véase 24.1 Modos Mayores (o Principales). Una razón para crear un nuevo búfer es usarlo para hacer notas temporales. Si intenta guardarlo, Emacs le preguntará por el nombre de archivo a usar, y el modo principal del búfer se restablecerá teniendo en cuenta ese nombre de archivo (vea 24.3 Elección de los Modos de Archivo).
Para cambiar convenientemente entre varios búferes, use los comandos C-x IZQUIERDA
y C-x DERECHA
. C-x IZQUIERDA
(previous-buffer
) selecciona el búfer anterior (siguiendo el orden de selección más reciente en el marco actual), mientras que C-x DERECHA
(next-buffer
) se desplaza por los búferes en sentido inverso. Ambos comandos admiten un argumento de prefijo numérico que sirve como recuento de repeticiones.
Para seleccionar un búfer en una ventana distinta de la actual (véase 21 Varias Ventanas), escriba Ctrl-x 4b (C-x 4 b
, switch-to-buffer-other-window
). Esto solicita un nombre de búfer usando el minibúfer, muestra ese búfer en otra ventana y selecciona esa ventana.
De forma similar, Ctrl-x 5b (C-x 5 b
, switch-to-buffer-other-frame
) pide un nombre de búfer, muestra ese búfer en otro marco (ver 22 Marcos y Pantallas Gráficas), y selecciona ese marco. Si el búfer ya está siendo mostrado en una ventana en otro marco, Emacs selecciona esa ventana y marco en lugar de crear un nuevo marco.
Ver 21.6. Mostrar un Búfer en una Ventana, para saber cómo los comandos C-x 4 b
y C-x 5 b
obtienen la ventana y/o el marco en el que se mostrará.
Además, C-x C-f
, y cualquier otro comando para visitar un archivo, también puede usarse para cambiar a un búfer de visita de archivo existente. Véase 19.2 Visitar Archivos.
C-u M-g M-g
, es decir goto-line
con un argumento de prefijo simple, lee un número n usando el minibúfer, selecciona el último búfer seleccionado que no sea el búfer actual en otra ventana, y luego mueve punto al principio de la línea número n en ese búfer. Esto es útil principalmente en un búfer que hace referencia a números de línea en otro búfer: si punto está sobre o justo después de un número, goto-line
usa ese número como el predeterminado para n. Tenga en cuenta que los argumentos de prefijo distintos de sólo C-u
se comportan de forma diferente. Ctrl-u 4 Alt-g Alt-g (C-u 4 M-g M-g
) va a la línea 4 en el búfer actual, sin leer un número del minibúfer. ( Recuerde que M-g M-g
sin argumento prefijo lee un número n y luego se mueve a la línea número n en el búfer actual. Ver 8.2 Cambiar la Ubicación del Punto).
Emacs usa nombres de búfer que empiezan con un espacio para propósitos internos. Trata estos búferes de forma especial en aspectos menores, por ejemplo, por defecto no registran información de deshacer. Es mejor evitar usar tales nombres de búfer.
20.2 Listado de Búferes Existentes
Ctrl-x Ctrl-b (C-x C-b
)
Lista los búferes existentes (
list-buffers
).
Para ver una lista de los búferes existentes, escriba Ctrl-x Ctrl-b (C-x C-b
). Aparecerá un menú de búferes en un búfer llamado *Buffer List*
(Lista de búferes). Cada línea de la lista muestra el nombre de un búfer, su tamaño, el modo principal y el archivo visitado. Los búferes se listan en el orden en que fueron actualizados; los búferes que fueron actualizados más recientemente aparecen en primer lugar. Esta sección describe cómo se muestra la lista de búferes y cómo interpretar las distintas indicaciones de la lista; véase 20.5 Trabajar con Varios Búferes, para una descripción del modo especial en el búfer *Buffer List*
y los comandos disponibles en él.
.
(punto) en el primer campo de una línea indica que el búfer es actual. %
indica que el búfer es de sólo lectura. *
indica que el búfer ha sido modificado. Si se modifican varios búferes, puede ser el momento de guardar algunos con C-x s
(ver 19.3.1 Comandos para Guardar Archivos). He aquí un ejemplo de lista de búferes:
CRM Buffer Size Mode File
. * .emacs 3294 Emacs-Lisp ~/.emacs
% *Help* 101 Help
search.c 86055 C ~/cvs/emacs/src/search.c
% src 20959 Dired by name ~/cvs/emacs/src/
* *mail* 42 Mail
% HELLO 1607 Fundamental ~/cvs/emacs/etc/HELLO
% NEWS 481184 Outline ~/cvs/emacs/etc/NEWS
*scratch* 191 Lisp Interaction
* *Messages* 1554 Messages
El búfer *Help*
fue hecho por una petición de ayuda (ver 11 Ayuda); no está visitando ningún archivo. El búfer src
fue creado por Dired en el directorio ~/cvs/emacs/src/
. Puede listar sólo los búferes que están visitando archivos dando al comando un argumento prefijo, como en C-u C-x C-b
.
list-buffers
omite los búferes cuyos nombres comienzan con un espacio, a menos que visiten archivos: tales búferes son usados internamente por Emacs.
20.3 Operaciones Varias del Búfer
Ctrl-x Ctrl-q (C-x C-q
)
Conmuta el estado de sólo lectura del búfer (
read-only-mode
, modo de sólo lectura).
Ctrl-x rRETURN nombre-búfer RETURN (C-x x r RET
nombre-búfer RET
)
Modifica el nombre del búfer actual.
Ctrl-x x u (C-x x u
)
Renombra el búfer actual añadiendo <número> al final.
Alt-x view-buffer
RETURN búfer RETURN (M-x view-buffer RET
búfer RET
)
Se desplaza por el búfer. Véase 15.6 Modo Vista.
Un búfer puede ser de sólo lectura, lo que significa que los comandos para insertar o borrar su texto no están permitidos. (Sin embargo, otros comandos, como C-x RET f
, pueden marcarlo como modificado, véase 23.9 Especificar un Sistema de Codificación para el Texto de un Archivo). La línea de modo indica búferes de sólo lectura con %%
o %*
cerca del margen izquierdo. Vea 1.3 La Línea de Modo. Los búferes de sólo lectura son normalmente hechos por subsistemas como Dired y Rmail que tienen comandos especiales para operar sobre el texto. Visitar un archivo cuyo control de acceso dice que no se puede escribir también hace que el búfer sea de sólo lectura.
El comando C-x C-q
(read-only-mode
) hace que un búfer de sólo lectura sea escribible, y hace que un búfer escribible sea de sólo lectura. Esto funciona estableciendo la variable buffer-read-only
, que tiene un valor local en cada búfer y hace que el búfer sea de sólo lectura si su valor no es nulo. Si se cambia la opción view-read-only
a un valor no nulo, al hacer que el búfer sea de sólo lectura con C-x C-q
también se activa el modo Vista en el búfer (véase 15.6 Modo Vista).
C-x x r
(rename-buffer
cambia el nombre del búfer actual. Se especifica el nuevo nombre como argumento del minibúfer; no hay un valor por defecto. Si especifica un nombre que está siendo usado por algún otro búfer, se produce un error y no se realiza el renombrado.
C-x x u
(rename-uniquely
) renombra el búfer actual a un nombre similar con un sufijo numérico añadido para hacerlo diferente y único. Este comando no necesita argumento. Es útil para crear múltiples búferes de shell: si renombra el búfer *shell*
, y luego hace M-x shell
de nuevo, se crea un nuevo búfer de shell llamado *shell*
; mientras tanto, el antiguo búfer de shell sigue existiendo con su nuevo nombre. Este método también es bueno para búferes de correo, búferes de compilación, y la mayoría de las características de Emacs que crean búferes especiales con nombres particulares. (Con algunas de estas características, como M-x compile
, M-x grep
, necesita cambiar a algún otro búfer antes de volver a usar el comando, de lo contrario reutilizará el búfer actual a pesar del cambio de nombre).
Los comandos M-x append-to-buffer
y C-x x i
(insert-buffer
) también se pueden usar para copiar texto de un búfer a otro. Véase 13.4 Acumular Texto.
20.4 Matar Búferes
Si continúa una sesión Emacs durante un tiempo, puede acumular un gran número de búferes. Entonces puede que encuentre conveniente matar los búferes que ya no necesita. (Algunos otros editores a esta operación la llaman cerrar, y hablan de «cerrar el búfer» o «cerrar el archivo» visitado en el búfer). En la mayoría de los sistemas operativos, matar un búfer libera la memoria que Emacs usó para el búfer de vuelta al sistema operativo para que otros programas puedan usarla. Aquí tiene algunos comandos para matar búferes:
Ctrl-x k búfer RETURN (C-x k
búfer RET
)
Mata el búfer de nombre búfer (
kill-buffer
).
Alt-x kill-some-buffers
(M-x kill-some-buffers
)
Ofrece matar a cada búfer, uno por uno.
Alt-x kill-matching-buffers
(M-x kill-matching-buffers
)
Ofrece eliminar todos los búferes que coincidan con una expresión regular.
C-x k
(kill-buffer
) elimina un búfer, cuyo nombre se especifica en el minibúfer. El valor por defecto, usado si sólo escribe RETURN (RET
) en el minibúfer, es matar el búfer actual. Si elimina el búfer actual, otro búfer se convierte en actual: uno que fue actual con anterioridad pero que ahora no se muestra en ninguna ventana. Si pide que se elimine un búfer que está visitando un archivo y que ha sido modificado, debe confirmar con un yes
(sí) antes de que se elimine el búfer.
El comando M-x kill-some-buffers
(kill-some-buffers
) pregunta sobre cada búfer, uno por uno. Una respuesta afirmativa significa matar el búfer, igual que kill-buffer
. Este comando ignora los búferes cuyos nombres comienzan con un espacio, los cuales son usados internamente por Emacs.
El comando M-x kill-matching-buffers
pide una expresión regular y mata todos los buffers cuyos nombres coinciden con esa expresión. Ver 16.6 Sintaxis de las Expresiones Regulares. Al igual que kill-some-buffers
, pide confirmación antes de cada eliminación. Este comando normalmente ignora los búferes cuyos nombres comienzan con un espacio, los cuales son usados internamente por Emacs. Para matar también búferes internos, llame a kill-matching-buffers
con un argumento prefijo.
La función Menú Búfer también resulta práctica para matar varios búferes. Ver 20.5 Trabajar con Varios Búferes.
Si desea hacer algo especial cada vez que un búfer es matado, puede añadir funciones hook (funciones de gancho) al gancho kill-buffer-hook
(vea 50.2.2 Ganchos (Hooks)).
Si ejecuta una sesión de Emacs durante un periodo de días, como hace mucha gente, puede llenarse de búferes que usó hace mucho tiempo. El comando M-x clean-buffer-list
es una forma conveniente de purgarlos; mata todos los búferes no modificados que no ha usado durante un periodo largo de tiempo. Un búfer normal se elimina si no se ha visualizado durante tres días; sin embargo, puede especificar ciertos búferes que nunca deben eliminarse automáticamente, y otros que deben eliminarse si no se han utilizado durante una hora. Estos valores predeterminados, y otros aspectos del comportamiento de este comando, pueden controlarse personalizando varias opciones descritas en la cadena doc de clean-buffer-list
.
También puede hacer que esta purga del búfer se realice por usted, una vez al día, activando el modo Medianoche. El modo Medianoche funciona cada día a medianoche; a esa hora, se ejecuta clean-buffer-list
, o cualquier función que haya colocado en el gancho normal midnight-hook
(ver 50.2.2 Ganchos (Hooks)). Para activar Midnight mode (modo Medianoche), use el búfer de personalización para establecer la variable midnight-mode
a t
. Vea 50.1 Interfaz de Personalización Fácil.
20.5 Trabajar con Varios Búferes
Alt-x buffer-menu
(M-x buffer-menu
)
Empieza a editar un búfer que enumera todos los búferes de Emacs.
Alt-x buffer-menu-other-windows
(M-x buffer-menu-other-window
)
Similar, pero lo hacer en otra ventana.
El Menú de Búferes abierto por C-x C-b
(ver 20.2 Listado de Búferes Existentes) no se limita a listar búferes. También le permite realizar varias operaciones en ellos, a través de una interfaz similar a Dired (ver 31 Dired, el Editor de Directorios). Puede guardar búferes, eliminarlos (lo que aquí se llama borrarlos, por coherencia con Dired), o mostrarlos.
Para usar el menú de búferes, escriba C-x C-b
y cambie a la ventana que muestra el búfer *Buffer List*
(Lista de búferes). También puede teclear M-x búfer-menú
para abrir el Menú Búfer en la ventana seleccionada. Alternativamente, el comando M-x buffer-menu-other-window
abre el Menú Búfer en otra ventana, y selecciona esa ventana.
El Menú Búfer es un búfer de sólo lectura, y sólo puede modificarse mediante los comandos especiales descritos en esta sección. En este búfer se pueden utilizar los comandos habituales de movimiento del cursor. Los siguientes comandos se aplican al búfer descrito en la línea actual:
d (d
)
Marca el búfer para borrado (
killing
), luego mueve el punto a la línea siguiente (buffer-menu-delete
). La bandera de borrado se indica mediante el carácterD
en la línea, antes del nombre del búfer. El borrado sólo se produce cuando se teclea el comando x (x
) (véase más abajo).
Ctrl-d (C-d
)
Como
d
, pero mueve el punto hacia arriba en lugar de hacia abajo (Buffer-menu-delete-backwards
).
s (s
)
Marca el búfer para guardarlo (
Buffer-menu-save
). La marca de guardar se indica mediante el carácterS
en la línea, antes del nombre del búfer. El almacenamiento sólo se produce cuando se teclea x (x
). Puede solicitar tanto el almacenamiento como el borrado del mismo búfer.
x (x
)
Ejecuta todos los borrados y guardados marcados (
Búfer-menu-execute
).
u (u
)
Elimina todas las banderas de la línea actual y se desplaza hacia abajo (
Búfer-menú-unmark
). Con un argumento prefijo, se mueve hacia arriba después de eliminar las banderas.
DEL (DEL
)
Se mueve a la línea anterior y elimina todas las banderas de esa línea (
Buffer-menú-backup-unmark
).
Alt-DEL (M-DEL
)
Elimina una marca determinada de todas las líneas (
Buffer-menu-unmark-all-buffers
). Esto pide un único carácter, y desmarca los búferes marcados con ese carácter; tecleando RETURN (RET
) se eliminan todas las marcas.
U (U
)
Elimina todas las banderas de todas las líneas (
Buffer-menu-unmark-all
).
Los comandos para eliminar banderas, d
y C-d
, aceptan un argumento numérico como recuento de repeticiones.
Los siguientes comandos operan inmediatamente en el búfer listado en la línea actual. También aceptan un argumento numérico como contador de repeticiones.
~ (~
)
Marca el búfer como no modificado (
Buffer-menu-not-modified
). Consulte 19.3.1 Comandos para Guardar Archivos.
% (%
)
Conmuta el estado de sólo lectura del búfer (
Buffer-menu-toggle-read-only
). Véase 20.3 Operaciones Varias del Búfer.
t (t
)
Visita el búfer como tabla de etiquetas (
Buffer-menu-visit-tags-table
). Véase 29.4.3. Seleccionar una Tabla de Etiquetas.
Los siguientes comandos se emplean para seleccionar otro búfer o búferes:
q (q
)
Salir del menú de búferes (
quit-window
). En su lugar aparece el búfer visible más reciente.
RET
)f
)Selecciona el búfer de esta línea, sustituyendo al búfer
*Buffer List*
de su ventana (Buffer-menu-this-window
).
o (o
)
Selecciona el búfer de esta línea en otra ventana, como por
C-x 4 b
, dejando visible*Buffer List*
(Buffer-menu-other-window
).
Ctrl-o (C-o
)
Muestra el búfer de esta línea en otra ventana, sin seleccionarla (
Buffer-menu-switch-other-window
).
1 (1
)
Selecciona el búfer de esta línea en una ventana a pantalla completa (
Buffer-menu-1-window
).
2 (2
)
Establece dos ventanas en el marco actual, con el búfer de esta línea seleccionado en una, y un búfer previamente actual (aparte de
*Buffer List*
) en la otra (Buffer-menu-2-window
).
b (b
)
Entierra el búfer de esta línea (
Buffer-menu-bury
) (es decir, lo mueve al final de la lista de búferes).
m (m
)
Marca el búfer de esta línea para que se muestre en otra ventana si sale con el comando
v
(Buffer-menu-mark
). La marca de visualización se indica con el carácter>
al principio de la línea. (Un mismo búfer no puede tener a la vez banderas de borrado y de visualización).
v (v
)
Selecciona el búfer de esta línea y muestra también en otras ventanas los búferes marcados con el comando
m
(Buffer-menu-select
). Si no ha marcado ningún búfer, este comando equivale a1
.
Los siguientes comandos afectan a toda la lista de búferes:
S (S
)
Ordena las entradas del menú búfer según sus valores en la columna en cuestión. Con un argumento prefijo numérico n, ordena según la columna n-ésima (
tabulated-list-sort
).
} (}
)
Amplía el ancho de la columna actual en n (el argumento numérico del prefijo) caracteres.
{ ({
)
Reduce el ancho de la columna actual en n (el argumento numérico del prefijo) caracteres.
T (T
)
Borra, o reinserta, las líneas de los búferes que no son archivos (
Buffer-menu-toggle-files-only
). Este comando activa la inclusión de dichos búferes en la lista de búferes.
Normalmente, el búfer *Buffer List*
no se actualiza automáticamente cuando se crean y eliminan búferes; su contenido es sólo texto. Si ha creado, borrado o renombrado búferes, la forma de actualizar *Buffer List*
para mostrar lo que ha hecho es teclear g
(revert-buffer
). Puede hacer que esto ocurra regularmente cada auto-revert-interval
de segundos si activa el modo Auto Revert en este búfer, siempre y cuando no esté marcado como modificado. El modo de reversión automática global se aplica al búfer *Buffer List*
sólo si global-auto-revert-non-file-bufferspp es distinto de ``nil
. Véase 19.5.1.1 Reversión Automática del Menú de Búferes, para más detalles.
20.6 Búferes Indirectos
Un búfer indirecto comparte el texto de algún otro búfer, que se denomina búfer base del búfer indirecto. En cierto modo, es un búfer análogo a un enlace simbólico entre archivos.
make-indirect-buffer
RETURN búfer-base RETURN nombre-indirecto RETURNM-x make-indirect-buffer RET
búfer-base RET
nombre-indirecto RET
)Crea un búfer indirecto llamado nombre-indirecto con búfer-base.
Atl-x clone-indirect-búfer
RETURN (M-x clone-indirect-buffer RET
)
Crea un búfer indirecto que es una copia gemela del búfer actual.
Ctrl-x 4c (C-x 4 c
)
Crea un búfer indirecto que es una copia gemela del búfer actual y lo selecciona en otra ventana (
clone-indirect-buffer-other-window
).
El texto del búfer indirecto es siempre idéntico al texto de su búfer base; los cambios realizados al editar cualquiera de ellos son visibles inmediatamente en el otro. En este caso, «texto» incluye tanto los caracteres como sus propiedades de texto. Por lo demás, el búfer indirecto y su búfer base son completamente independientes. Pueden tener nombres diferentes, valores de punto diferentes, estrechamientos diferentes, marcadores diferentes, superposiciones diferentes, modos principales diferentes y variables locales diferentes.
Un búfer indirecto no puede visitar un archivo, pero su búfer base sí. Si intenta guardar el búfer indirecto, en realidad lo que hace es guardar el búfer base. Matar el búfer base efectivamente mata al búfer indirecto, pero matar un búfer indirecto no tiene efecto sobre su búfer base.
Una forma de utilizar los búferes indirectos es mostrar múltiples vistas de un contorno. Consulte 26.9.5 Visualización de un Esquema en Varias Vistas.
Una forma rápida y práctica de crear un búfer indirecto es con el comando C-x 4 c
(clone-indirect-buffer-other-window
). Crea y selecciona un búfer indirecto cuyo búfer base es el búfer actual. Con un argumento numérico, pide el nombre del búfer indirecto; de lo contrario, usa el nombre del búfer actual, con un sufijo <n>
añadido.
La forma más general de crear un búfer indirecto es con el comando M-x make-indirect-buffer
. Crea un búfer indirecto llamado nombre-indirecto a partir de un búfe-base, solicitando ambos usando el minibúfer.
Las funciones que crean búferes indirectos ejecutan el gancho clone-indirect-buffer-hook
después de crearlos. Cuando se ejecuta este gancho (hook), el búfer indirecto recién creado es el búfer actual.
Nota
Cuando se realiza una modificación en el texto de un búfer, los ganchos de modificación se ejecutan sólo en el búfer base, porque la mayoría de las funciones de esos ganchos no están preparadas para funcionar correctamente en búferes indirectos. Así que si necesita una función de gancho de modificación en un búfer indirecto, necesita añadir manualmente esa función al gancho en el búfer base y luego hacer que la función opere en el búfer indirecto que se desea.
20.7 Funciones Convenientes y Personalización del Manejo de Búferes
Esta sección describe varios modos y características que hacen más cómodo el cambio entre búferes.
20.7.1 Hacer que los Nombres de los Búferes sean Únicos
Cuando varios búferes visitan archivos con nombres idénticos, Emacs debe dar a estos búferes nombres distintos. El método por defecto añade un sufijo basado en los nombres de los directorios que contienen los archivos. Por ejemplo, si visita los archivos /foo/bar/nombre/numble
y /baz/quux/nombre/mumble
al mismo tiempo, sus búferes se llamarán nombre<bar/mumble>
y nombre<quux/mumble>
, respectivamente. Emacs añade tantas partes de directorio como sean necesarias para hacer un nombre único.
Puede elegir entre varios estilos diferentes para construir nombres de búfer únicos, personalizando la opción uniquify-buffer-name-style
.
El método de nombrar hacia adelante incluye parte del nombre del directorio del archivo al principio del nombre del búfer; usando este método, los búferes que visitan los archivos /u/rms/tmp/Makefile
y /usr/projects/zaphod/Makefile
se llamarían tmp/Makefile
y zaphod/Makefile
.
Por el contrario, el método de nomenclatura post-forward
llamaría a los búferes Makefile|tmp
y Makefile|zaphod
. El método por defecto post-forward-angle-brackets
es como post-forward
, excepto que encierra la ruta única entre corchetes angulares. El método inverso los llamaría Makefile\tmp
y Makefile\zaphod
. La diferencia no trivial entre post-forward
y reverse
se produce cuando sólo un nombre de directorio no es suficiente para distinguir dos archivos; entonces reverse
pone los nombres de directorio en orden inverso, de modo que /top/middle/file
se convierte en file\middle\top
, mientras que post-forward
los pone en orden hacia delante después del nombre del archivo, como en file|top/middle
. Si uniquify-buffer-name-style
se establece en nil
, los nombres de búfer simplemente se añaden <2>
, <3>
, etc.
El valor de uniquify-búfer-name-style
puede establecerse en una función personalizada con dos argumentos base y cadenas-adicionales donde base es una cadena y cadenas-adicionales es una lista de cadenas. Por ejemplo, la implementación actual para los post-forward-angle-brackets
(corchetes posteriores al ángulo delantero) podría ser:
(defun my-post-forward-angle-brackets (base extra-string)
(concat base \"<\" (mapconcat #'identity extra-string \"/\") \">\"))
Qué regla seguir para poner los nombres de directorio en el nombre del búfer no es muy importante si va a mirar los nombres del búfer antes de escribir uno. Pero como Usuario experimentado, si conoce la regla, no tendrá que mirar. Y puede que descubra que una regla u otra le resulta más fácil de recordar y aplicar rápidamente.
20.7.2 Selección Rápida del Minibúfer
El modo menor global Icomplete proporciona una forma cómoda de seleccionar rápidamente un elemento entre las posibles terminaciones de un minibúfer. Cuando está activado, al escribir en el minibúfer se muestra continuamente una lista de posibles terminaciones que coinciden con la cadena que ha escrito.
En cualquier momento, puede teclear Ctrl-j (C-j
) para seleccionar la primera terminación de la lista. Por tanto, la forma de seleccionar una terminación concreta es hacer que sea la primera de la lista. Hay dos formas de hacerlo. Puede escribir más del nombre de la terminación y así reducir la lista, excluyendo las terminaciones no deseadas por encima de la deseada. Alternativamente, puede usar Ctrl-. (C-.
) y Ctrl-, (C-,
) para rotar la lista hasta que el búfer deseado sea el primero.
M-TAB
seleccionará la primera terminación de la lista, como C-j
pero sin salir del minibúfer, para que pueda seguir editándola. Esto se utiliza normalmente al introducir un nombre de archivo, donde M-TAB
puede utilizarse varias veces para descender en la jerarquía de directorios.
Para activar el modo Icomplete, escriba Alt-x icomplete-mode
(M-x icomplete-mode
), o personalice la variable icomplete-mode
a t
(véase 50.1 Interfaz de Personalización Fácil).
Una alternativa al modo Icomplete es el modo Fido. Este es muy similar al modo Icomplete, pero conserva algunas funcionalidades de una extensión popular llamada modo Ido (de hecho el nombre deriva de «Fake Ido»). Entre otras cosas, en el modo Fido, C-s
y C-r
también se usan para rotar la lista de completados, C-k
puede usarse para borrar archivos y matar búferes en la lista. Otro aspecto destacable es que flex se utiliza como estilo de completado por defecto (ver 9.4.4. Cómo se Eligen las Alternativas de Completado). Para cambiar esto, añada lo siguiente a su archivo de inicialización (vea 50.4. El Archivo de Inicialización de Emacs):
(defun my-icomplete-styles ()
(setq-local completion-styles '(initials flex)))
(add-hook 'icomplete-minibuffer-setup-hook 'my-icomplete-styles)
Para activar el modo Fido, escriba Alt-x fido-mode
(M-x fido-mode
), o personalice la variable fido-mode
a t
(consulte 50.1 Interfaz de Personalización Fácil).
El modo Icomplete y el modo Fido muestran por defecto las posibles terminaciones en la misma línea que el prompt. Para mostrar los candidatos a completado verticalmente debajo de este, escriba Alt-x icomplete-vertical-mode
(M-x icomplete-vertical-mode
), o personalice la variable icomplete-vertical-mode
a t
(ver 50.1 Interfaz de Personalización Fácil).