30 Abreviaturas

Una abreviatura definida es una palabra que se expande, si la inserta, en un texto diferente. Los abreviaturas son definidas por el Usuario para que se expandan de formas específicas. Por ejemplo, puede definir “foo” como una abreviatura que se expande a “encontrar nutria exterior”. A continuación, puede insertar «encontrar nutria exterior» en el búfer escribiendo f o o SPC.

Un segundo tipo de abreviatura se denomina expansión dinámica de abreviaturas. Usted usa la expansión dinámica de abreviaturas con un comando explícito para expandir las letras en el búfer antes del punto buscando otras palabras en el búfer que empiecen con esas letras. Véase Expansión Abreviada Dinámica.

Un tercer tipo, la expansión hippie, generaliza la expansión de abreviaturas. Véase Expansión Hippie en Características de la Escritura Automática.

30.1 Conceptos de Abreviatura

Una abreviatura es una palabra que ha sido definida para expandirse en una expansión específica. Cuando se inserta un carácter separador de palabras después de la abreviatura, ésta se expande, sustituyendo la abreviatura por su expansión. Por ejemplo, si «foo» se define como una abreviatura que se expande a «encontrar nutria exterior», al escribir f o o . se insertará «encontrar nutria exterior».

Los abreviaturas sólo se expanden cuando está activado el modo Abbrev, un modo menor localizado en el búfer. Desactivar el modo Abbrev no hace que se olviden las definiciones abbrev, pero no se expanden hasta que se activa de nuevo el modo Abbrev. El comando M-x abbrev-mode activa el modo Abbrev; con un argumento numérico, activa el modo Abbrev si el argumento es positivo y lo desactiva en caso contrario. Véase Modos Menores.

Los abreviaturas pueden tener definiciones específicas de modo, activas sólo en un modo principal. Las abreviaturas también pueden tener definiciones globales activas en todos los modos principales. La misma abreviatura puede tener una definición global y varias definiciones específicas de modo para diferentes modos principales. Una definición específica para el modo principal actual anula una definición global.

Puede definir abreviaturas de forma interactiva durante la sesión de edición, independientemente de si el modo Abreviatura está activado o no. También puede guardar listas de definiciones abreviadas en archivos, que podrá volver a cargar para usarlas en sesiones posteriores.

30.2 Definición de Abreviaturas

C-x a g

Define una abreviatura, usando una o más palabras antes del punto como su expansión (add-global-abbrev).

C-x a l

Similar, pero define una abreviatura específica para el modo principal actual (add-mode-abbrev).

C-x a i g

Define una palabra del búfer como abreviatura (inverse-add-global-abbrev).

C-x a i l

Define una palabra del búfer como abreviatura específica de un modo (inverse-add-mode-abbrev).

M-x define-global-abbrev RET abbrev RET exp RET

Define abbrev como una abreviatura que se expande en exp.

M-x define-mode-abbrev RET abbrev RET exp RET

Define abbrev como una abreviatura específica del modo que se expande en exp.

M-x kill-all-abbrevs

Descarta todas las definiciones abreviadas, dejando una pantalla en blanco.

La forma habitual de definir una abreviatura es introducir el texto que desea que se expanda, situar el punto después de él y escribir C-x a g (add-global-abbrev). Esto lee la abreviatura misma usando el minibúfer, y luego la define como abreviatura para una o más palabras antes de punto. Use un argumento numérico para especificar cuántas palabras antes del punto deben tomarse como expansión. Por ejemplo, para definir la abreviatura «foo» como se ha mencionado anteriormente, inserte el texto «encontrar nutria exterior» y, a continuación, escriba C-u 3 C-x a g f o o RET.

Si está usando el modo transient-mark (que es el predeterminado), se usará la región activa como expansión de la abreviatura que se está definiendo. Si no, un argumento de cero a C-x a g significa usar el contenido de la región.

El comando C-x a l (add-mode-abbrev) es similar, pero define una abreviatura específica para el modo principal actual. Los argumentos funcionan igual que para C-x a g.

C-x a i g (inverse-add-global-abbrev) y C-x a i l (inverse-add-mode-abbrev) realizan la tarea contraria: si el texto abreviado ya está en el búfer, se usan estos comandos para definir un abreviado especificando la expansión en el minibúfer. Estos comandos expandirán el texto abreviado usado para la definición.

Puede usar el comando define-global-abbrev para definir una abreviatura sin insertar ni la abreviatura ni su expansión en el búfer. Este comando lee dos argumentos: la abreviatura y su expansión. La orden define-abbrev-de-modo hace lo mismo para un abreviatura específica de un modo.

Para cambiar la definición de una abreviatura, basta con crear una nueva definición. Cuando un abbrev tiene una definición anterior, los comandos de definición de abbrev piden confirmación antes de sustituirla.

Para eliminar una definición de abreviatura, dé un argumento negativo al comando de definición de abreviatura: C-u - C-x a g o C-u - C-x a l. La primera elimina una definición global, mientras que la segunda elimina una definición específica de un modo. M-x kill-all-abbrevs elimina todas las definiciones de abreviatura, tanto globales como locales.

30.3 Control de la Expansión de Abreviaturas

Cuando el modo Abbrev está activado, un abbrev se expande siempre que esté presente en el búfer justo antes del punto y escriba un espacio en blanco autoinsertado o un carácter de puntuación (SPC, coma, etc.). Más concretamente, cualquier carácter que no sea un constituyente de palabra expande un abbrev, y cualquier carácter constituyente de palabra puede formar parte de un abbrev. La forma más común de usar una abreviatura es insertarla y luego insertar un carácter de puntuación o de espacio en blanco para expandirla.

La expansión de abreviaturas conserva mayúsculas y minúsculas: “foo” se expande a “encontrar nutria exterior”, y “Foo” a “encontrar nutria exterior”. Por defecto, “FOO” se expande a “Encontrar Nutria Exterior”, pero si cambia la variable abbrev-all-caps a un valor no nulo, se expande a “Encontrar Nutria Exterior”.

Estos comandos se usan para controlar la expansión de las abreviaturas:

M-”

Separa un prefijo de la abreviatura siguiente que se va a expandir (abbrev-prefix-mark).

C-x a e

Expande la abreviatura antes del punto (expand-abbrev). Esto es efectivo incluso cuando el modo Abbrev no está activado.

M-x unexpand-abbrev

Deshace la expansión de la última abreviatura expandida.

M-x expand-region-abbrevs

Amplía algunas o todas las abreviaturas de la región.

Es posible que desee expandir una abreviatura y adjuntar un prefijo a la expansión; por ejemplo, si «cnst» se expande en «construcción», es posible que desee usarlo para introducir «reconstrucción». No funciona escribir recnst, porque no es necesariamente una abreviatura definida. Lo que puede usar es el comando M-” (abbrev-prefix-mark, marca de prefijo de abreviatura) entre el prefijo “re” y la abreviatura “cnst”. Primero, inserte «re». A continuación, escriba M-”; esto inserta un guión en el búfer para indicar que ha hecho su trabajo. A continuación, introduzca la abreviatura “cnst”; el búfer contendrá ahora “re-cnst”. Ahora inserte un carácter no-palabra para expandir la abreviatura “cnst” a “construction”. Este paso de expansión también borra el guión que indicaba que se había usado “M-”. El resultado es la «reconstrucción» deseada.

Si lo que realmente desea es el texto de la abreviatura en el búfer, en lugar de su expansión, puede conseguirlo insertando la siguiente puntuación con C-q. Así, foo C-q , deja “foo,” en el búfer, sin expandirlo.

Si expande una abreviatura por error, puede deshacer la expansión tecleando C-/ (deshacer). Véase Deshacer. Esto deshace la inserción de la expansión abreviada y devuelve el texto abreviado. Si el resultado que desea es el carácter no-palabra de terminación más la abreviatura sin expandir, debe volver a insertar el carácter de terminación, citándolo con C-q. También puede usar el comando M-x unexpand-abbrev para cancelar la última expansión sin borrar el carácter de terminación.

M-x expand-region-abbrevs busca en la región las abreviaturas definidas, y para cada una que encuentra ofrece sustituirla por su expansión. Este comando es útil si ha escrito texto usando abreviaturas pero olvidó activar primero el modo Abreviatura. También puede ser útil junto con un conjunto especial de definiciones de abreviaturas para realizar varias sustituciones globales a la vez. Este comando es efectivo incluso si el modo Abbrev no está activado.

La función expand-abbrev realiza la expansión llamando a la función que abbrev-expand-function especifica. Cambiando esta función puede realizar cambios arbitrarios en la expansión abbrev. Ver Expansion de Abreviaturas en el Manual de Referencia de Emacs Lisp.

30.4 Sugerencias de Abreviaturas

Puede obtener sugerencias de abreviaturas cuando escriba manualmente un texto para el que haya una abreviatura definida activa. Por ejemplo, si hay una abreviatura “foo” con la expansión “encuentra nutria exterior”, y escribe manualmente “encuentra nutria exterior”, Emacs puede notarlo y mostrar una sugerencia en el área de eco cuando haya dejado de escribir.

Para activar la función de sugerencia de abreviaturas, personalice la opción abbrev-suggest a un valor no nulo.

La variable abbrev-suggest-hint-threshold controla cuándo sugerir una abreviatura al Usuario. Esta variable define el ahorro mínimo (en términos del número de caracteres que el Usuario no tendrá que teclear) requerido para que Emacs sugiera usar una abreviatura. Por ejemplo, si el Usuario escribe “foo bar” (siete caracteres) y hay una abreviatura “fubar” definida (cinco caracteres), el Usuario no obtendrá ninguna sugerencia a menos que el umbral se establezca en el número 2 o inferior. Con el valor por defecto 3, el Usuario no obtendría ninguna sugerencia en este ejemplo, porque el valor de ahorro al usar la abreviatura está por debajo del umbral. Si desea obtener siempre sugerencias de abbrev, establezca el valor de esta variable en cero.

El comando abbrev-suggest-show-report muestra un búfer con todas las sugerencias abbrev mostradas durante la sesión de edición actual. Esto puede ser útil si recibe varias sugerencias de abreviaturas y no las recuerda todas.

30.5 Examen y Edición de Abreviaturas

M-x list-abbrevs

Muestra una lista de todas las definiciones de abreviaturas. Con un argumento numérico, muestra sólo las abreviaturas locales.

M-x edit-abbrevs

Edita una lista de abreviaturas; puede añadir, modificar o eliminar definiciones.

La salida de M-x list-abbrevs tiene este aspecto:

various other tables… (lisp-mode-abbrev-table) «ks» 0 «keymap-set» (global-abbrev-table) «dfn» 0 «definition»

otras tablas… (lisp-mode-abbrev-table) «ks» 0 «keymap-set» (conjunto de mapas de teclas) (global-abbrev-table) «dfn» 0 «definition» (definición)

(Se han omitido algunas líneas en blanco sin significado semántico y algunas otras tablas de abreviaturas).

Una línea que contenga un nombre entre paréntesis es la cabecera de las abreviaturas de una tabla de abreviaturas concreta; global-abbrev-table contiene todas las abreviaturas globales, y las demás tablas de abreviaturas que llevan el nombre de los modos principales contienen las abreviaturas específicas de cada modo.

Dentro de cada tabla de abreviaturas, cada línea que no esté en blanco define una abreviatura. La palabra al principio de la línea es la abreviatura. El número que sigue es el número de veces que la abreviatura ha sido expandida. Emacs lleva la cuenta de esto para ayudarlo a ver qué abreviaturas usa realmente, de modo que pueda eliminar las que no usa a menudo. La cadena al final de la línea es la expansión.

Algunos abreviaturas están marcadas con “(sys)”. Estos abreviaturas del sistema (vea Abreviaturas en el Manual de Referencia de Emacs Lisp) están predefinidas por varios modos, y no se guardan en su archivo de abreviaturas. Para desactivar una abreviatura del sistema, defina una abreviatura con el mismo nombre que se expanda a sí misma y guárdela en su archivo de abreviaturas.

M-x edit-abbrevs le permite añadir, cambiar o eliminar definiciones de abreviaturas editando una lista de ellas en un búfer de Emacs. La lista tiene el mismo formato descrito anteriormente. El búfer de abreviaturas se llama Abbrevs, y está en modo Edit-Abbrevs. Teclee C-c C-c en este búfer para instalar las definiciones de abreviaturas tal y como se especifican en el búfer-y borrar cualquier definición de abreviatura que no esté en la lista.

El comando edit-abbrevs es en realidad el mismo que list-abbrevs, salvo que selecciona el búfer Abbrevs mientras que list-abbrevs simplemente lo muestra en otra ventana.

30.6 Guardar Abreviaturas

Estos comandos le permiten guardar las definiciones de abreviaturas entre sesiones de edición.

M-x write-abbrev-file RET archivo RET

Escribe un archivo que contiene todas las abreviaturas definidas.

M-x read-abbrev-file RET archivo RET

Lee el archivo y define las abreviaturas tal y como se especifican en él.

M-x define-abbrevs

Establece las abreviaturas a partir de las definiciones del búfer actual.

M-x insert-abbrevs

Inserta todas las abreviaturas y sus expansiones en el búfer actual.

M-x write-abbrev-file lee un nombre de archivo usando el minibúfer y luego escribe una descripción de todas las definiciones abreviadas actuales en ese archivo. Esto se utiliza para guardar definiciones abreviadas para usarlas en una sesión posterior. El texto almacenado en el archivo es una serie de expresiones Lisp que, cuando se ejecutan, definen los mismos abreviaturas que tiene actualmente.

M-x read-abbrev-file lee un nombre de archivo usando el minibúfer y luego lee el archivo, definiendo abreviaturas según el contenido del archivo. La función quietly-read-abbrev-file es similar excepto en que no muestra un mensaje en el área de eco; no puede invocarla interactivamente, y se usa principalmente en su archivo init (vea El Archivo de Inicialización de Emacs). Si cualquiera de estas funciones es llamada con nil como argumento, usa el archivo dado por la variable abbrev-file-name, que es ~/.emacs.d/abbrev_defs por defecto. Este es su archivo estándar de definición de abreviaturas, y Emacs carga abreviaturas desde él automáticamente cuando se inicia. (Como excepción, Emacs no carga el archivo abbrev cuando se inicia en modo batch. Ver Opciones Iniciales, para una descripción del modo batch).

Emacs le ofrecerá guardar los abbrevs automáticamente si ha cambiado alguno de ellos, siempre que le ofrezca guardar todos los archivos (para C-x s o C-x C-c). Los guarda en el archivo especificado por abbrev-file-name. Esta función puede inhibirse estableciendo la variable save-abbrevs en nil; si se establece en silently, los abbrevs se guardarán automáticamente sin preguntar.

Los comandos M-x insert-abbrevs y M-x define-abbrevs son similares a los comandos anteriores pero trabajan sobre texto en un búfer de Emacs. M-x insert-abbrevs inserta texto en el búfer actual después del punto, describiendo todas las definiciones de abreviaturas actuales; M-x define-abbrevs analiza todo el búfer actual y define las abreviaturas en consecuencia.

30.7 Expansión Dinámica de Abreviaturas

La función de abreviatura descrita anteriormente funciona automáticamente al insertar texto, pero todas las abreviaturas deben definirse explícitamente. En cambio, las abreviaturas dinámicas permiten determinar automáticamente el significado de las abreviaturas a partir del contenido del búfer, pero la expansión dinámica de abreviaturas sólo se produce cuando se solicita explícitamente.

M-/

Expande la palabra en el búfer antes del punto como abreviatura dinámica, buscando palabras que empiecen por esa abreviatura (dabbrev-expand).

C-M-/

Completa la palabra anterior al punto como abreviatura dinámica (dabbrev-completion).

Por ejemplo, si el búfer contiene “esto sigue “ y se escribe f o M-/, el efecto es insertar “sigue” porque es la última palabra del búfer que empieza por “si. Un argumento numérico para M-/ dice que se tome la segunda, tercera, etc. expansión distinta encontrada mirando hacia atrás desde el punto. Repitiendo M-/ se busca una expansión alternativa mirando más atrás. Después de escanear todo el texto anterior al punto, busca en el texto posterior al punto. La variable dabbrev-limit, si no es nula, especifica a qué distancia del búfer se debe buscar una expansión.

Después de escanear el búfer actual, M-/ normalmente busca en otros búferes. Las variables dabbrev-check-all-buffers y dabbrev-check-other-buffers se pueden usar para determinar en qué otros búferes, si los hay, se busca. Los búferes que tienen modos principales derivados de cualquiera de los modos en dabbrev-ignored-buffer-modes son ignorados.

Para un control más preciso sobre los búferes a escanear, personalice las variables dabbrev-ignored-buffer-names y dabbrev-ignored-buffer-regexps. El valor de la primera es una lista de nombres de búferes a omitir. El valor de la segunda es una lista de expresiones regulares; si el nombre de un búfer coincide con alguna de estas expresiones regulares, la expansión abbrev dinámica omite ese búfer.

Un argumento negativo a M-/, como en C-u - M-/, dice que se busquen primero las expansiones después del punto, luego otros búferes, y se consideren las expansiones antes del punto sólo como último recurso. Si repite M-/ para buscar otra expansión, no especifique ningún argumento. La repetición de M-/ recorre todas las expansiones después del punto y luego las expansiones antes del punto.

Después de expandir una abreviatura dinámica, puede copiar las palabras adicionales que siguen a la expansión en su contexto original. Simplemente escriba SPC M-/ para cada palabra adicional que desee copiar. El espaciado y la puntuación entre palabras se copian junto con las palabras.

Puede controlar la forma en que M-/ determina la palabra a expandir y cómo expandirla; consulte Personalización de la abreviatura dinámica.

El comando C-M-/ (dabbrev-completion) completa una abreviatura dinámica. En lugar de probar las posibles expansiones una a una, las encuentra todas y luego inserta el texto que tienen en común. Si no tienen nada en común, C-M-/ muestra una lista de terminaciones, entre las que puede elegir de la forma habitual. Véase Completar.

La expansión abreviada dinámica es completamente independiente del modo Abreviatura; la expansión de una palabra con M-/ es completamente independiente de si tiene una definición como abreviatura ordinaria.

30.8 Personalización de la Abreviatura Dinámica

Normalmente, la expansión dinámica de abreviaturas ignora las mayúsculas y minúsculas al buscar expansiones. Es decir, no es necesario que la expansión coincida en mayúsculas y minúsculas con la palabra que se está expandiendo.

Esta característica se controla mediante la variable dabbrev-case-fold-search. Si es t, se ignoran las mayúsculas y minúsculas en esta búsqueda; si es nil, la palabra y la expansión deben coincidir en mayúsculas y minúsculas. Si el valor es case-fold-search (por defecto), la variable case-fold-search controla si se ignoran las mayúsculas y minúsculas en la búsqueda de expansiones (consulte Coincidencia Laxa durante la Búsqueda).

Normalmente, la expansión dinámica de abreviaturas conserva el patrón de mayúsculas y minúsculas de la abreviatura dinámica que se está expandiendo, convirtiendo la expansión a ese patrón de mayúsculas y minúsculas.

La variable dabbrev-case-replace controla si se preserva el patrón de mayúsculas y minúsculas del abreviatura dinámico. Si es t, el patrón de mayúsculas y minúsculas del abreviatura dinámico se conserva en la mayoría de los casos; si es nil, la expansión siempre se copia literalmente. Si el valor es case-replace (por defecto), la variable case-replace controla si se copia la expansión literalmente (véase Comandos de reemplazo y Coincidencias Laxas).

Sin embargo, si la expansión contiene un patrón complejo de mayúsculas y minúsculas, y la abreviatura dinámica coincide con este patrón hasta el final, entonces la expansión siempre se copia literalmente, independientemente de esas variables. Así, por ejemplo, si el búfer contiene la variableConPatrónMezcladorDeMayúsculas (variableWithSillyCasePattern), y se escribe v a M-/, se copia la expansión literalmente incluyendo su patrón de mayúsculas y minúsculas.

Si la variable dabbrev-abbrev-char-regexp no es nula, controla qué caracteres se consideran parte de una palabra, a efectos de expansión dinámica. La expresión regular debe coincidir con un solo carácter, nunca con dos o más. La misma expresión regular también determina qué caracteres forman parte de una expansión. El valor (por defecto) nil tiene un significado especial: las abreviaturas dinámicas (es decir, la palabra en el punto) están formadas por caracteres de palabra, pero sus expansiones se buscan como secuencias de caracteres de palabra y símbolo. Esto es generalmente apropiado para expandir símbolos en el código fuente de un programa y también para texto legible por humanos en muchos idiomas, pero puede no ser lo que desea en un búfer de texto que incluya caracteres de puntuación inusuales; en ese caso, el valor «\sw» podría producir mejores resultados.

En los scripts de shell y makefiles, un nombre de variable a veces lleva el prefijo “$” y a veces no. Los modos principales para este tipo de texto pueden personalizar la expansión dinámica de abreviaturas para manejar prefijos opcionales configurando la variable dabbrev-abbrev-skip-leading-regexp. Su valor debe ser una expresión regular que coincida con el prefijo opcional que la expresión abreviada dinámica debe ignorar. Por defecto es nil, lo que significa que no se omitirá ningún carácter.