Comment basculer rapidement entre un fichier et un tampon * scratch * ayant le même mode majeur?


24

Parfois, lorsque vous travaillez sur un code, il est utile d'ouvrir rapidement un tampon * scratch * pour coller un extrait de ce fichier de code.

Si je travaille sur un script Perl, je voudrais ouvrir rapidement un tampon * scratch * avec in cperl-mode. Il serait également intéressant de revenir rapidement au tampon de code dans lequel je travaillais à l'origine.

Réponses:


26

Il sera commode de lier la fonction ci-dessous à une liaison de touches de votre choix. Si vous travaillez actuellement sur un FILEtampon, appeler la fonction ci-dessous basculera entre FILEle tampon * scratch * spécifique au mode principal appelé *scratch-MAJOR-MODE*et le FILEtampon.

Étant donné l'exemple en question, si je travaille sur un script Perl appelé myperl.pl, appeler cette fonction basculera entre myperl.plet *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)))

Comment pourrais-je exclure le mode Dired, le mode Term et tout autre mode non modifiable pour cette fonction?
godblessfq

@godblessfq Je l'avais résolu récemment dans ma configuration . Pour l'instant, vous pouvez obtenir cette version à partir de là. Je mettrai à jour cette réponse lorsque j'arriverai à un ordinateur.
Kaushal Modi

@godblessfq J'ai mis à jour la réponse. Essayez-le et voyez si cela fonctionne pour vous.
Kaushal Modi

fonctionne comme un charme!
godblessfq
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.