Emacsで* scratch *バッファーを再度開きますか?


168

Emacsでスクラッチバッファーを誤って閉じてしまった場合、新しいスクラッチバッファーを作成するにはどうすればよいですか?

回答:


199

GNU Emacsのデフォルトのバインディング:

C-xb *scratch* RET

または、より詳細に

M-x switch-to-buffer *scratch* RET

*scratch*バッファは、起動時に選択されたバッファであり、主要なモードがあるLispの相互作用を。注:*scratch*バッファのモードは変数によって制御されますinitial-major-mode

一般に、「スクラッチ」バッファーはいくつでも作成でき、好きな名前を付けることができます。

C-xb NAME RET

バッファNAMEに切り替え、存在しない場合は作成します。C-xC-w(またはM-x write-file RET)を使用して保存先のファイルを選択するまで、新しいバッファはディスク上のファイルに関連付けられません。

M-x text-mode RET

現在のバッファのメジャーモードをテキストモードに変更します。利用可能なすべてのモードを検索するには(つまり、新しいパッケージを必要とせずに)、次のように入力してリストを取得できます。

M-x apropos-command -mode$ RET


8
少なくともGNU Emacs 21以降では、スクラッチに関して特別なことがあることに注意してください。新しいスクラッチバッファーに切り替えると、Lisp相互作用モードに戻ります。
Peter S. Housel、2008年

これに対する簡単なフォローアップと同じように、.emacs別のデフォルトのスクラッチモードを定義した場合、これが新しいスクラッチのモードになります-リストインタラクションモードではありません。
ocodo

23

私は私の.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)))

スクラッチバッファーを表示したくない場合は、Cx Ckを押しますが、強制終了されません。バッファーリストの最後に配置するだけで、次に新しいバッファーを作成する必要がないときに必要になります。


「ibuffer」からこのアドバイスを試すと、アドバイスは無視されます。しかし、私がわかるように、「ibuffer」は「kill-buffer」を使用しています。手伝って頂けますか?
A.Ellett、2014

まあ、グラフィカルインターフェイスのスクラッチで「バッファーを閉じる」を押すと削除されます。これはCx kでのみ機能します
Maurizio Loreti '10

15

このEmacsWikiページにはたくさんのヒントがあります

これが最初のものです:

スクラッチバッファーを再作成するための非常に単純な関数:

(defun create-scratch-buffer nil
   "create a scratch buffer"
   (interactive)
   (switch-to-buffer (get-buffer-create "*scratch*"))
   (lisp-interaction-mode))             

9

*scratch*iswitchb-modeを有効にしたCx b RET y RET

*scratch*それ以外の場合はCx b RET だけです。


デフォルトのバインディングでは、「y RET」は不要で、新しく作成されたスクラッチバッファーに「y」と改行を挿入するだけです。
トレイジャクソン

おっと、多分それはiswitchb-modeからのものです。申し訳ありません。別のトピックについては、iswitchb-modeを試してみてください;)
Steven Huwig

また、名前のスクラッチについて特別なことは何もありません。Cx bを使用して、任意の名前で「スクラッチ」バッファーをいくつでも作成できます。
Chris Conway、

1
そこの名前について何かの特別*(受け入れ答えで述べたように)スクラッチ* -あなたがバッファを作成した場合、主要なモードがに応じて設定されます* *スクラッチと呼ばれるinitial-major-mode(デフォルトではlispの対話モード)変数。
phils

4

私が初めてemacsを使い始めたとき、私はこの数年前に見つけました。私は今どこにいるかはわかりませんが、個人の.elファイルには常にホームがあります。それはグーグル検索でポップアップします。

;;; Prevent killing the *scratch* buffer -- source forgotten
;;;----------------------------------------------------------------------
;;; Make the *scratch* buffer behave like "The thing your aunt gave you,
;;; which you don't know what is."
(save-excursion
  (set-buffer (get-buffer-create "*scratch*"))
  (make-local-variable 'kill-buffer-query-functions)
  (add-hook 'kill-buffer-query-functions 'kill-scratch-buffer))

(defun kill-scratch-buffer ()
  ;; The next line is just in case someone calls this manually
  (set-buffer (get-buffer-create "*scratch*"))

  ;; Kill the current (*scratch*) buffer
  (remove-hook 'kill-buffer-query-functions 'kill-scratch-buffer)
  (kill-buffer (current-buffer))

  ;; Make a brand new *scratch* buffer
  (set-buffer (get-buffer-create "*scratch*"))
  (lisp-interaction-mode)
  (make-local-variable 'kill-buffer-query-functions)
  (add-hook 'kill-buffer-query-functions 'kill-scratch-buffer)

  ;; Since we killed it, don't let caller do that.
  nil)
;;;----------------------------------------------------------------------

3

私は以前dwjのソリューションを使用していましたが、実際にスクラッチバッファーの名前を変更して(たとえば、保存することによって)失敗することに気づくまで、それについては非常に満足していました。

それから私はこれを採用しました、それは私にとってうまくいきます:

  (run-with-idle-timer 1 t
    '(lambda () (get-buffer-create "*scratch*")))

3

私はscratch新しいスクラッチバッファーを開くための対話型コマンドとして持っています(いくつか持っているのが好きです)。

(defun scratch ()
  "create a new scratch buffer to work in. (could be *scratch* - *scratchX*)"
  (interactive)
  (let ((n 0)
        bufname)
    (while (progn
             (setq bufname (concat "*scratch"
                                   (if (= n 0) "" (int-to-string n))
                                   "*"))
             (setq n (1+ n))
             (get-buffer bufname)))
  (switch-to-buffer (get-buffer-create bufname))
  (if (= n 1) initial-major-mode))) ; 1, because n was incremented

採用元:http : //everything2.com/index.pl?node_id=1038451


これは、単に新しいバッファー(Cx b bufnameRET)に切り替えるよりも優れていますか?
bignose、2015年

@bignose:私は使用してido-modeおり、通常はかなりの数のバッファを開いています。を使用して新しいバッファを作成するのC-x bは、とても面倒です。現在存在するどのバッファとも一致しない一意の名前を考え出す必要があります。
パプリカ2015年

3
(global-set-key (kbd "C-x M-z")
                '(lambda ()
                   (interactive)
                   (switch-to-buffer "*scratch*")))

これはすぐに*scratch*バッファに切り替わるだけでなく(頻繁に行うため)、*scratch*バッファを再作成して、lisp-interaction-mode誤って強制終了した場合に自動的に有効にします。バインディングを好きなように変更します。


3

unkillable-scratchMELPAのemacsパッケージがこれを行うことに注意してください。またscratch-persist、セッション間でバッファを自動的に保存および復元します。


2

docstringが言うように、この関数は:

スクラッチバッファーに切り替えます。バッファが存在しない場合は作成し、最初のメッセージをそこに書き込みます。」

これにより、最初のスクラッチバッファーのように見える新しいスクラッチバッファーが表示されます。

(defun switch-buffer-scratch ()
  "Switch to the scratch buffer. If the buffer doesn't exist,
create it and write the initial message into it."
  (interactive)
  (let* ((scratch-buffer-name "*scratch*")
         (scratch-buffer (get-buffer scratch-buffer-name)))
    (unless scratch-buffer
      (setq scratch-buffer (get-buffer-create scratch-buffer-name))
      (with-current-buffer scratch-buffer
        (lisp-interaction-mode)
        (insert initial-scratch-message)))
    (switch-to-buffer scratch-buffer)))

(global-set-key "\C-cbs" 'switch-buffer-scratch)

2

これは私が使用するものです-これは便利なキーストロークにバインドされています。それが*scratch*すでに存在するかどうかに関係なく、バッファにあなたを送り、それを中に設定します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)))

2

スクラッチバッファーを、自動的に保存される実際のファイルにすることをお勧めします。ファイルを開くのと同じくらい簡単に再オープンできます。起動時に、デフォルトを強制終了し、このように自分のものを見つけます。

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

基本的に同じことをするカスタムのkill-buffer関数があります-個人用のスクラッチ保存ファイルを再度開き、最後に表示されているバッファーをkillした場合、デフォルトのスクラッチをkillします。

私はいくつかのカスタマイズされたdesktop.el負荷に機能を後に (kill-buffer "*scratch*")し、(find-file "/Users/HOME/Desktop/.scratch")そのファイルをその目に見える最後のEmacsを終了するにはEmacsを起動すると、デフォルトの傷に埋もれたり、私のカスタムのスクラッチで埋もれていません。

auto-save-buffers-enhancedは、特に除外されていないファイル拡張子を自動的に保存するを使用して楽しんでいます。

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"))

ファイルを訪問しないバッファを作成したいときは、@ paprikaによる関数のわずかなバリエーションを使用します。

(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) ))

1

これまでに投稿したソリューションを1つの機能にまとめました。

(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))

この関数を.emacsに適用するには、以下を使用します。

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

これにより、スクラッチバッファーが最初から破壊されなくなり、保存された場合は再作成されます。さらに、ショートカット機能scratchを使用してバッファをすばやく表示できます。

(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))))

過去には、Emacsが起動された元の起動ディレクトリを知ることが有用であることが証明されています。これは、スクラッチバッファの値desktop-dirnameまたはdefault-directoryローカル変数です。

(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))

したがって、-startup-directoryは常にメイクファイル、TODOファイルなどのベースディレクトリを返します。デスクトップがない場合(--no-desktop commandline-switchまたはデスクトップファイルがない場合)、--scratch-directory変数はディレクトリを保持します。下から始めた。


0

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

受け入れられた回答に追加するには、ILOモードがオンになっている(そして後C-x bにオートコンプリートが行われるため*scratch*、書き込みができない)場合は、次のことを試してください。

C-xb C-b*scratch* RET

C-x b C-b *scratch* RET


-3

C-xb 次に入力します *scratch* ↩︎

lispインタラクションモードでもある新しいバッファを作成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.