modos menores global creada con la macro define-globalized-minor-mode
son un poco complicado. La razón por la que su código no parece hacer nada es que los modos globalizados utilizan after-change-major-mode-hook
para activar el modo menor de buffer local que controlan; y ese gancho se ejecuta inmediatamente después de ganchos del modo principal .
Los modos individuales pueden implementar formas personalizadas de especificar algún tipo de lista negra u otro método para evitar que el modo se active en determinadas circunstancias, por lo que valdría la pena mirar las opciones relevantes M-x customize-group
para ver si tales instalaciones existen. Sin embargo, una buena y limpia forma general de lograr esto para CUALQUIER modo menor globalizado me está eludiendo por el momento.
Es una pena que la función MODE-enable-in-buffers
definida por esa macro no haga la misma comprobación (with-current-buffer buf (if ,global-mode ...))
que se realiza mediante la función de modo global. Si lo hizo, usted podría simplemente use slime-repl-mode-hook para hacer que el modo global sea buffer-local y nil.
Un truco rápido es comprobar lo que el argumento turn-on
es para la definición modo menor globalizado (en este caso es centered-cursor-mode
sí), y escribir un poco de todo consejo para evitar que eso se está evaluando para los modos en cuestión.
(defadvice centered-cursor-mode (around my-centered-cursor-mode-turn-on-maybe)
(unless (memq major-mode
(list 'slime-repl-mode 'shell-mode))
ad-do-it))
(ad-activate 'centered-cursor-mode)
Algo que podemos do (con un patrón fácil reutilizable) se desactiva inmediatamente el modo menor local al búfer de nuevo después de que se ha activado. Una función de agregado con el argumento APPEND
a add-hook
será fiable correr detrás del modo menor globalizado after-change-major-mode-hook
ha actuado, por lo que puede hacer cosas como:
(add-hook 'term-mode-hook 'my-inhibit-global-linum-mode)
(defun my-inhibit-global-linum-mode()
"Counter-act `global-linum-mode'."
(add-hook 'after-change-major-mode-hook
(lambda() (linum-mode 0))
:append :local))
o su alias define-global-minor-mode
la que creo que debería se debe evitar, debido a la posibilidad de confusión con los modos menores "globales" creados con define-minor-mode
. Los modos menores "globalizados", aunque todavía involucran un modo minoritario global, funcionan de manera muy diferente en la práctica, por lo que es mejor referirse a ellos como "globalizados" en lugar de "globales".
C-hfdefine-globalized-minor-mode
RET muestra que turn-on
es el tercer argumento, y, comprobamos que en la definición de modo con M-xfind-function
RETglobal-centered-cursor-mode
RET.
con este enfoque, este hecho va a evitar que cada vez que permite este modo menor con-repl-mode limo o concha de modo tampones, mientras que un modo menor globalizado con una función de encendido por separado podría todavía ser invocado en su forma no global si así lo desea.
https://stackoverflow.com/a/19295380/324105
Parece que no funciona cuando cambias de un modo principal a otro – xuhdev