Jika Anda ingin menyalin beberapa informasi ke buffer lain, dan sejak saat itu biarkan buffer berkembang secara independen, Anda dapat melakukan hal itu .
Tetapi jika Anda ingin buffer lain untuk mencerminkan konten asli secara real time, maka Emacs menyediakan ini dengan buffer tidak langsung . Buffer tidak langsung adalah buffer lain yang memiliki konten yang sama seperti aslinya (modifikasi dalam satu buffer tercermin dalam buffer lain), tetapi pengaturan berbeda: mode utama berbeda, mode kecil berbeda, variabel lokal berbeda, titik berbeda, tanda berbeda , penyempitan yang berbeda, dll.
Jadi, Anda dapat melihat sebagian buffer dalam mode utama yang berbeda, sambil melacak modifikasi di buffer asli dan memantulkan modifikasi kembali ke buffer asli. Pertama buat buffer tidak langsung dengan M-x clone-indirect buffer
; ada juga clone-indirect-buffer-other-window
yang terikat C-x 4 c
( C-x 4
awalan jendela, dan c
untuk klon ). Di buffer kloning, persempit ke wilayah yang Anda inginkan: pilih bagian yang menarik dan jalankan C-x n n
( narrow-to-region
). Ubah mode utama seperti yang diinginkan.
Anda dapat mengotomatiskannya dengan perintah seperti ini untuk penggunaan interaktif:
(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)))
Untuk penggunaan pemrograman:
(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 'SANGAT berhenti menjadi jahat'
sumber
M-x copy-to-buffer
, lalu saya merah jawaban @legoscia, yang mungkin apa yang Anda inginkan. jika proses ekstraksi & mode utama sama, suatu fungsi akan lebih baikSaya menyukai apa yang ditulis @Gilles. Saya memodifikasi apa yang ditulis @Gilles untuk menanyakan kepada pengguna mode apa yang ingin mereka gunakan. Anda dapat mengedit apa yang saya tulis untuk memberikan mode apa pun yang Anda inginkan atau bahkan mengubah panggilan untuk menyelesaikan membaca sehingga itu akan memungkinkan Anda untuk memberikan mode yang tidak disediakan dalam daftar default.
sumber
Untuk kasus penggunaan yang serupa, saya telah menulis fungsi elisp
modi/switch-to-scratch-and-back
yang memungkinkan Anda untuk beralih dengan cepat antara buffer FILE dan buffer * scratch * yang memiliki mode-utama yang sama dengan buffer FILE. Fungsi hyperlink di atas akan mengarahkan Anda ke pertanyaan SE emacs yang ada.Inilah cara Anda menggunakan fungsi itu:
Berikut adalah contoh fungsi wrapper
copy-current-buffer-to-scratch
ke kunci jika Anda ingin dan menjalankannya akan memberi Anda * awal * buffer dengan konten dari buffer kerja Anda.Ini hanyalah cara lain untuk melakukan apa yang Anda inginkan; Anda mungkin ingin menggunakan buffer tidak langsung yang dibicarakan oleh solusi @Gilles. Pendekatan ini berguna jika Anda perlu melakukan beberapa pengeditan berat dalam buffer sementara tanpa mempertaruhkan penghematan yang tidak disengaja di buffer asli hingga Anda telah mencapai solusi stabil.
Contoh use case sedang mencoba fungsi elisp eksperimental sebelum menyimpannya ke emacs init Anda.
sumber