Làm cách nào tôi có thể nhanh chóng chuyển đổi giữa tệp và bộ đệm * Scratch * có cùng chế độ chính?


24

Đôi khi trong khi làm việc với một mã, thật hữu ích khi nhanh chóng mở bộ đệm * Scratch * để dán đoạn mã từ tệp mã đó.

Nếu tôi đang làm việc với tập lệnh Perl, tôi muốn nhanh chóng mở bộ đệm * Scratch * bằng cperl-mode. Cũng thật tốt khi nhanh chóng quay trở lại bộ đệm mã mà tôi đang làm việc ban đầu.

Câu trả lời:


26

Sẽ thuận tiện khi liên kết các chức năng dưới đây với một ràng buộc quan trọng của sự lựa chọn của bạn. Nếu bạn hiện đang làm việc trên một FILEbộ đệm, việc gọi hàm dưới đây sẽ chuyển đổi giữa FILEbộ đệm * cào * cụ thể ở chế độ chính được gọi *scratch-MAJOR-MODE*FILEbộ đệm.

Lấy ví dụ trong câu hỏi, nếu tôi đang làm việc trên một tập lệnh Perl được gọi myperl.pl, việc gọi hàm này sẽ chuyển đổi giữa myperl.pl*scratch-cperl-mode*.

(defun modi/switch-to-scratch-and-back (&optional arg)
  "Toggle between *scratch-MODE* buffer and the current buffer.
If a scratch buffer does not exist, create it with the major mode set to that
of the buffer from where this function is called.

        COMMAND -> Open/switch to a scratch buffer in the current buffer's major mode
    C-0 COMMAND -> Open/switch to a scratch buffer in `fundamental-mode'
    C-u COMMAND -> Open/switch to a scratch buffer in `org-mode'
C-u C-u COMMAND -> Open/switch to a scratch buffer in `emacs-elisp-mode'

Even if the current major mode is a read-only mode (derived from `special-mode'
or `dired-mode'), we would want to be able to write in the scratch buffer. So
the scratch major mode is set to `org-mode' for such cases.

Return the scratch buffer opened."
  (interactive "p")
  (if (and (or (null arg)               ; no prefix
               (= arg 1))
           (string-match-p "\\*scratch" (buffer-name)))
      (switch-to-buffer (other-buffer))
    (let* ((mode-str (cl-case arg
                       (0  "fundamental-mode") ; C-0
                       (4  "org-mode") ; C-u
                       (16 "emacs-lisp-mode") ; C-u C-u
                       ;; If the major mode turns out to be a `special-mode'
                       ;; derived mode, a read-only mode like `help-mode', open
                       ;; an `org-mode' scratch buffer instead.
                       (t (if (or (derived-mode-p 'special-mode) ; no prefix
                                  (derived-mode-p 'dired-mode))
                              "org-mode"
                            (format "%s" major-mode)))))
           (buf (get-buffer-create (concat "*scratch-" mode-str "*"))))
      (switch-to-buffer buf)
      (funcall (intern mode-str))   ; http://stackoverflow.com/a/7539787/1219634
      buf)))

Làm cách nào tôi có thể loại trừ chế độ chuyển hướng, chế độ hạn và chế độ không thể chỉnh sửa khác cho chức năng này?
godblessfq

@godblessfq Tôi đã sửa lỗi này gần đây trong cấu hình của tôi . Bây giờ bạn có thể lấy phiên bản đó từ đó. Tôi sẽ cập nhật câu trả lời này khi tôi đến máy tính.
Kaushal Modi

@godblessfq Mình đã cập nhật câu trả lời. Hãy thử nó và xem nếu nó làm việc cho bạn.
Kaushal Modi

hoạt động như một lá bùa!
godblessfq
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.