¿Cómo usar adecuadamente defcustom?

15

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.elparece usar defcustom, defgroupetc. 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 defcustomotra 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.

147pm
fuente
¿Podrías aclarar lo que estás preguntando? ¿Desea saber cuándo usar las customizeinstalaciones 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 como defcustomy similares.
Dan

Respuestas:

20

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(o Options > Customize Emacs > Top-level Customization Groupdesde 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.

defcustomes un envoltorio alrededor de la funcionalidad de Emacs Lisp de nivel inferior, defvarque 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. defgroupes 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:

(defgroup checkbox nil
  "Quick manipulation of textual checkboxes."
  :group 'convenience)

(defcustom checkbox-states '("[ ]" "[x]")
  "Checkbox states to cycle between.
First item will be the state for new checkboxes."
  :group 'checkbox
  :type '(repeat string))

El defgroupcrea un nuevo grupo dentro de la interfaz de personalización bajo el nivel superior convenienceartículo. Luego necesitaba una variable para almacenar los posibles estados de casilla de verificación. Podría haberlo usado defvar, pero como quiero que esto sea fácilmente personalizable, elegí usarlo defcustom. La :groupporción indica que pertenece al grupo definido previamente, y :typeindica 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 RETy navego Convenience > Checkbox, veo lo siguiente:

interfaz de personalización

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-statesinternamente). Muestra los valores de cadena actuales junto con los botones INS(insertar) y DEL(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.

camdez
fuente
2
¡Buen post! Las ventajas más significativas para el Customizing (y 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 haya defcustomesforzado por proporcionar un tipo razonable check), (2) inicialización ( :initialize) y ctions de actualización (activados) ( :set).
Dibujó el
¡Gracias! He actualizado la publicación para reflejar sus sugerencias.
camdez
7

¿El uso de defcustom es otra forma de hacer variables globales (personalizables)?

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.

¿Alguien puede señalarme cómo iluminar cómo usar correctamente ...

La página del manual para defcustom tiene más aclaraciones. El tema de personalizaciones en el manual tiene detalles completos.

... cuándo usar, por qué, cuándo no?

Personalmente, considero que defcustom es menos engorroso durante el desarrollo, ya que no tengo que lidiar con problemas de recarga con defvar y setq.

Usuario de Emacs
fuente