Activación automática de modos menores en modo fundamental

8

Por diseño, fundamental-modees básico, ya que se supone que otros modos principales derivan de este.

Desde la página de información (elisp) Major Modes, tenemos:

Este es el comando de modo principal para el modo Fundamental. A diferencia de otros comandos de modo, no ejecuta ningún enlace de modo (* nota Convenciones de modo mayor: :), ya que se supone que no debe personalizar este modo.

Por esta razón,

  • No tenemos a fundamental-mode-hook.
  • Además my-minor-mode, no se habilita SOLO en este modo principal, los búferes a pesar de tener (global-my-minor-mode 1)en mi configuración.

A continuación funcionaría, pero solo si escribí manualmente M-x fundamental-mode:

(add-hook 'after-change-major-mode-hook #'my-minor-mode)

No ayuda en el siguiente caso donde fundamental-modese crea un búfer (* abcd *) por defecto:

(with-current-buffer (get-buffer-create "*abcd*")
  (insert "Hello world"))

¿Por qué quiero habilitar un modo menor en fundamental-mode?

Me gusta mantener mis combinaciones de teclas personalizadas en mi mapa de modo menor. Tengo este modo menor habilitado globalmente (pero no se habilita solo en fundamental-modebuffers).

Aquí hay un caso de uso que hizo que haga esta pregunta aquí. Al hacer M-x esup( esuppaquete), crea un *esup-log*búfer con fundamental-modesu modo principal. Pero cada vez que necesito habilitar mi modo menor manualmente para usar mis enlaces convenientes.

Me gustaría habilitarlo my-minor-modede una manera verdaderamente global, fundamental-modeo no.

Actualización 1:

Aquí está mi definición de menor importancia modo: modi-mode.

Actualización 2:

Basado en el comentario de @npostavs , revisé las diferencias entre mi modo menor modi-modey override-global-modeen use-package/bind-key.el. Y resulta que el valor de inicio de mi modo es nily el de override-global-modees t.

Si cambio el valor de inicio de mi modo a t, ¡también se habilita en los búferes de modo fundamental! Pero el acto de (global-modi-mode 1)no termina con el mismo resultado. ¿Eso es extraño? ¿Probablemente un error?

Kaushal Modi
fuente
Un modo de enlace de teclas personalizado similar se habilita en los fundamental-modebúferes para mí, por lo que tal vez el problema esté en la definición de su modo. override-global-mode
npostavs
@npostavs Gracias. Revisaré cómo use-packageimplementa eso.
Kaushal Modi
@npostavs Compruebe la pregunta actualizada ... Resulta que estoy enfrentando este problema simplemente porque el valor de inicio de mi modo es nil; pero lo habilito globalmente.
Kaushal Modi
1
En buffer.c, parece que se get-buffer-createejecuta buffer-list-update-hookal final de su función, ¿tal vez podría adjuntar su propia función con condiciones a ese gancho?
ley
1
Emacs usa buffers temporales "internos" para todo tipo de propósitos (por ejemplo, la conversión del sistema de codificación para E / S a / desde un archivo o proceso puede usar un buffer temporal). Estos búferes usan el modo fundamental y creo que es correcto que no habiliten su modo menor. En cuanto a otros búferes, la regla para mí es que: si alguna vez desea ver este búfer (que no sea para fines de depuración), probablemente no debería usar el modo fundamental.
Stefan

Respuestas:

4

La única forma en que puedo habilitar un modo menor por defecto en los fundamental-modebúferes es establecer el valor de inicio de ese modo menor en t.

(define-minor-mode my-minor-mode
 "My minor mode"
 :init-value t)

Tenga en cuenta que simplemente activar un modo menor globalizado (ver C-h i g (elisp) Defining Minor Modes) con valor de inicio nil no hace lo mismo. En este caso, se fundamental-modecreará un búfer con este modo menor desactivado.


Lo anterior, por supuesto, funcionará solo si controla la fuente del modo menor. Para todos los demás modos menores que vienen con diferentes paquetes, si desea habilitar un modo menor de forma predeterminada en las fundamental-modememorias intermedias, deberá hacer

(setq-default the-minor-mode t)
Kaushal Modi
fuente
1
Creo que para otros modos menores podrías hacer (setq-default 'the-minor-mode t)para obtener el mismo efecto.
npostavs
¡Buen punto! Actualizaré la respuesta (eliminé esa comilla simple). ¡Gracias!
Kaushal Modi
Si ha agregado (setq-default modi-mode 1)a la función turn-on-modi-modey el (setq-default modi-mode nil) to the function turn-off-modi-mode`, entonces sería un paso más a realidad a nivel mundial activar y desactivar el modo.
nispio
@nispio Ese es un buen punto. Todavía no he necesitado hacer esto. Pero ahora sé lo que debo hacer si necesito alternar mi modo menor en un búfer de modo fundamental.
Kaushal Modi
2

No lo use fundamental-mode , al menos no de forma interactiva. Raramente quieres estar adentro fundamental-mode. Casi siempre hay algo mejor.

El objetivo fundamental-modees no tener el manejo habitual en modo mayor (ganchos, etc.). Puedes pensar fundamental-modecomo una especie de clase abstracta.

Si algún paquete lo coloca en un búfer que está dentro fundamental-mode, haga lo que necesita hacer para evitar esto: use algún otro modo para ello.

Considere la posibilidad de personalizar major-mode para que no sea por defecto fundamental-mode. (Yo uso indented-text-mode)


Anteriormente había algo default-major-modepara esto, que creo que era un poco más claro, pero decidieron desaprobar eso (todavía funciona, por supuesto).

default-major-mode is a variable defined in `C source code`.
Its value is indented-text-mode

  This variable is obsolete since 23.2;
  use `major-mode' instead.

Documentation:
Value of `major-mode` for new buffers.
Dibujó
fuente
No estoy usando el fundamental-mode. El quid de la cuestión es que cuando cualquier paquete se utiliza get-buffer-createpara generar un búfer temporal, ese búfer se crea con fundamental-modeel modo principal. En esos búferes, mi modo menor no estará habilitado de manera predeterminada (porque su valor de inicio es nulo; aunque lo habilité globalmente).
Kaushal Modi
Pocos de estos paquetes que se pueden enumerar: esup,keyfreq
Kaushal Modi
Un paquete que solo llama get-buffer-createno hace nada para establecer el modo mayor (o cualquier modo menor). ¿Debería (para el paquete en cuestión)? Si es así, considere contactar al responsable del paquete. Si no, considera activar tu modo principal o secundario preferido. IOW, si se trata de lo que quieres, y no de lo que el paquete debería configurar en general, entonces depende de ti configurarlo como quieras.
Dibujó
Sería curioso saber por qué esto fue rechazado.
Dibujó el
@Drew porque no aborda el problema. El OP establece explícitamente que otros modos están creando buffers en modo fundamental, y su solución propuesta es no usar el modo fundamental.
nispio
0

La función get-buffer-createse define en buffer.c, y al final de esa función llama a buffer-list-update-hook. Tal gancho podría usarse para ejecutar una función personalizada, pero es posible que sea necesario agregar ciertas condiciones para evitar que la función personalizada se active en momentos inoportunos cuando otras funciones invocan ese gancho.

lista de leyes
fuente