Wie kann ich schnell zwischen einer Datei und einem * scratch * -Puffer mit demselben Hauptmodus wechseln?


24

Während der Arbeit an einem Code ist es manchmal nützlich, schnell einen * scratch * -Puffer zu öffnen, um ein Snippet aus dieser Codedatei einzufügen.

Wenn ich an einem Perl-Skript arbeite, möchte ich mit in schnell einen * scratch * -Puffer öffnen cperl-mode. Es wäre auch schön, schnell zu dem Codepuffer zurückzukehren, in dem ich ursprünglich gearbeitet habe.

Antworten:


26

Es ist praktisch, die folgende Funktion an eine Tastenbelegung Ihrer Wahl zu binden. Wenn Sie gerade an einem FILEPuffer arbeiten, können Sie durch Aufrufen der folgenden Funktion zwischen dem FILEaufgerufenen Hauptmodus-spezifischen * Scratch * -Puffer *scratch-MAJOR-MODE*und dem FILEPuffer wechseln .

Wenn ich im fraglichen Beispiel an einem aufgerufenen Perl-Skript arbeite myperl.pl, wird beim Aufrufen dieser Funktion zwischen myperl.plund umgeschaltet *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)))

Wie kann ich Dired-Modus, Term-Modus und anderen nicht bearbeitbaren Modus für diese Funktion ausschließen?
Godblessfq

@godblessfq Ich hatte dies erst kürzlich in meiner Konfiguration behoben . Für den Moment können Sie diese Version von dort bekommen. Ich werde diese Antwort aktualisieren, wenn ich an einen Computer komme.
Kaushal Modi

@godblessfq Ich habe die Antwort aktualisiert. Probieren Sie es aus und sehen Sie, ob es für Sie funktioniert.
Kaushal Modi

klappt wunderbar!
Godblessfq
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.