Abilita automaticamente le modalità secondarie in modalità fondamentale


8

In base alla progettazione, si fundamental-modetratta di ossa nude in quanto altre modalità principali dovrebbero derivare da questa.

Dalla pagina delle informazioni (elisp) Major Modes, abbiamo:

Questo è il comando principale per la modalità Fondamentale. A differenza di altri comandi di modalità, non esegue alcun hook di modalità (* nota Convenzioni di modalità principali: :), poiché non è necessario personalizzare questa modalità.

Per tale motivo,

  • Non abbiamo un fundamental-mode-hook.
  • Inoltre my-minor-mode, non viene abilitato SOLO in questi buffer di modalità principali nonostante abbia (global-my-minor-mode 1)nella mia configurazione.

Di seguito funzionerebbe, ma solo se scrivessi manualmente M-x fundamental-mode:

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

Non aiuta nel caso seguente in cui un fundamental-modebuffer (* abcd *) viene creato per impostazione predefinita:

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

Perché voglio abilitare una modalità minore in fundamental-mode?

Mi piace mantenere le associazioni dei tasti personalizzate nella mia mappa delle modalità minori. Ho questa modalità minore abilitata a livello globale (ma non viene abilitata solo nei fundamental-modebuffer).

Ecco un caso d'uso che ha reso questa domanda questa domanda qui. Nel fare M-x esup( esuppacchetto), crea un *esup-log*buffer con fundamental-modela sua modalità principale. Ma ogni volta che devo abilitare manualmente la mia modalità minore per usare i miei comodi collegamenti.

Vorrei abilitare my-minor-modein modo veramente globale, fundamental-modeoppure no.

Aggiornamento 1:

Ecco la mia definizione modo minore: modi-mode.

Aggiornamento 2:

Sulla base del commento di @npostavs , ho esaminato le differenze tra la mia modalità minore modi-modee override-global-modein use-package/bind-key.el. E si scopre che il valore iniziale della mia modalità è nile quello di override-global-modeè t.

Se cambio il valore di inizializzazione della mia modalità su t, anch'esso viene abilitato nei buffer in modalità fondamentale! Ma l'atto di (global-modi-mode 1)non finisce con lo stesso risultato. È strano? Probabilmente un bug?


Una modalità di associazione chiave personalizzata simile viene abilitata nei fundamental-modebuffer per me, quindi forse il problema è nella definizione della tua modalità. override-global-mode
npostavs,

@npostavs Grazie. Esaminerò come lo use-packageimplementa.
Kaushal Modi,

@npostavs Controlla la domanda aggiornata. Risulta che sto affrontando questo problema semplicemente perché il valore di init della mia modalità è nil; ma lo abilito a livello globale.
Kaushal Modi,

1
In buffer.c, sembra che get-buffer-createcorre il buffer-list-update-hookproprio alla fine della sua funzione, forse si potrebbe allegare una propria funzione con le condizioni a quel gancio?
elenco delle leggi

1
Emacs utilizza buffer temporanei "interni" per tutti i tipi di scopi (ad es. Fare una conversione del sistema di codifica per I / O in / da un file o processo può usare un buffer temporaneo). Questi buffer usano la modalità fondamentale e penso sia giusto che non abilitino la tua modalità minore. Per quanto riguarda gli altri buffer, la regola per me è questa: se mai vuoi vedere questo buffer (oltre che per scopi di debug), probabilmente non dovrebbe usare la modalità fondamentale.
Stefan,

Risposte:


4

L'unico modo per ottenere una modalità minore abilitata per impostazione predefinita nei fundamental-modebuffer è impostare il valore di inizializzazione di quella modalità minore su t.

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

Nota che semplicemente attivare una modalità secondaria globalizzata (vedi C-h i g (elisp) Defining Minor Modes) con valore di inizializzazione nil non fa la stessa cosa. In questo caso, fundamental-modeverrà creato un buffer con questa modalità minore disabilitata.


Quanto sopra, ovviamente, funzionerà solo se controlli la sorgente in modalità minore. Per tutte le altre modalità minori fornite con pacchetti diversi, se si desidera abilitare una modalità secondaria per impostazione predefinita nei fundamental-modebuffer, è necessario eseguire

(setq-default the-minor-mode t)

1
Penso che per altre modalità minori potresti fare (setq-default 'the-minor-mode t)per ottenere lo stesso effetto.
npostavs,

Buon punto! Aggiornerò la risposta (rimossa quella singola citazione). Grazie!
Kaushal Modi,

Se aggiungessi (setq-default modi-mode 1)alla funzione turn-on-modi-modee (setq-default modi-mode nil) to the function disattivi-modi-modalità`, saresti un passo avanti nell'abilitare e disabilitare effettivamente la modalità a livello globale.
nispio,

@nispio Questo è un buon punto. Non ho ancora avuto bisogno di farlo. Ma ora so cosa devo fare se devo attivare la mia modalità minore in un buffer in modalità fondamentale.
Kaushal Modi,

2

Non usare fundamental-mode - almeno non in modo interattivo. Raramente vuoi essere presente fundamental-mode. C'è quasi sempre qualcosa di meglio.

Il punto fundamental-modeè di non avere la solita gestione in modalità principale (hook, ecc.). Puoi pensare fundamental-modecome una specie di classe astratta.

Se un pacchetto ti mette in un buffer che è dentro, fundamental-modefai quello che devi fare per impedirlo - usa qualche altra modalità per esso.

Prendi in considerazione la personalizzazione in major-mode modo tale che per impostazione predefinita sia diverso da fundamental-mode. (Io uso indented-text-mode.)


In precedenza c'era default-major-modequesto, che penso fosse un po 'più chiaro, ma hanno deciso di deprecarlo (funziona ancora, ovviamente).

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.

Non sto usando il fundamental-mode. Il nocciolo della questione è che quando un pacchetto utilizza get-buffer-createper generare un buffer temporaneo, quel buffer viene creato con fundamental-modela modalità principale. In quei buffer, la mia modalità minore non sarà abilitata per impostazione predefinita (perché il suo valore di inizializzazione è zero; anche se l'ho abilitato a livello globale).
Kaushal Modi,

Pochi tali pacchetti che possono elencare: esup,keyfreq
Kaushal Modi

Un pacchetto che chiama semplicemente get-buffer-createnon fa nulla per stabilire la modalità principale (o qualsiasi modalità minore). Dovrebbe (per il pacchetto in questione)? In tal caso, prendere in considerazione di contattare il manutentore del pacchetto. In caso contrario, prendi in considerazione l'attivazione della modalità principale o secondaria preferita. IOW, se si tratta di ciò che si desidera e non di ciò che il pacchetto dovrebbe impostare in generale, allora spetta a te configurarlo nel modo desiderato.
Disegnato il

Sarei curioso di sapere perché questo è stato sottoposto a downgrade.
Estratto il

@Drew perché non risolve il problema. L'OP afferma esplicitamente che altre modalità stanno creando buffer in modalità fondamentale e la soluzione proposta è quella di non utilizzare la modalità fondamentale.
nispio,

0

La funzione get-buffer-createè definita in buffer.ce alla fine di quella funzione chiama il buffer-list-update-hook. Tale hook potrebbe essere utilizzato per eseguire una funzione personalizzata, ma potrebbe essere necessario aggiungere alcune condizioni per impedire che la funzione personalizzata venga attivata in momenti inopportuni ogni volta che tale hook viene chiamato da altre funzioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.