Re-open *scratch* buffer in Emacs?

后端 未结 16 1289
北海茫月
北海茫月 2020-12-12 10:29

If I accidentally closed the scratch buffer in Emacs, how do I create a new scratch buffer?

相关标签:
16条回答
  • 2020-12-12 11:06

    This is what I use - I have this bound to a convenient keystroke. It sends you to the *scratch* buffer, regardless of whether or not it already exists, and sets it to be in lisp-interaction-mode

    (defun eme-goto-scratch () 
      "this sends you to the scratch buffer"
      (interactive)
      (let ((eme-scratch-buffer (get-buffer-create "*scratch*")))
        (switch-to-buffer eme-scratch-buffer)
        (lisp-interaction-mode)))
    
    0 讨论(0)
  • 2020-12-12 11:08

    I add following in my .emacs:

    ;; bury *scratch* buffer instead of kill it
    (defadvice kill-buffer (around kill-buffer-around-advice activate)
      (let ((buffer-to-kill (ad-get-arg 0)))
        (if (equal buffer-to-kill "*scratch*")
            (bury-buffer)
          ad-do-it)))
    

    If I don't want to see scratch buffer I press C-x C-k , but it doesn't kill it, just place in the end of buffer list, so then I need it next time I don't have to create new one.

    0 讨论(0)
  • 2020-12-12 11:10

    I have combined the solutions posted so far into one function:

    (defun --scratch-buffer(&optional reset)
      "Get the *scratch* buffer object.
    Make new scratch buffer unless it exists. 
    If RESET is non-nil arrange it that it can't be killed."
      (let ((R (get-buffer "*scratch*")))
        (unless R
          (message "Creating new *scratch* buffer")
          (setq R (get-buffer-create "*scratch*") reset t))
            (when reset
              (save-excursion
                (set-buffer R)
                (lisp-interaction-mode)
                (make-local-variable 'kill-buffer-query-functions)
                (add-hook 'kill-buffer-query-functions '(lambda()(bury-buffer) nil)
              )))
        R))
    

    To apply this function in your .emacs use:

    (--scratch-buffer t)
    (run-with-idle-timer 3 t '--scratch-buffer)
    

    This will make the scratch buffer indestructible in the first place, and if saved it will be recreated. Additionally we can use a shortcut function scratch to bring up the buffer quickly:

    (defun scratch()
      "Switch to *scratch*.  With prefix-arg delete its contents."
      (interactive)
      (switch-to-buffer (--scratch-buffer))
      (if current-prefix-arg
          (delete-region (point-min) (point-max))
        (goto-char (point-max))))
    

    In the past it has proven useful to know the original startup-directory from which Emacs was started. This is either the value of desktop-dirname or the default-directory local variable of the scratch-buffer:

    (defvar --scratch-directory
      (save-excursion (set-buffer "*scratch*") default-directory)
      "The `default-directory' local variable of the *scratch* buffer.")
    
    (defconst --no-desktop (member "--no-desktop" command-line-args)
      "True when no desktop file is loaded (--no-desktop command-line switch set).")
    
    (defun --startup-directory ()
      "Return directory from which Emacs was started: `desktop-dirname' or the `--scratch-directory'.
    Note also `default-minibuffer-frame'."
      (if (and (not --no-desktop) desktop-dirname) 
          desktop-dirname
        --scratch-directory))
    

    So --startup-directory will always return the base directory of your makefile, TODO-file etc. In case there is no desktop (--no-desktop commandline-switch or no desktop-file) the --scratch-directory variable will hold directory Emacs was once started under.

    0 讨论(0)
  • 2020-12-12 11:14

    find answer in EmacsWiki: http://www.emacswiki.org/emacs/RecreateScratchBuffer

    (defun create-scratch-buffer nil
       "create a scratch buffer"
       (interactive)
       (switch-to-buffer (get-buffer-create "*scratch*"))
       (lisp-interaction-mode))
    
    0 讨论(0)
  • 2020-12-12 11:14

    C-xb and then type *scratch* ↩︎

    to create a new buffer which is in lisp interaction mode also.

    0 讨论(0)
  • 2020-12-12 11:15

    I prefer to have my scratch buffer be an actual file that is automatically saved, and reopening it is as simple as opening a file. On startup, I kill the default and find my own like this.

    (add-hook 'emacs-startup-hook
      (lambda ()
        (kill-buffer "*scratch*")
        (find-file "/Users/HOME/Desktop/.scratch")))
    

    I have a custom kill-buffer function that does essentially the same thing -- reopens my personal scratch saved file and kills the default scratch if I killed the last visible buffer.

    I customized a few of the desktop.el functions to load after (kill-buffer "*scratch*") and (find-file "/Users/HOME/Desktop/.scratch") so that the file last visible on exiting Emacs doesn't get buried by the default scratch or buried by my custom scratch when launching Emacs.

    I enjoy using auto-save-buffers-enhanced, which automatically saves any file extension that is not specifically excluded:

    https://github.com/kentaro/auto-save-buffers-enhanced/blob/master/auto-save-buffers-enhanced.el

    (require 'auto-save-buffers-enhanced)
    (auto-save-buffers-enhanced t)
    (setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p 1)
    (setq auto-save-buffers-enhanced-exclude-regexps '("\\.txt" "\\.el" "\\.tex"))
    

    I use a slight variation of the function by @paprika when I want to create a no-file visiting buffer:

    (defun lawlist-new-buffer ()
      "Create a new buffer -- \*lawlist\*"
    (interactive)
      (let* (
        (n 0)
        bufname)
      (catch 'done
        (while t
          (setq bufname (concat "*lawlist"
            (if (= n 0) "" (int-to-string n))
              "*"))
          (setq n (1+ n))
          (if (not (get-buffer bufname))
            (throw 'done nil)) ))
      (switch-to-buffer (get-buffer-create bufname))
      (text-mode) ))
    
    0 讨论(0)
提交回复
热议问题