Kleinere Modi im Grundmodus automatisch aktivieren

8

Von Natur aus ist das fundamental-modenackte Knochen, da andere Hauptmodi von diesem abgeleitet werden sollen.

Von der Infoseite (elisp) Major Modeshaben wir:

Dies ist der Hauptmodusbefehl für den Grundmodus. Im Gegensatz zu anderen Mode - Befehle, ist es nicht laufen alle Modus Haken (* Anmerkung Hauptmodus Konventionen: :), da Sie diesen Modus nicht anpassen sollen.

Aus diesem Grund,

  • Wir haben keine fundamental-mode-hook.
  • Wird my-minor-modeauch NUR in diesem Hauptmodus nicht aktiviert, obwohl Puffer (global-my-minor-mode 1)in meiner Konfiguration vorhanden sind.

Unten würde funktionieren, aber nur, wenn ich manuell tippte M-x fundamental-mode:

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

fundamental-modeDies hilft im folgenden Fall nicht, wenn standardmäßig ein Puffer (* abcd *) erstellt wird:

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

Warum möchte ich einen Nebenmodus aktivieren fundamental-mode?

Ich möchte meine benutzerdefinierten Tastenkombinationen in meiner Nebenmoduszuordnung behalten. Ich habe diesen Nebenmodus global aktiviert (aber er wird nicht nur in fundamental-modePuffern aktiviert ).

Hier ist ein Anwendungsfall, bei dem diese Frage hier gestellt wurde. Beim Ausführen M-x esup( esupPaket) wird ein *esup-log*Puffer mit fundamental-modedem Hauptmodus erstellt. Aber jedes Mal muss ich meinen Nebenmodus manuell aktivieren, um meine praktischen Bindungen zu verwenden.

Ich möchte auf my-minor-modewirklich globale Weise aktivieren fundamental-modeoder nicht.

Update 1:

Hier ist meine Definition des Nebenmodus : modi-mode.

Update 2:

Basierend auf @npostavs' Kommentar, wiederholt ich , was zwischen meiner Moll anders ist modi-modeund override-global-modein use-package/bind-key.el. Und es stellt sich heraus, dass der Init-Wert meines Modus nilund der von override-global-modeist t.

Wenn ich den Init-Wert meines Modus auf ändere t, wird er auch in den Grundmodus-Puffern aktiviert! Aber der Akt von (global-modi-mode 1)endet nicht mit dem gleichen Ergebnis. Ist das seltsam? Wahrscheinlich ein Fehler?

Kaushal Modi
quelle
Ein ähnlicher benutzerdefinierter Schlüsselbindungsmodus wird fundamental-modefür mich in Puffern aktiviert , sodass das Problem möglicherweise in der Definition Ihres Modus liegt. override-global-mode
npostavs
@npostavs Danke. Ich werde überprüfen, wie das use-packageumgesetzt wird.
Kaushal Modi
@npostavs Bitte überprüfen Sie die aktualisierte Frage. Es stellt sich heraus, dass ich mit diesem Problem konfrontiert bin, nur weil der Init-Wert meines Modus ist nil. aber ich aktiviere es global.
Kaushal Modi
1
In buffer.c, es sieht aus wie get-buffer-createläuft das buffer-list-update-hookganz am seiner Funktion beenden, vielleicht könnten Sie Ihre eigene Funktion mit Bedingungen an diesem Haken befestigen?
Lawlist
1
Emacs verwendet "interne" temporäre Puffer für alle Arten von Zwecken (z. B. kann bei der Konvertierung des Codierungssystems für E / A in / aus einer Datei oder einem Prozess ein temporärer Puffer verwendet werden). Diese Puffer verwenden den Grundmodus und ich denke, es ist richtig, dass sie Ihren Nebenmodus nicht aktivieren. Wie bei anderen Puffern lautet die Regel für mich: Wenn Sie diesen Puffer jemals sehen möchten (außer zu Debugging-Zwecken), sollte er wahrscheinlich nicht den Fundamental-Modus verwenden.
Stefan

Antworten:

4

Die einzige Möglichkeit, einen Nebenmodus in fundamental-modePuffern standardmäßig zu aktivieren, besteht darin, den Init-Wert dieses Nebenmodus auf zu setzen t.

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

Beachten Sie, dass das einfache Umschalten auf einen globalisierten Nebenmodus (siehe C-h i g (elisp) Defining Minor Modes) mit dem Init-Wert nil nicht dasselbe bewirkt. In diesem Fall wird ein fundamental-modePuffer mit deaktiviertem Nebenmodus erstellt.


Das Obige funktioniert natürlich nur, wenn Sie die Quelle für den Nebenmodus steuern. Wenn Sie für alle anderen Nebenmodi, die mit unterschiedlichen Paketen geliefert werden, standardmäßig einen Nebenmodus in fundamental-modePuffern aktivieren möchten, müssen Sie dies tun

(setq-default the-minor-mode t)
Kaushal Modi
quelle
1
Ich denke, für andere Nebenmodi könnte (setq-default 'the-minor-mode t)man den gleichen Effekt erzielen.
npostavs
Guter Punkt! Ich werde die Antwort aktualisieren (das einfache Anführungszeichen entfernt). Vielen Dank!
Kaushal Modi
Wenn Sie (setq-default modi-mode 1)die Funktion turn-on-modi-modeund den (setq-default modi-mode nil) to the function Modi-Modus ausschalten würden, wären Sie der tatsächlichen globalen Aktivierung und Deaktivierung des Modus einen Schritt näher .
Nispio
@nispio Das ist ein guter Punkt. Ich musste das noch nicht tun. Aber jetzt weiß ich, was ich tun muss, wenn ich meinen Nebenmodus in einem Puffer im Grundmodus umschalten muss.
Kaushal Modi
2

Nicht verwenden fundamental-mode - zumindest nicht interaktiv. Du willst selten dabei sein fundamental-mode. Es gibt fast immer etwas Besseres.

Der springende Punkt fundamental-modeist, nicht die übliche Handhabung im Hauptmodus (Haken usw.) zu haben. Sie können sich eine fundamental-modeArt abstrakte Klasse vorstellen.

Wenn Sie durch ein Paket in einen Puffer versetzt werden, fundamental-modetun Sie, was Sie tun müssen, um dies zu verhindern. Verwenden Sie dafür einen anderen Modus.

Ziehen Sie eine Anpassung in Betracht, major-modesodass standardmäßig etwas anderes als verwendet wird fundamental-mode. (Ich benutze indented-text-mode.)


Früher gab es default-major-modedafür, was ich für etwas klarer halte, aber sie haben beschlossen, das abzulehnen (es funktioniert natürlich immer noch).

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.
Drew
quelle
Ich benutze das nicht fundamental-mode. Der springende Punkt ist, dass, wenn ein Paket get-buffer-createeinen temporären Puffer generiert, dieser Puffer als Hauptmodus erstellt wird fundamental-mode. In diesen Puffern wird mein Nebenmodus standardmäßig nicht aktiviert (da sein Init-Wert Null ist, obwohl ich ihn global aktiviert habe).
Kaushal Modi
Einige solche Pakete kann ich auflisten : esup,keyfreq
Kaushal Modi
Ein Paket, das nur aufruft, get-buffer-createunternimmt nichts, um den Hauptmodus (oder einen Nebenmodus) einzurichten. Sollte es (für das betreffende Paket)? Wenden Sie sich in diesem Fall an den Paketbetreuer. Wenn nicht, sollten Sie Ihren bevorzugten Dur- oder Moll-Modus selbst aktivieren. IOW, wenn es darum geht, was Sie wollen und nicht, was das Paket allgemein einrichten soll , dann liegt es an Ihnen, es so einzurichten, wie Sie es möchten.
Drew
Ich wäre gespannt, warum dies abgelehnt wurde.
Drew
@ Zeichnete, weil es das Problem nicht behebt. Das OP gibt ausdrücklich an, dass andere Modi Puffer im Grundmodus erstellen, und Ihre vorgeschlagene Lösung besteht darin, den Grundmodus nicht zu verwenden.
Nispio
0

Die Funktion get-buffer-createist in definiert buffer.cund ruft ganz am Ende dieser Funktion die auf buffer-list-update-hook. Ein solcher Hook könnte zum Ausführen einer benutzerdefinierten Funktion verwendet werden, es müssen jedoch möglicherweise bestimmte Bedingungen hinzugefügt werden, um zu verhindern, dass die benutzerdefinierte Funktion zu ungünstigen Zeitpunkten ausgelöst wird, wenn dieser Hook von anderen Funktionen aufgerufen wird.

Gesetzesliste
quelle