Bagaimana saya bisa dengan cepat beralih di antara file dan buffer * scratch * yang memiliki mode utama yang sama?

24

Kadang-kadang saat mengerjakan kode, penting untuk dengan cepat membuka buffer * scratch * untuk menempelkan potongan dari file kode itu.

Jika saya mengerjakan skrip Perl, saya ingin dengan cepat membuka buffer * scratch * in cperl-mode. Akan lebih baik untuk segera melompat kembali ke buffer kode yang semula saya kerjakan.

Kaushal Modi
sumber

Jawaban:

26

Akan lebih mudah untuk mengikat fungsi di bawah ini menjadi kunci yang mengikat pilihan Anda. Jika Anda saat ini sedang mengerjakan FILEbuffer, memanggil fungsi di bawah ini akan beralih antara FILEbuffer khusus * scratch * mode-spesifik yang disebut *scratch-MAJOR-MODE*dan FILEbuffer.

Diberikan contoh dalam pertanyaan, jika saya bekerja pada skrip Perl disebut myperl.pl, memanggil fungsi ini akan beralih antara myperl.pldan *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)))
Kaushal Modi
sumber
Bagaimana saya bisa mengecualikan mode dired, mode term dan mode tidak dapat diedit lainnya untuk fungsi ini?
godblessfq
@ godblessfq Saya telah memperbaikinya baru-baru ini di konfigurasi saya . Untuk sekarang Anda bisa mendapatkan versi itu dari sana. Saya akan memperbarui jawaban ini ketika saya sampai di komputer.
Kaushal Modi
@godblessfq Saya telah memperbarui jawabannya. Cobalah dan lihat apakah itu cocok untuk Anda.
Kaushal Modi
bekerja seperti pesona!
godblessfq