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 FILE
bộ đệm, việc gọi hàm dưới đây sẽ chuyển đổi giữa FILE
bộ đệm * cào * cụ thể ở chế độ chính được gọi *scratch-MAJOR-MODE*
và FILE
bộ đệ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
và *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)))