Wenn Sie einige Informationen in einen anderen Puffer kopieren und von da an die Puffer unabhängig voneinander entwickeln möchten, können Sie genau das tun .
Wenn Sie jedoch möchten, dass der andere Puffer den ursprünglichen Inhalt in Echtzeit widerspiegelt, stellt Emacs diesen indirekte Puffer zur Verfügung . Ein indirekter Puffer ist ein weiterer Puffer, der den gleichen Inhalt wie das Original hat (Änderungen in einem Puffer werden im anderen Puffer wiedergegeben), jedoch unterschiedliche Einstellungen: ein anderer Hauptmodus, verschiedene Nebenmodi, verschiedene lokale Variablen, ein anderer Punkt, verschiedene Markierungen , eine andere Verengung usw.
So können Sie einen Teil eines Puffers in einem anderen Hauptmodus anzeigen, während Sie Änderungen im ursprünglichen Puffer verfolgen und Änderungen am ursprünglichen Puffer wiedergeben. Machen Sie zuerst einen indirekten Puffer mit M-x clone-indirect buffer
; es gibt auch clone-indirect-buffer-other-window
was gebunden ist C-x 4 c
( C-x 4
Fensterpräfix und c
für Klon ). In dem geklonten Puffer, verengt , um die gewünschte Region: Wählen Sie den interessanten Teil und Lauf C-x n n
( narrow-to-region
). Ändern Sie den Hauptmodus wie gewünscht.
Sie können dies mit einem Befehl wie diesem für die interaktive Verwendung automatisieren:
(defun edit-region-in-foo-mode (beg end)
(interactive "@r")
(let ((new-buffer (clone-indirect-buffer nil t)))
(narrow-to-region beg end)
(foo-mode)))
Zur Programmierung verwenden:
(defmacro with-indirect-buffer-in-foo-mode (beg end &rest body)
`(with-current-buffer (clone-indirect-buffer nil nil)
(narrow-to-region beg end)
(foo-mode)
(unwind-protect
,body
(kill-buffer (current-buffer)))))
Gilles 'SO - hör auf böse zu sein'
quelle
M-x copy-to-buffer
, dann habe ich die @ legoscia-Antwort rot, was wahrscheinlich das ist, was Sie wollen. Wenn der Extraktionsprozess und derMir hat gefallen, was @ Gilles geschrieben hat. Ich habe geändert, was @Gilles geschrieben hat, um den Benutzer zu fragen, welchen Modus er verwenden möchte. Sie können das, was ich geschrieben habe, bearbeiten, um die von Ihnen bevorzugten Modi bereitzustellen, oder den Aufruf sogar so ändern, dass der Lesevorgang abgeschlossen ist, sodass Sie einen Modus bereitstellen können, der nicht in der Standardliste enthalten ist.
quelle
Für einen ähnlichen Anwendungsfall hatte ich eine Elisp-Funktion geschrieben
modi/switch-to-scratch-and-back
, mit der Sie schnell zwischen einer Pufferdatei und einem * Scratch * -Puffer mit demselben Hauptmodus wie der FILE-Puffer wechseln können. Die oben verlinkte Hyperlink-Funktion führt Sie zu einer vorhandenen Emacs SE-Frage.So können Sie diese Funktion verwenden:
Hier ist ein Beispiel für eine Wrapper-Funktion
copy-current-buffer-to-scratch
an einen Schlüssel binden , wenn Sie dies wünschen. Wenn Sie ihn ausführen, erhalten Sie einen * Scratch * -Puffer mit Inhalten aus Ihrem Arbeitspuffer.Dies ist nur eine andere Möglichkeit, das zu tun, was Sie wollen. Möglicherweise möchten Sie jedoch indirekte Puffer verwenden, über die die @ Gilles-Lösung spricht. Dieser Ansatz ist nützlich, wenn Sie einige umfangreiche Änderungen in einem temporären Puffer vornehmen müssen, ohne das Risiko eines versehentlichen Speicherns im ursprünglichen Puffer einzugehen, bis Sie eine stabile Lösung erreicht haben.
Ein Beispiel für einen Anwendungsfall ist das Ausprobieren experimenteller Elisp-Funktionen, bevor diese auf Ihrem Emacs-Init gespeichert werden.
quelle