Activer automatiquement les modes mineurs en mode fondamental

8

De par sa conception, les fundamental-modeos sont nus, car d'autres modes majeurs sont censés dériver de celui-ci.

Depuis la page info (elisp) Major Modes, nous avons:

Il s'agit de la commande de mode principale pour le mode fondamental. Contrairement aux autres commandes de mode, il ne pas exécuter des crochets en mode (note * Conventions de mode majeur: :), puisque vous n'êtes pas censé personnaliser ce mode.

Pour cette raison,

  • Nous n'en avons pas fundamental-mode-hook.
  • N'obtient également my-minor-modepas activé UNIQUEMENT dans ce mode majeur tampons malgré avoir (global-my-minor-mode 1)dans ma config.

Ci-dessous fonctionnerait mais seulement si je tapais manuellement M-x fundamental-mode:

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

Cela n'aide pas dans le cas ci-dessous où un fundamental-modetampon (* abcd *) est créé par défaut:

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

Pourquoi je veux activer un mode mineur dans fundamental-mode?

J'aime conserver mes raccourcis clavier personnalisés dans ma carte de mode mineur. J'ai ce mode mineur activé globalement (mais il n'est pas activé uniquement dans les fundamental-modetampons).

Voici un cas d'utilisation qui a permis de poser cette question ici. En faisant M-x esup( esuppackage), il crée un *esup-log*tampon avec fundamental-modecomme mode principal. Mais à chaque fois, je dois activer mon mode mineur manuellement pour utiliser mes liaisons pratiques.

J'aimerais activer my-minor-moded'une manière vraiment mondiale, fundamental-modeou non.

Mise à jour 1:

Voici mon mode mineur définition: modi-mode.

Mise à jour 2:

Sur la base du commentaire de @npostavs , j'ai examiné ce qui diffère entre mon mode mineur modi-modeet override-global-modedans use-package/bind-key.el. Et il se trouve que la valeur init de mon mode est nilet celle de override-global-modeis t.

Si je change la valeur init de mon mode en t, elle est également activée dans les tampons en mode fondamental! Mais l'acte de (global-modi-mode 1)ne se termine pas avec le même résultat. Est-ce étrange? Probablement un bug?

Kaushal Modi
la source
Un mode de liaison de clés personnalisé similaire est activé dans les fundamental-modetampons pour moi, donc peut-être que le problème est dans la définition de votre mode. override-global-mode
npostavs
@npostavs Merci. Je vais passer en revue comment use-packagemet en œuvre cela.
Kaushal Modi
@npostavs Veuillez vérifier la question mise à jour. Il s'avère que je suis confronté à ce problème simplement parce que la valeur d'initialisation de mon mode est nil; mais je l'active globalement.
Kaushal Modi
1
Dans buffer.c, il semble que get-buffer-creates'exécute le tout buffer-list-update-hookà la fin de sa fonction, peut-être pourriez-vous attacher votre propre fonction avec des conditions à ce crochet?
lawlist
1
Emacs utilise des tampons temporaires "internes" à toutes sortes de fins (par exemple, la conversion du système de codage pour les E / S vers / depuis un fichier ou un processus peut utiliser un tampon temporaire). Ces tampons utilisent le mode fondamental et je pense qu'il est juste de ne pas activer votre mode mineur. En ce qui concerne les autres tampons, la règle pour moi est la suivante: si jamais vous voulez voir ce tampon (autre qu'à des fins de débogage), il ne devrait probablement pas utiliser le mode fondamental.
Stefan

Réponses:

4

La seule façon d'obtenir un mode mineur activé par défaut dans les fundamental-modetampons est de définir la valeur d'initialisation de ce mode mineur sur t.

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

Notez que simplement basculer sur un mode mineur globalisé (voir C-h i g (elisp) Defining Minor Modes) avec la valeur init nil ne fait pas la même chose. Dans ce cas, un fundamental-modetampon sera créé avec ce mode mineur désactivé.


Ce qui précède, bien sûr, ne fonctionnera que si vous contrôlez la source du mode mineur. Pour tous les autres modes mineurs fournis avec des packages différents, si vous souhaitez activer un mode mineur par défaut dans les fundamental-modetampons, vous devez le faire

(setq-default the-minor-mode t)
Kaushal Modi
la source
1
Je pense que pour d'autres modes mineurs, vous pourriez faire (setq-default 'the-minor-mode t)pour obtenir le même effet.
npostavs
Bon point! Je mettrai à jour la réponse (supprimé cette citation unique). Merci!
Kaushal Modi
Si vous avez ajouté (setq-default modi-mode 1)à la fonction turn-on-modi-modeet (setq-default modi-mode nil) to the function turn-off-Modi-mode`, alors vous seriez un peu plus de fait permettant au niveau mondial et de désactiver le mode.
nispio
@nispio C'est un bon point. Je n'ai pas encore eu besoin de faire ça. Mais maintenant, je sais ce que je dois faire si je dois basculer mon mode mineur dans un tampon en mode fondamental.
Kaushal Modi
2

N'utilisez pas fundamental-mode - du moins pas de manière interactive. Vous voulez rarement y participer fundamental-mode. Il y a presque toujours quelque chose de mieux.

Le tout fundamental-modeest de ne pas avoir le traitement habituel en mode majeur (hooks etc.). Vous pouvez penser fundamental-modeà une sorte de classe abstraite.

Si un paquet vous met dans un tampon qui se trouve fundamental-modealors faites ce que vous devez faire pour éviter cela - utilisez un autre mode pour cela.

Envisagez de le personnaliser major-mode pour qu'il soit par défaut différent de fundamental-mode. (J'utilise indented-text-mode.)


Auparavant, il y en avait default-major-modepour cela, ce qui, je pense, était un peu plus clair, mais ils ont décidé de le déprécier (cela fonctionne toujours, bien sûr).

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.
A dessiné
la source
Je n'utilise pas le fundamental-mode. Le nœud du problème est que lorsqu'un package utilise get-buffer-createpour générer un tampon temporaire, ce tampon est créé avec fundamental-modecomme mode principal. Dans ces tampons, mon mode mineur ne sera pas activé par défaut (car sa valeur init est nulle; même si je l'ai activé globalement).
Kaushal Modi
Peu de ces paquets je peux énumérer: esup,keyfreq
Kaushal Modi
Un package qui ne fait get-buffer-createqu'appeler ne fait rien pour établir le mode majeur (ou tout mode mineur). Faut- il (pour le paquet en question)? Si c'est le cas, pensez à contacter le responsable du package. Sinon, pensez à activer vous-même votre mode majeur ou mineur préféré. IOW, si c'est à propos de ce que vous voulez, et non de ce que le package doit configurer en général, alors c'est à vous de le configurer comme vous le souhaitez.
Drew
Je serais curieux de savoir pourquoi cela a été rejeté.
Drew
@Drew, car il ne résout pas le problème. L'OP indique explicitement que d'autres modes créent des tampons en mode fondamental, et la solution que vous proposez est de ne pas utiliser le mode fondamental.
nispio
0

La fonction get-buffer-createest définie dans buffer.c, et à la toute fin de cette fonction, elle appelle le buffer-list-update-hook. Un tel crochet peut être utilisé pour exécuter une fonction personnalisée, mais certaines conditions peuvent devoir être ajoutées pour empêcher la fonction personnalisée de se déclencher à des moments inopportuns chaque fois que ce crochet est appelé par d'autres fonctions.

liste des lois
la source