¿Ventajas de establecer variables con setq en lugar de custom.el?


69

Veo que muchas personas (autores de extensiones y otros) dan ejemplos de configuración con setq:

(setq foo 'bar)

Estos parámetros a menudo se definen con defcustom, haciéndolos disponibles para su personalización custom.el.

Normalmente uso custom.elpara configurarlos. ¿Tendría alguna ventaja usarlo setqo los dos métodos son más o menos equivalentes?

Respuestas:


86

Algunas personas pueden pensar que es más fácil de usar setq. Algunas personas pueden pensar que es más lispy. En realidad, es ingenuo en el caso general.

Es cierto que para algunas opciones de usuario no importa. Pero para otros, sí importa, y setqes el enfoque equivocado para esas opciones. Entonces, como regla general, setqes el enfoque equivocado.

Si usa custom-set-variableso en customize-set-variablelugar de setq, o si usa la interfaz de usuario Personalizar (por ejemplo M-x customize-option), entonces está seguro de que cualquier código de inicialización o actualización que se necesite para el valor de la opción se activará automáticamente y se ejecutará según sea necesario. Si lo usa setq, esto no se hará.

Ahora, también es el caso de que la mayoría de las opciones de usuario, especialmente muchas de ellas escritas para bibliotecas de terceros, no hacen uso de las defcustompalabras clave :sety :initialize, y el uso setqno es importante para ellas. Pero muchas opciones de Emacs vanilla utilizan esas palabras clave, y para aquellos que lo hacen, setqno es lo correcto. Entonces, si desea usar el código Lisp y no la interfaz de usuario Personalizar para configurar sus opciones, es mejor que use custom-set-variableso en customize-set-variablelugar de setq. Nunca duele y a veces ayuda (mucho).

Pero lo que recomiendo es hacer ambas cosas:

  • Use la interfaz de usuario Personalizar en lugar de escribir el código Lisp para esto.

  • Defina variablecustom-file , de modo que Personalizar escriba personalizaciones en ese archivo y no en su archivo de inicio ( ~/.emacs). IOW, mantenga su código de inicialización escrito a mano separado del código automático escrito por Customize.


55
Creo que vale la pena mencionar que incluso con los parámetros: set y: initialize, setq aún funciona si se lee antes de cargar el paquete.
Malabarba

2
@Willyfrog ¡Puedes votarlo!
Zane Shelby

17
No estoy seguro de eso Drew. Todo lo relacionado con la personalización es bastante complejo. Sin él, el sistema emacs es mucho más simple. La personalización es una capa que no combina exactamente bien con elisp. Por un lado, ordena todos los vars por alfabetos. Además, muchas personalizaciones no tienen que ver con variables (por ejemplo, ganchos, llaves), por lo que no se puede usar la personalización. Entonces tienes una situación de código elisp manual de todos modos.
Xah Lee

44
@XahLee. Pues estoy seguro. ;-) Pero sí, personalizar es lo que es. No es lo mejor para llaves, ganchos, palabras clave de bloqueo de fuente, tablas de visualización, etc. Pero para lo que hace (opciones y caras), funciona bastante bien. No es que la interfaz de usuario sea ​​maravillosa, pero el manejo de los desencadenantes, la verificación de tipo, etc. son útiles. Incluso desearía que los programadores pudieran (opcionalmente) usar cosas como :typecon defvar- No creo que deba limitarse a las opciones del usuario. Desafortunadamente, muchos programadores son perezosos en su uso :typey el resultado no es muy útil (eso no es culpa de Personalizar).
Drew

2
Punto de datos: en mis 3.300 líneas de código de inicio de Emacs desarrolladas durante la mayor parte de un año, he sido mordido al usarlo en setqlugar de customize-set-variableexactamente una vez. (Esa vez fue para auto-revert-interval, y luego me di cuenta de que usar setq antes de cargar autorevertera en realidad mucho más rápido que usar customize-set-variable.)
Radon Rosborough

38

Prefiero setqterminar customizepor varias razones:

  1. En primer lugar, permite que las variables se establezcan mediante programación (como en, (setq foo (calculate-foo))). Utilizo este poder todo el tiempo en mi configuración para mantener las cosas SECAS. Para mí, el objetivo de usar Emacs es la capacidad de programación, y la customizeinterfaz no hace más que interponerse.
  2. setqse presta mejor para el control de versiones y la organización del código. Dividí mi inicialización entre docenas de archivos; Si todo estuviera en un custom.elarchivo enorme , sería mucho más difícil encontrar y editar configuraciones rápidamente.
  3. Esto es subjetivo, pero para mí toda la customizeinterfaz se siente como una reliquia horrible de las peores interfaces de usuario de los 90. Prefiero editar texto con el poder de Emacs cualquier día.

@Drew hace algunos buenos puntos sobre algunas sutilezas con :sety :initialize. He estado usando Emacs durante años y rara vez he encontrado problemas como ese. Cuando lo haga, es fácil que cambiar setqpara custom-set-variableen casos específicos.


10
1. Puede configurar variables personalizadas mediante programación customize-set-variable(s), y es mejor debido a los disparadores que se ejecutan automáticamente. 2. Puede usar varios comandos de personalización para ver todas sus variables establecidas y / o guardadas en diferentes jerarquías, de modo que obtenga la organización de diferentes grupos automáticamente sin tener que usar archivos separados en el control de versiones. 3. Ha mejorado mucho. Si no le gusta la interfaz de usuario, aún puede usar la personalización mediante programación y a través de los comandos interactivos que evitan el modo de personalización para obtener todos los demás beneficios del uso de la personalización.
Nick McCurdy

24

Una ventaja de usar en setqlugar de customizees la legibilidad. Uno es libre de anotar cada personalización a su gusto, lo que IMO mejora la legibilidad. También se pueden agrupar personalizaciones relacionadas, lo que mejora la modularidad. Finalmente, diría que navegar por un búfer de elisp es más "fácil" que navegar por la interfaz de usuario y los widgets personalizados.

Por otro lado, personalizar le permite volver fácilmente a los valores predeterminados que pueden ser invaluables cuando las cosas se vuelven locas.

EDITAR: la respuesta de Drew proporciona una gran razón para usar customize-set-variablesque puede proporcionar todas las ventajas que señalé. Sin embargo, la IU personalizada no se presta a configuraciones portátiles entre diferentes plataformas tan fácilmente como lo hace el elisp sin formato. Si necesita que una variable tenga una configuración dependiente del sistema operativo, tendrá que recurrir a elisp en muchos casos. Mi punto sobre una navegación más fácil en los buffers de elisp sigue en pie.


También puede volver al valor predeterminado con setq, simplemente comentar la setqlínea y reiniciar emacs.
T. Verron

3
Sí, pero personalizar puede revertir sin reinicios molestos. Muy útil para probar nuevas configuraciones.
Vamsi

2
Con respecto a la anotación, la interfaz de personalización le permite agregar un comentario a cada variable que cambie.
Andrew Swann

custom-set-variables es "raw elisp", y lo uso todos los días en varias máquinas. Simplemente cópielo del lugar donde personalizarlo lo escribe (si no lo escribió usted mismo).
Croad Langshan

La interfaz <kbd> Mx personalizar- * </kbd> tiene un campo "comentario" que permite almacenar un comentario junto con una variable.
kdb

-1

Otra alternativa es usar el paquete de uso de John Wiegley . Esto proporciona una forma programática de configurar paquetes que funciona bien con el proceso de inicialización de paquetes de emacs 24+. Aquí hay un ejemplo de uso del archivo Léame:

(use-package color-moccur
  :commands (isearch-moccur isearch-all)
  :bind (("M-s O" . moccur)
         :map isearch-mode-map
         ("M-o" . isearch-moccur)
         ("M-O" . isearch-moccur-all))
  :custom (isearch-lazy-highlight t)
  :config (use-package moccur-edit))

El punto es que use package es una macro y no evalúa sus argumentos de inmediato. Los parámetros :inity :configse evalúan en diferentes etapas del proceso de inicialización, lo que permite tener la configuración de cada paquete en un solo lugar, pero hacer que cada parte se ejecute en la etapa apropiada de inicialización.

Sin algo como use-packagealgunos paquetes requieren que parte de su código de inicialización vaya antes (package-initialize)y otra parte que vaya después. Si tienes muchos packegas así, entonces tus inicializaciones tendrían que ser intercaladas.

Otro beneficio use-packagees que puede instalar automáticamente los paquetes que faltan al usar package.el si lleva sus .emacs a una nueva máquina o si comparte su configuración con otro usuario y toda la inicialización puede diferirse hasta que un paquete realmente necesite cargarse.

También hay argumentos de palabras clave adicionales que permiten un mayor control sobre el proceso de inicialización.

Dicho todo esto, una gran ventaja de personalizar es que muestra lo que hay que configurar en un paquete dado. Esa es una razón por la que todavía lo uso para muchos de mis paquetes.


2
Eso en realidad no responde la pregunta. En su propia respuesta, usa setq sin explicación de por qué.
J David Smith

3
Creo que use-packageofrece ventajas de la configuración modularizada, y también importa y configura paquetes en un solo lugar. Pero sí, el ejemplo está usando setq. ¿Podría también haberlo usado customize-set-variableaquí? No estoy seguro. ¿Podríamos / deberíamos cambiarlo (o customize-set-value) por setq?
mike

44
Cambie el ejemplo para que use la :custompalabra clave.
Toon Claes