2011-07-26 15 views
17

he centrado en el cursor de modo activa globaly, así:desactivar automáticamente un modo menor global para un modo mayor específica

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

Funciona bien, pero hay algunos modos principales donde te gustaría desactivar de forma automática Por ejemplo slime-repl y shell.

Hay otra pregunta sobre 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 centrado-cursor-mode.

Probé este enganche, pero no tiene ningún 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)))) 

Respuesta

11

hice un nuevo modo menor global, que no consigue activar en ciertos modos. La lambda es la función que se llama en cada nuevo buffer 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.

+0

Parece que no funciona cuando cambias de un modo principal a otro – xuhdev

10

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-modeRET muestra que turn-on es el tercer argumento, y, comprobamos que en la definición de modo con M-xfind-functionRETglobal-centered-cursor-modeRET.

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

+0

Gracias por su respuesta. Intenté este enganche: – chrm

Cuestiones relacionadas