La diferencia entre setq y setq-default en Emacs Lisp

89

Tengo una pregunta sobre Emacs Lisp. ¿Cuál es la diferencia entre setq y setq-default ?

Los tutoriales dicen que setq tiene efecto en el búfer local, mientras que setq-default afecta a todos los búferes.

Por ejemplo, si escribí (setq a-var a-vars-value) en init.el , encontré después de iniciar Emacs y abrir un nuevo búfer, el a-var también está allí y su valor es a-vars-value . Pensé que no se suponía que estuviera allí. Parece que no hay diferencia entre setq y setq-default .

¿Hay algún problema con mi comprensión?

Por ejemplo:

  1. Escribí (setq hello 123) en el archivo init.el , y ejecuto emacs abuffer en el shell, luego ingresé "hello Cx Ce" , muestra "123". Lo mismo sucede cuando ejecuto esto en todos los búferes nuevos.

  2. Escribí (setq tab-width 4) en el archivo init.el. Cuando ejecuto Cx Ce de ancho de tabulación , muestra "8" (el modo actual es 'Texto'). Sin embargo, cuando uso (setq-default tab-width 4) , muestra "4". No puedo explicar este fenómeno.

ruanhao
fuente

Respuestas:

100

Algunas variables en Emacs son "búfer-local", lo que significa que cada búfer puede tener un valor separado para esa variable que anula el valor predeterminado global. tab-widthes un buen ejemplo de una variable local de búfer.

Si una variable es local al búfer, entonces setqestablece su valor local en el búfer actual y setq-defaultestablece el valor predeterminado global.

Si una variable no es local al búfer, a continuación, setqy setq-defaulthacer lo mismo.

En su caso 2, (setq tab-width 4)establezca el valor local del búfer de tab-widthen 4 en el búfer actual, dejando el valor predeterminado global de tab-widthtodavía en 8, por lo que cuando evaluó tab-widthen un búfer diferente que no tenía valor local, vio que 8. Entonces, cuando establece el valor predeterminado en 4, ese búfer lo recogió, ya que todavía no tenía valor local.

dfan
fuente
cuando I (establece el ancho de tabulación 4), y lo evalúo, siempre es 8 en cada búfer. No sé por qué. Parece que no surte efecto. Pero cuando uso (sets-default tab-width 4), tiene efecto en cada búfer. Tampoco sé por qué :(
ruanhao
(setq tab-width 4)tiene efecto en el búfer donde evaluó la expresión; si lo evalúa en el *scratch*búfer, examine su valor en ese búfer.
tripleee
tab-widthes una variable local de búfer. Entonces, cuando usted (setq tab-width 4), solo se establece en 4 en el búfer actual. Todos los demás búferes retienen un tab-widthvalor predeterminado global, 8. Cuando usted (setq-default tab-width 4), está cambiando el valor predeterminado global de tab-widtha 4, por lo que ahora cada búfer que no se ha definido a tab-widthsí mismo tiene ese nuevo valor predeterminado.
dfan
3
Si. Consulte la lista de la secuencia de acciones de emacs al inicio . Leer el archivo de inicio es el paso 12, y abrir el búfer inicial es el paso 23.
dfan
1
@ruanhao Si usted (setq tab-width 4) en init.el, solo se aplicará a ese búfer (init.el). Si desea que este cambio se aplique a todos los búferes nuevos, entonces (setq-default tab-width 4) lo logrará. Además, si desea crear un modo para un tipo específico de archivo, probablemente desee usar (setq tab-width 4) para no anular el valor predeterminado global.
Hemm