Wenn ich in der Emacs-Hilfe nach Funktionen über C-h f
suche, möchte ich oft einen Blick in die Elisp / C-Implementierung werfen. Ich möchte view-mode
automatisch eingeben , wenn ich auf diese Weise auf den Quellcode zugreife, um unnötige Änderungen zu vermeiden. Gibt es einen Haken oder eine Funktion, die ich empfehlen kann, um dies zu erreichen?
10
emacs-lisp-mode
und ich mache es nur,C-x C-q
wenn ich den Quellcode bearbeiten möchte.(defun set-buffer-read-only () (setq buffer-read-only t)) (add-hook 'emacs-lisp-mode-hook 'set-buffer-read-only)
Antworten:
Update (nach einer Nacht Schlaf): Diese Antwort hat einen großen Fehler: Sie ermöglicht das
view-mode
Navigieren zu einer beliebigen Funktion, nicht nur zu Emacs-Quellen. Dies kann behoben werden, aber Sie sollten die Antwort von @phils verwenden .Beim Ausführen
C-h f describe-function RET
und anschließenden Lesen des Quellcodes von stelltedescribe-function
ich fest, dass eine "Schaltfläche" eines speziellen Typs für Links zu Funktionsdefinitionen erstellt wird :help-function-def
.Das Laufen
zrgrep
mit dieser Zeichenfolge ("help-function-def
") hat mich darauf hingewiesenhelp-mode.el.gz
.Nach all dem Herumgraben können wir diesen Schaltflächentyp durch unseren eigenen ersetzen (beachten Sie den Kommentar im Code):
Soweit ich das beurteilen kann, gibt es keine Funktion, zu der Ratschläge hinzugefügt werden können: Emacs verwendet
lambda
hier ein. Andererseits kann man (wie von @rationalrevolt hervorgehoben ) diehelp-function
Eigenschaft deshelp-function-def
Schaltflächentyps ersetzen :quelle
button-type-get
undbutton-type-put
durch mein eigenes zu ersetzen, das an das vorhandene Lambda weitergeleitet wird.Sie können verzeichnislokale Variablen verwenden , um die Quelldateien von Emacs standardmäßig schreibgeschützt zu machen. (Siehe auch C-hig
(emacs) Directory Variables
RET).Erstellen Sie eine Datei
.dir-locals.el
mit dem folgenden Inhalt, die im Stammverzeichnis des zu schützenden Verzeichnisbaums aufgerufen wird :Bearbeiten: Michał Politowski weist in den Kommentaren darauf hin, dass das Aktivieren
view-mode
auf diese Weise problematisch ist, denn wenn Sie den Puffer qdamit schließen, wird auch der Modus deaktiviert, was bedeutet, dass der Puffer beim nächsten Besuchview-mode
nicht aktiviert wird.Bearbeiten 2: Constantine hat in den folgenden Kommentaren eine Lösung für dieses Problem bereitgestellt:
Dies fügt sinnvollerweise einen Test hinzu, um sicherzustellen, dass der Puffer bereits eine Datei besucht. Die Schlüsseländerung ist jedoch die Verwendung von
view-mode-enter
anstelle vonview-mode
, da erstere einEXIT-ACTION
Argument verwendet, das bestimmt, was zu tun ist, wenn qeingegeben wird. In diesem Fall besteht die Exit-Aktion darin, den Puffer zu beenden und sicherzustellen, dass die Datei beim nächsten Besuch erneut in gespeichert wirdview-mode
.Edit 3: Wenn wir diesem Pfad folgen , können wir auch sehen, dass das Angegebene
EXIT-ACTION
letztendlich an dieview-mode-exit
Funktion übergeben wird, und seine Dokumentzeichenfolge gibt uns eine alternative Lösung:Daher können wir Folgendes verwenden:
Ich verwende den alternativen Ansatz, den Sie vollständig in Ihrer Init-Datei angeben können (im Gegensatz zum Erstellen einer
.dir-locals.el
Datei), und mache die Dateien einfach schreibgeschützt, anstatt sie zu verwendenview-mode
. Meine Konfiguration sieht folgendermaßen aus:Natürlich können Sie dasselbe für Ihr elpa-Verzeichnis und jedes andere Verzeichnis tun, das Quellcode von Drittanbietern enthält.
quelle
.dir-locals.el
mich selbst Bescheid und benutze mich selbst ...)find-file-hook
und einerread-only-dirs
Liste, aber ich mag diesen Ansatz.((nil . ((eval . (view-mode 1)))))
was ist der einfachste Weg , umView-quit
die Puffer über Hilfe zugegriffen zu töten? Andernfallsq
bleibt der Puffer nach dem Verlassen der Quellansicht durch Drücken zurück und wenn später über die Hilfe erneut auf Quellen aus derselben Datei zugegriffen wird, wird der Ansichtsmodus nicht gestartet.view-mode
.((nil . ((eval . (when buffer-file-name (view-mode-enter nil #'kill-buffer))))))
(note(view-mode-enter ...)
anstelle von(view-mode 1)
). Auf diese Weise drückenq
tötet den Puffer undview-mode
wird das nächste Mal besuche ich die gleiche Datei aktiviert.Ich denke, alles was Sie brauchen, ist einen Haken hinzuzufügen :
quelle
view-mode
wenn Sie zu einer Funktion navigierenC-h f
, die nicht nur Emacs-Quellen verwendet.find-THING
Befehle diesen Hook verwenden und die Hilfetasten umgehen ihn.Dies betrifft nicht Ihren speziellen Fall, sondern den allgemeineren Fall des Wechsels zu,
view-mode
wenn Sie eine Quelldatei aus einem Hilfepuffer besuchen. Ich biete es als Alternative zu @ Constantines Antwort an, da es nicht als Kommentar lesbar war.Ich sehe so aus, als hätte ich das ursprünglich aus dem EmacsWiki bekommen .
quelle
Hier ist eine Lösung für die integrierte Dokumentation und ein Beispiel für die Erweiterung auf ELPA. Es funktioniert, indem der Pfad zur aktuellen Datei mit einigen regulären Ausdrücken abgeglichen und angewendet wird,
read-only-mode
wenn einer von ihnen übereinstimmt.Beachten Sie, dass der Puffer schreibgeschützt ist, wenn Sie ihn
dired
nicht nur über die Hilfe, sondern auch besuchen .Ich habe einen Hook hinzugefügt, der nach der Eingabe ausgeführt wird und
emacs-lisp-mode
prüft, ob der Pfad zur Datei übereinstimmt./\.el\.gz$/
Wenn dies der Fall ist, wird der schreibgeschützte Modus angewendet.Hier ist ein Beispiel, das auch ELPA überprüft und dabei die Heuristik verwendet, dass jeder Pfad, der enthält,
.emacs.d/elpa
tatsächlich ELPA-Code ist.quelle