Se si desidera copiare alcune informazioni in un altro buffer, e da quel momento in poi consentire ai buffer di evolversi in modo indipendente, è possibile farlo .
Ma se si desidera che l'altro buffer rifletta il contenuto originale in tempo reale, Emacs fornisce buffer indiretti . Un buffer indiretto è un altro buffer che ha lo stesso contenuto dell'originale (le modifiche in un buffer si riflettono nell'altro buffer), ma impostazioni diverse: una modalità principale diversa, diverse modalità secondarie, variabili locali diverse, un punto diverso, segni diversi , un restringimento diverso, ecc.
In questo modo è possibile ottenere una vista di una parte di un buffer in una diversa modalità principale, tenendo traccia delle modifiche nel buffer originale e riflettendo le modifiche nel buffer originale. Per prima cosa crea un buffer indiretto con M-x clone-indirect buffer
; c'è anche quello a clone-indirect-buffer-other-window
cui è associato C-x 4 c
( C-x 4
prefisso finestra e c
per clone ). Nel buffer clonato, restringere l'area desiderata: selezionare la parte interessante ed eseguire C-x n n
( narrow-to-region
). Modificare la modalità principale come desiderato.
Puoi automatizzarlo con un comando come questo per un uso interattivo:
(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)))
Per la programmazione utilizzare:
(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)))))