Câu trả lời:
Nếu bạn muốn sao chép một số thông tin vào bộ đệm khác, và từ đó hãy để bộ đệm phát triển độc lập, bạn có thể làm điều đó .
Nhưng nếu bạn muốn bộ đệm khác phản ánh nội dung gốc trong thời gian thực, thì Emacs cung cấp bộ đệm gián tiếp này . Bộ đệm gián tiếp là một bộ đệm khác có cùng nội dung với bản gốc (sửa đổi trong một bộ đệm được phản ánh trong bộ đệm khác), nhưng các cài đặt khác nhau: một chế độ chính khác nhau, các chế độ phụ khác nhau, các biến cục bộ khác nhau, một điểm khác nhau, các dấu hiệu khác nhau , một sự thu hẹp khác nhau, v.v.
Vì vậy, bạn có thể có được chế độ xem một phần của bộ đệm ở chế độ chính khác, đồng thời theo dõi các sửa đổi trong bộ đệm ban đầu và phản ánh các sửa đổi trở lại bộ đệm ban đầu. Đầu tiên tạo một bộ đệm gián tiếp với M-x clone-indirect buffer
; cũng clone-indirect-buffer-other-window
có ràng buộc với C-x 4 c
( C-x 4
tiền tố cửa sổ và c
cho bản sao ). Trong bộ đệm nhân bản, thu hẹp đến vùng bạn muốn: chọn phần thú vị và chạy C-x n n
( narrow-to-region
). Thay đổi chế độ chính như mong muốn.
Bạn có thể tự động hóa điều đó bằng một lệnh như thế này để sử dụng tương tác:
(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)))
Để sử dụng lập trình:
(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)))))
Một cái gì đó như thế này:
(let ((old-buffer (current-buffer)))
(with-temp-buffer
(insert-buffer-substring old-buffer)
(my-favourite-major-mode 1)
(extract-needed-information)))
M-x copy-to-buffer
, sau đó tôi đỏ câu trả lời @legoscia, đó có lẽ là những gì bạn muốn. nếu quá trình trích xuất và chế độ chính giống nhau, một chức năng sẽ tốt hơn
Tôi thích những gì @Gilles đã viết. Tôi đã sửa đổi những gì @Gilles đã viết để hỏi người dùng họ muốn sử dụng chế độ nào. Bạn có thể chỉnh sửa những gì tôi đã viết để cung cấp bất kỳ chế độ nào bạn thích hoặc thậm chí thay đổi cuộc gọi để hoàn thành đọc để nó cho phép bạn cung cấp một chế độ không được cung cấp trong danh sách mặc định.
(defun edit-region-in-mode (beg end)
"Create an indirect buffer cloned from the current buffer and
narrowed to the highlighted region. The cloned indirect buffer
will have org-mode active. Changes to the indirect buffer will
be updated in real time in the originating buffer. This is
useful, for instance, when you are in a non-org-mode mode and
want to edit table data or in a non-emacs-lisp mode and want to
write some elisp utilizing code formatting and highlighting."
(interactive "@r")
(let ((new-buffer (clone-indirect-buffer nil t)))
(narrow-to-region beg end)
(funcall
(intern
(completing-read
"Choose the mode you want to use when editing the highlighted region: "
'(org-mode emacs-lisp-mode lisp-mode haskell-mode julia-mode
python-mode mathematica-mode matlab-mode c++-mode))))))
Đối với trường hợp sử dụng tương tự, tôi đã viết một hàm elisp modi/switch-to-scratch-and-back
cho phép bạn chuyển nhanh giữa bộ đệm FILE và bộ đệm * Scratch * có cùng chế độ chính với bộ đệm FILE. Hàm siêu liên kết ở trên sẽ dẫn bạn đến một câu hỏi SE emacs hiện có.
Đây là cách bạn có thể sử dụng chức năng đó:
Dưới đây là một hàm bao bọc ví dụ
(defun copy-current-buffer-to-scratch ()
"Copied the current buffer, open scratch, paste it there."
(interactive)
(kill-ring-save (point-min) (point-max))
(modi/switch-to-scratch-and-back)
(yank))
copy-current-buffer-to-scratch
với khóa nếu bạn muốn và thực thi nó sẽ cung cấp cho bạn bộ đệm * cào * với nội dung từ bộ đệm làm việc của bạn.Đây chỉ là một cách khác để làm những gì bạn muốn; mặc dù bạn có thể muốn sử dụng bộ đệm gián tiếp mà giải pháp của @Gilles nói về. Cách tiếp cận này hữu ích nếu bạn cần thực hiện một số chỉnh sửa nặng trong bộ đệm tạm thời mà không gặp rủi ro lưu ngẫu nhiên trong bộ đệm ban đầu cho đến khi bạn đạt được giải pháp ổn định.
Một trường hợp sử dụng ví dụ là thử các chức năng elisp thử nghiệm trước khi lưu chúng vào init emacs của bạn.