tidak pernah menutup awal

10

Jika saya pernah menutup *scratch*buffer itu selalu merupakan kecelakaan.

Saya sudah persistent-scratchmelakukannya semudah persistent-scratch-reloadtetapi akan lebih baik jika goresannya tidak bisa dibunuh. Bagaimana saya bisa melakukan itu?

fommil
sumber
1
Apakah Anda benar-benar memanfaatkan fitur yang disediakan oleh mode *scratch*? Jika tidak - jika Anda menggunakannya pada dasarnya untuk kode Emacs-Lisp dan Anda bisa dengan mudah menggunakan mode Emacs-Lisp, maka pertimbangkan untuk tidak menggunakannya *scratch*untuk memainkan Lisp Anda. Cukup gunakan C-x fdengan buffer file yang dapat Anda simpan atau lempar sesuka hati.
Drew
Dengan cara yang sama Anda selalu dapat mengembalikan goresan dengan hanya beralih ke *scratch*—Emacs akan membuatnya jika tidak ada — dan memasuki Mode Interaksi Lisp.
lunaryorn
@Drew ya, saya terus kembali ke ide ini selama bertahun-tahun, misalnya a ~/.emacs.d/scratch.el. Tapi rasanya tidak enak, aku tidak tahu kenapa.
Dari
Atau hanya tossa.el,, tossb..., di mana saja. Ini sepele yang harus dilakukan %m ^tossuntuk menandai semua file seperti itu dalam buffer Dired, lalu Dmenghapus semuanya.
Drew
Saya scratch.elmencoba pendekatan ini lagi. Mungkin jika saya dapat membersihkan flycheck, itu akan menjadi emacs.stackexchange.com/questions/19506 yang
fommil

Jawaban:

15

Anda dapat (ab-) menggunakan kill-buffer-query-functionsuntuk tujuan ini:

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

Dalam konfigurasi Emacs lama saya, saya menggunakan ini untuk melindungi sekelompok buffer penting seperti *Messages*.

Perhatikan bahwa fungsi saya gunakan bury-bufferuntuk mencapai efek membunuh buffer — melakukan buffer pergi — tanpa benar-benar membunuh buffer. Emacs akan beralih ke buffer yang berbeda sama seperti jika Anda telah membunuh goresan, tetapi buat goresan tetap hidup dan letakkan saja di akhir daftar buffer.

Atau sederhananya

(add-hook 'kill-buffer-query-functions
          (lambda() (not (equal (buffer-name) "*scratch*"))))
lunaryorn
sumber
Maafkan saya jika ada kesalahan dalam kode — saya salin-tempel jawaban ini bersama-sama di ponsel.
lunaryorn
keren! BTW, mengapa Anda menggunakan itu #? Saya tidak berpikir itu diperlukan lagi
fommil
3
@fommil Membuat kompiler byte memperingatkan jika simbol tidak didefinisikan sebagai fungsi. Ini tidak membuat perbedaan secara semantik di sini (tetapi bisa ketika menggunakan lambdas) tetapi Anda harus menggunakannya untuk mendukung kompiler byte.
lunaryorn
2
@fommil Juga, saya pikir itu gaya yang baik untuk menggunakan kutipan fungsi ketika merujuk ke fungsi, jika hanya untuk mendukung pembaca kode Anda. Di sini jelas bahwa kita merujuk ke suatu fungsi, tetapi di tempat lain mungkin tidak. Dalam situasi ini kutipan fungsi dapat memberikan petunjuk penting.
lunaryorn
1
Dan selain itu: (eq 'foo #' foo) berlaku. Kedua bentuk secara harfiah mengevaluasi ke objek yang sama, yaitu simbol foo.
lunaryorn
5

Fitur baru telah diperkenalkan untuk goresan persisten yang disebut "ingat"

Dari 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.
Talespin_Kit
sumber
Rapi! Perhatikan juga bahwa ia memiliki variabel terkait remember-notes-bury-on-kill(yang secara tdefault). Itu melakukan apa yang namanya - yang tampaknya cukup relevan untuk pertanyaan asli.
Harald Hanche-Olsen
Wow, terima kasih, itu fitur yang bagus, pasti!
lunaryorn
ini tidak berfungsi untuk saya, buffer selalu disebut notes(yang terbuka pada startup) dan itu tidak membajak *scratch*(saya mencoba dengan dan tanpa lolos ke asterix)
fommil
@fommil Hanya ingin tahu. Mengapa Anda ingin goresannya bertahan lama? Mengapa tidak menggunakan catatan untuk gigih dan gores untuk penggunaan tidak gigih?
Talespin_Kit
2

ok, seluruh diskusi ini telah mendorong saya untuk kembali ke pendekatan yang saya coba setup tetapi @Drew telah menyalakan kembali minat.

Buat file seperti ini di ~/.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

terima kasih kepada https://emacs.stackexchange.com/a/19507/5142 untuk Local Variables.

Dan kemudian tambahkan yang berikut ke ~/.emacs.d/init.elsesuai jawaban 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))
fommil
sumber