emacs read-eval-print-loop slime

emacs - Deshabilita automáticamente un modo menor global para un modo mayor específico



read-eval-print-loop slime (2)

He activado globalmente el modo de cursor centrado, así:

(require ''centered-cursor-mode) (global-centered-cursor-mode 1)

Funciona bien, pero hay algunos modos principales en los que me gustaría desactivarlo automáticamente. Por ejemplo slime-repl y shell.

Hay otra pregunta que trata el mismo problema, pero otro modo menor. Desafortunadamente, las respuestas solo ofrecen soluciones para este modo menor específico (global-smart-tab-mode), que no funciona con el modo centrado-cursor.

Probé este gancho, pero no tiene efecto. La variable no cambia.

(eval-after-load "slime" (progn (add-hook ''slime-repl-mode-hook (lambda () (set (make-local-variable ''centered-cursor-mode) nil))) (slime-setup ''(slime-repl slime-autodoc))))


Hice un nuevo modo menor global, que no se activa en ciertos modos. La lambda es la función que se llama en cada nuevo búfer para activar el modo menor. Ese es el lugar correcto para hacer excepciones.

(require ''centered-cursor-mode) (define-global-minor-mode my-global-centered-cursor-mode centered-cursor-mode (lambda () (when (not (memq major-mode (list ''slime-repl-mode ''shell-mode))) (centered-cursor-mode)))) (my-global-centered-cursor-mode 1)

Debería funcionar para cualquier otro modo menor global. Simplemente copie la definición global-xxx-mode y haga las excepciones correctas.


Los modos menores globales creados con la macro define-globalized-minor-mode 1 son un poco complicados. La razón por la que su código no parece hacer nada es que los modos globalizados utilizan el modo after-change-major-mode-hook para activar el modo secundario local de búfer que controlan; y ese gancho se ejecuta inmediatamente después de los ganchos 4 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 se habilite el modo en ciertas circunstancias, por lo que en general valdría la pena ver las opciones relevantes Mx customize-group para que el paquete vea si Existen instalaciones. Sin embargo, por el momento, se me está escapando una forma general limpia y agradable de lograr esto para CUALQUIER modo menor globalizado.

Es una pena que la función MODE-enable-in-buffers definida por esa macro no haga lo mismo (with-current-buffer buf (if ,global-mode ...)) verifique lo que realiza la función de modo global . Si lo hiciera, simplemente podría usar slime-repl-mode-hook para hacer que la variable de modo global sea local y nula.

Un truco rápido es comprobar 2 cuál es turn-on argumento turn-on activación para la definición de modo menor globalizado (en este caso es el centered-cursor-mode 3 ), y escribir algunos consejos para evitar que se evalúe 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 hacer (con un patrón reutilizable fácil) es deshabilitar inmediatamente el modo secundario local de búfer nuevamente después de que se haya habilitado. Una función after-change-major-mode-hook agregada con el argumento APPEND para add-hook se ejecutará de manera confiable después de que el modo menor globalizado haya actuado, y así podemos 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))

1 o su alias define-global-minor-mode que creo que debería evitarse, debido a la posibilidad de confusión con los modos menores "globales" creados con define-minor-mode . Los modos menores "globalizados", si bien aún implican un modo menor global, funcionan de manera muy diferente en la práctica, por lo que es mejor referirse a ellos como "globalizados" en lugar de "globales".

2 Ch f define-globalized-minor-mode RET muestra que turn-on es el tercer argumento, y verificamos que en la definición de modo con Mx find-function RET global-centered-cursor-mode RET .

3 con este enfoque, este hecho evitará que alguna vez habilite este modo secundario con búferes de modo de respuesta de limo o modo de shell, mientras que un modo menor globalizado con una función de encendido por separado aún podría invocarse en su modo no forma global si así lo desea.

4 https://.com/a/19295380/324105