スクラッチを閉じないでください


10

*scratch*バッファを閉じると、それは常に偶然です。

私はpersistent-scratchそう簡単persistent-scratch-reloadですが、スクラッチを殺すことができなかったらいいでしょう。どうやってやるの?


1
のモードで提供される機能を実際に利用しています*scratch*か?そうでない場合-本質的にEmacs-Lispコードに使用し、Emacs-Lispモードを簡単に使用できる場合*scratch*は、Lisp を使用しないことを検討してください。C-x f保存したり、自由にトスしたりできるファイルバッファを使用するだけです。
Drew

同様に、「*scratch*Emacsが存在しない場合は作成する」に切り替え、Lisp Interaction Modeに入るだけで、いつでもスクラッチを復元できます。
lunaryorn

@Drewええ、私は何年にもわたってこの考えに戻ってきます~/.emacs.d/scratch.el。しかし、それは正しく感じられません。理由はわかりません。
fommil

それともtossa.eltossb、...、どこでも。その%m ^tossようなすべてのファイルをDiredバッファでマークし、Dそれらをすべて削除するのは簡単です。
2016年

私はそのscratch.elアプローチをもう一度試みています。多分私がflycheckをクリーンアップできればそれは素晴らしいでしょうemacs.stackexchange.com/questions/19506
fommil

回答:


15

kill-buffer-query-functionsこの目的で(ab-)使用できます。

(add-hook 'kill-buffer-query-functions #'my/dont-kill-scratch)
(defun my/dont-kill-scratch ()
  (if (not (equal (buffer-name) "*scratch*"))
      t
    (message "Not allowed to kill %s, burying instead" (buffer-name))
    (bury-buffer)
    nil))

私の古いEmacs構成では、これを使用して、などの重要なバッファの束を保護しました*Messages*

私の関数はbury-buffer、実際にバッファーを殺すことなく、バッファーを殺す(バッファーを削除する)効果を達成するために使用していることに注意してください。Emacsは、まるでスクラッチを殺したかのように別のバッファーに切り替えますが、スクラッチを存続させ、バッファーリストの最後に配置します。

または、単に

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))

コードの間違いを許してください。私はこの回答をモバイルにコピーアンドペーストしました。
lunaryorn

涼しい!ところで、なぜあなたは#?これはもう必要ないと思います
fommil

3
@fommilシンボルが関数として定義されていない場合、バイトコンパイラに警告を出します。ここでは意味的に違いはありませんが(ラムダを使用する場合は可能です)、それでもバイトコンパイラをサポートするために使用する必要があります。
lunaryorn

2
@fommilまた、コードリーダーをサポートする場合にのみ、関数を参照するときに関数の引用符を使用することをお勧めします。ここで関数を参照していることは明らかですが、他の場所ではそうではない場合があります。これらの状況では、関数の引用が重要な手がかりを提供します。
lunaryorn

1
また、(eq 'foo#' foo)が成り立つ。どちらの形式も、文字通り同じオブジェクト、つまりシンボルfooに評価されます。
lunaryorn 2016年

5

「記憶」と呼ばれる永続的なスクラッチのための新機能が導入されました

https://www.masteringemacs.org/article/whats-new-in-emacs-24-4から

The new command ``remember-notes`` creates a buffer which is saved

on ``kill-emacs``.

You may think of it as a \*scratch\* buffer whose content is preserved.

In fact, it was designed as a replacement for \*scratch\* buffer and can

be used that way by setting ``initial-buffer-choice`` to

``remember-notes`` and ``remember-notes-buffer-name`` to “\*scratch\*”.

Without the second change, \*scratch\* buffer will still be there for

notes that do not need to be preserved.

きちんと!また、関連付けられた変数remember-notes-bury-on-killtデフォルト)があることにも注意してください。それは名前が示唆することを行います–これは元の質問にかなり関連しているようです。
Harald Hanche-Olsen

うわー、ありがとう、それは確かに素晴らしい機能です!
lunaryorn

これは私にとっては機能しません、バッファは常に呼び出されnotes(起動時に開きます)、ハイジャックしません*scratch*(アスタリスクへのエスケープありとなしで試しました)
fommil

@fommil気になるだけ。スクラッチを持続させる必要があるのはなぜですか。永続的使用にはノートを使用し、非永続的使用にはスクラッチを使用しないのはなぜですか?
Talespin_Kit

2

わかりました、この全体の議論は私がセットアップしようとしたアプローチに戻るように私を促しましたが、@ Drewは興味を再燃させました。

このようなファイルを作成します ~/.emacs.d/scratch.el

;;; scratch.el --- Emacs Lisp Scratch -*- lexical-binding: t -*-


;; Local Variables:
;; flycheck-disabled-checkers: (emacs-lisp-checkdoc)
;; byte-compile-warnings: (not free-vars unresolved)
;; End:
;;; scratch.el ends here

https://emacs.stackexchange.com/a/19507/5142に感謝しますLocal Variables

そして、~/.emacs.d/init.el@ lunaryornの答えに従って以下を追加します:

;; *scratch* is immortal
(add-hook 'kill-buffer-query-functions
          (lambda () (not (member (buffer-name) '("*scratch*" "scratch.el")))))

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