2011-07-26 12 views
17

mam skupione-kursor w trybie aktywnym globaly, tak:automatycznie wyłączyć globalnego trybu drobne dla konkretnego głównego trybu

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

To działa dobrze, ale istnieją pewne główne tryby, w których chciałbym, aby wyłączyć to automatycznie. Na przykład śluzowaty i skorupa.

Jest jeszcze jedno pytanie dotyczące tego samego problemu, ale inny tryb pomocniczy. Niestety, odpowiedzi oferują tylko obejścia tego specyficznego trybu drugorzędnego (tryb globalnej inteligentnej karty), który nie działa z trybem kursora wyśrodkowanego.

Próbowałem tego haka, ale nie ma ono żadnego efektu. Zmienna nie zmienia się.

(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)))) 

Odpowiedz

11

zrobiłem nowego globalnego trybu drobne, że nie zostanie aktywowany w niektórych trybach. Funkcja lambda to funkcja, która jest wywoływana w każdym nowym buforze, aby aktywować tryb pomocniczy. To jest odpowiednie miejsce na wyjątki.

(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) 

Powinno działać dla każdego innego globalnego trybu pomocniczego. Po prostu skopiuj definicję global-xxx-mode i ustaw właściwe wyjątki.

+0

Nie wydaje się działać po przełączeniu z jednego trybu głównego na inny – xuhdev

10

Globalne pomniejsze tryby stworzone z define-globalized-minor-mode makro są nieco skomplikowane. Powodem, dla którego twój kod nie wydaje się nic robić, jest to, że tryby globalizacji wykorzystują after-change-major-mode-hook, aby aktywować buforowy tryb lokalny podrzędny, który kontrolują; i ten hak uruchamia się natychmiast po po głównych hakach trybu głównego, .

Poszczególne tryby mogą zaimplementować niestandardowe sposoby określania jakiejś czarnej listy lub inną metodę zapobiegania włączaniu trybu w pewnych okolicznościach, więc ogólnie warto byłoby spojrzeć na odpowiednie opcje M-x customize-group pakietu, aby sprawdzić, czy takie urządzenia istnieją. Jednak miła, czysta, ogólna droga do osiągnięcia tego w KAŻDYM zglobalizowanym, drugorzędnym trybie, mi się wymyka.

To wielka szkoda, że ​​funkcja MODE-enable-in-buffers zdefiniowana przez to makro nie wykonuje tego samego testu, który jest wykonywany przez funkcję trybu globalnego. Jeśli tak, to możesz może po prostu użyć slime-repl-mode-hook, aby bufor zmienny trybu globalnego-lokalny i zerowy.

Szybkie Hack jest sprawdzenie co turn-on argument jest dla zglobalizowanym moll definicji trybu (w tym przypadku jest to centered-cursor-mode sama) i napisać jakiś wokół radę powstrzymać że od ocenianego dla trybów w pytaniu.

(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) 

Coś my może do (z łatwym wielokrotnego użytku wzór) jest natychmiast ponownie wyłączyć tryb buforowy-local-moll po jego włączeniu. after-change-major-mode-hook funkcja dodana z APPEND argument add-hook będzie niezawodnie uruchamiany po zglobalizowanym trybie moll działał, a więc możemy robić takie rzeczy jak:

(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)) 

lub jego alias define-global-minor-mode które czuję, że powinienem należy unikać, ze względu na możliwość pomylenia z "globalnymi" trybami podrzędnymi utworzonymi z define-minor-mode. "Zglobalizowane" drugorzędne tryby, choć nadal działają w trybie globalnym drugorzędnym, w praktyce działają bardzo różnie, więc lepiej jest je nazywać "globalizacją" niż "globalną".

CHFdefine-globalized-minor-modeRET pokazuje, że turn-on jest trzeciego argumentu, i sprawdzenia, czy w definicji trybu z m-xfind-functionRETglobal-centered-cursor-modeRET.

z tym podejściem, fakt ten ma uniemożliwić kiedykolwiek włączenie tej niewielki tryb za pomocą śluz-repl-mode lub powłoki trybu buforów, natomiast zglobalizowanym trybie moll z oddzielną funkcją turn-on mógł nadal być powołany w jego nie-globalnej formie, jeśli tego pragniesz.

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

+0

Dzięki za odpowiedź. Próbowałem tego haka: – chrm

Powiązane problemy