sao chép nội dung của bộ đệm hiện tại trong bộ đệm tạm thời và hoạt động trên đó


8

Tôi cần sao chép nội dung của bộ đệm hiện tại vào bộ đệm tạm thời, đặt bộ đệm đó sang một chế độ chính cụ thể để tận dụng lợi ích của nó và lấy thông tin tôi cần trở lại logic chính.

Đây có phải là sự điên rồ hoàn toàn? Và nếu không, cấu trúc cho việc này là gì?

Câu trả lời:


10

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-windowcó ràng buộc với C-x 4 c( C-x 4tiền tố cửa sổ và ccho 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)))))

8

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)))

2
Đã viết lên gần như chính xác đó. Chỉ cần bọc nó trong một defun nếu bạn cần có thể gọi nó một cách tùy tiện
Jonathan Leech-Pepin

Điều đó có vẻ khá tốt. Tôi sẽ chờ một chút, chỉ trong trường hợp có thứ gì đó tốt hơn để đánh dấu là được chấp nhận, nhưng tôi nghĩ đây là nó :)
Trevoke

Tôi đã thực sự đề nghị 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
Nsukami _

2

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))))))

1

Đố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-backcho 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 đó:

  • Tạo chức năng bao bọc để sao chép bộ đệm hiện có của bạn, tạo bộ đệm * Scratch * với cùng chế độ chính và dán nội dung được sao chép.

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))
  • Bây giờ bạn có thể liên kết khóa này copy-current-buffer-to-scratchvớ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.
  • Khi bạn hài lòng với các chỉnh sửa trong bộ đệm đầu, bạn sẽ cần sao chép thủ công phần được yêu cầu trở lại bộ đệm ban đầu.

Đâ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.