Como la mayoría de los usuarios de Emacs, he personalizado un modo cambiando las variables. Lo que nunca se me ocurrió es toda la mentalidad de programación detrás de tener esto y aquello personalizable. Me di cuenta de esto cuando comencé a mirar algunos de los códigos fuente de eshell. No soy un programador de Elisp, pero específicamente em-ls.el
parece usar defcustom
, defgroup
etc. Esto parecería ser un mundo de sombras de variables definidas globalmente que utiliza el código de Elisp. Entonces, una pregunta sería: ¿Es el uso de defcustom
otra forma de hacer variables globales (personalizables)?
¿Alguien puede señalarme cómo usar correctamente (primero entender) toda la idea detrás defcustom
, cuándo usar, por qué, cuándo no? Tal vez un ejemplo de principiante para un principiante elisp.
customize
instalaciones y cuándo personalizarlas a mano? ¿O estás interesado en escribir un modo? La última es la situación en la que realmente podrías encontrarte usando cosas comodefcustom
y similares.Respuestas:
El sistema de personalización es una característica incorporada de Emacs diseñada para resolver con precisión el problema que usted describe; la programación puede no ser la forma ideal para que el usuario promedio configure su editor.
El punto de entrada principal para la funcionalidad de personalización es
M-x customize RET
(oOptions > Customize Emacs > Top-level Customization Group
desde el menú). Desde allí, verá un sistema de menú interactivo para ajustar la configuración. Esta interfaz exige que todas las configuraciones sean del tipo correcto (número, cadena, color, etc.), evitando una fuente importante de error cuando los usuarios configuran Emacs mediante programación. Si el usuario elige persistir cualquier cambio que realice a través de la interfaz de usuario, la configuración se almacena en una sección especial en el archivo de inicialización del usuario (lea:).emacs
.defcustom
es un envoltorio alrededor de la funcionalidad de Emacs Lisp de nivel inferior,defvar
que declara la variable y la hace visible dentro de la interfaz de personalización. También permite al desarrollador proporcionar metadatos adicionales necesarios para mostrar un control interactivo apropiado, es decir, ¿qué tipo de valor se almacena en esta variable? ¿Una cadena arbitraria? ¿Un número? ¿Una elección de un conjunto fijo de opciones? etc.defgroup
es una construcción de agrupación para estas opciones personalizables para que puedan organizarse en una bonita jerarquía.Esta funcionalidad debe usarse en cualquier momento en que un dato se considere una opción configurable para el usuario en lugar de un detalle interno de la biblioteca.
Aquí hay un ejemplo simple de una pequeña biblioteca mía:
El
defgroup
crea un nuevo grupo dentro de la interfaz de personalización bajo el nivel superiorconvenience
artículo. Luego necesitaba una variable para almacenar los posibles estados de casilla de verificación. Podría haberlo usadodefvar
, pero como quiero que esto sea fácilmente personalizable, elegí usarlodefcustom
. La:group
porción indica que pertenece al grupo definido previamente, y:type
indica que es una secuencia de cadenas. También hay un valor predeterminado y una descripción. También hay facilidades adicionales (no mostradas aquí) para transformar los valores ingresados por el usuario.Si ahora corro
M-x customize RET
y navegoConvenience > Checkbox
, veo lo siguiente:No es la interfaz más bella del mundo, pero tenga en cuenta que tiene herramientas interactivas para personalizar el valor de "Estados de casilla de verificación" (
checkbox-states
internamente). Muestra los valores de cadena actuales junto con los botonesINS
(insertar) yDEL
(eliminar), y nos permite editar los valores de cadena en cuadros de edición. Cuando hayamos terminado, podemos decidir si aplicamos nuestros cambios, revertirlos o aplicarlos y guardarlos para futuras sesiones.fuente
defcustom
) son que se ocupa automáticamente de : (1) la verificación de tipos , para ayudar a evitar que asigne un valor incorrecto a una variable (siempre que el escritor se hayadefcustom
esforzado por proporcionar un tipo razonable check), (2) inicialización (:initialize
) y ctions de actualización (activados) (:set
).Si. Especialmente si desea que los usuarios de su código puedan cambiar variables fácilmente a través de la interfaz de personalización Mx .
defcustom brinda dos beneficios importantes a sus usuarios: documentación y seguridad de tipos. Es bueno tener documentación allí. La seguridad de tipos permite especificar qué tipos de valores válidos pueden tomar sus variables.
Por supuesto, defvar está bien si todo lo que está haciendo es personalizarlo y no anticipa un uso más amplio. Sin embargo, algunos dirían que seguir inculcando es una buena costumbre inculcar.
La página del manual para defcustom tiene más aclaraciones. El tema de personalizaciones en el manual tiene detalles completos.
Personalmente, considero que defcustom es menos engorroso durante el desarrollo, ya que no tengo que lidiar con problemas de recarga con defvar y setq.
fuente