không bao giờ đóng


10

Nếu tôi đóng *scratch*bộ đệm thì đó luôn là một tai nạn.

Tôi có thể persistent-scratchdễ dàng như persistent-scratch-reloadvậy nhưng thật tuyệt nếu vết xước không thể bị giết. Làm thế nào tôi có thể làm điều đó?


1
Bạn có thực sự sử dụng các tính năng được cung cấp bởi chế độ của *scratch*? Nếu không - nếu bạn sử dụng nó chủ yếu cho mã Emacs-Lisp và bạn có thể dễ dàng sử dụng chế độ Emacs-Lisp, thì hãy cân nhắc việc không sử dụng *scratch*cho câu đố Lisp của bạn. Chỉ cần sử dụng C-x fvới một bộ đệm tập tin mà bạn có thể lưu hoặc ném tùy ý.
vẽ

Theo cách tương tự, bạn luôn có thể khôi phục lại vết xước bằng cách chỉ cần chuyển sang *scratch*dòngEEmacs sẽ tạo ra nó nếu nó không tồn tại trên mạng và vào Chế độ tương tác Lisp.
lunaryorn

@Drew yeah, tôi tiếp tục quay lại ý tưởng này trong nhiều năm qua, ví dụ a ~/.emacs.d/scratch.el. Nhưng nó không cảm thấy đúng, tôi không biết tại sao.
fommil

Hoặc chỉ tossa.el, tossb..., bất cứ nơi nào. Việc %m ^tossđánh dấu tất cả các tệp như vậy trong bộ đệm Dired là rất đơn giản, sau đó Dxóa tất cả chúng.
vẽ

Tôi đang scratch.elthử cách tiếp cận khác. Có lẽ nếu tôi có thể dọn sạch flycheck, nó sẽ là emacs.stackexchange.com/questions/19506
fommil

Câu trả lời:


15

Bạn có thể (ab-) sử dụng kill-buffer-query-functionscho mục đích này:

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

Trong cấu hình Emacs cũ của tôi, tôi đã sử dụng nó để bảo vệ một loạt các bộ đệm quan trọng như thế nào *Messages*.

Lưu ý rằng chức năng của tôi sử dụng bury-bufferđể đạt được hiệu quả là giết một bộ đệm mà thực hiện bộ đệm đi xa mà không thực sự giết bộ đệm. Emacs sẽ chuyển sang một bộ đệm khác giống như bạn đã giết được vết xước, nhưng vẫn giữ được vết xước và chỉ đặt nó ở cuối danh sách bộ đệm.

Hoặc đơn giản

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

Xin vui lòng tha thứ cho tôi về bất kỳ lỗi nào trong mã. Tôi đã sao chép câu trả lời này trên điện thoại di động.
âm lịch

mát mẻ! BTW, tại sao bạn sử dụng #? Tôi không nghĩ rằng điều đó là cần thiết nữa
17:51

3
@fommil Nó làm cho trình biên dịch byte cảnh báo nếu ký hiệu không được định nghĩa là một hàm. Nó không tạo ra bất kỳ sự khác biệt nào về mặt ngữ nghĩa ở đây (nhưng có thể khi sử dụng lambdas) nhưng dù sao bạn cũng nên sử dụng nó để hỗ trợ trình biên dịch byte.
lunaryorn

2
@fommil Ngoài ra, tôi nghĩ rằng đó là phong cách tốt để sử dụng trích dẫn hàm khi đề cập đến các hàm, nếu chỉ để hỗ trợ người đọc mã của bạn. Ở đây rõ ràng là chúng ta đề cập đến một chức năng, nhưng ở những nơi khác thì có thể không. Trong những tình huống này, trích dẫn chức năng có thể cung cấp một đầu mối quan trọng.
âm lịch

1
Và bên cạnh đó: (eq 'foo #' foo) giữ. Cả hai hình thức đánh giá theo cùng một đối tượng, cụ thể là biểu tượng foo.
lunaryorn

5

Một tính năng mới đã được giới thiệu cho vết xước liên tục được gọi là "ghi nhớ"

Từ 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.

Khéo léo! Cũng lưu ý rằng nó có một biến liên quan remember-notes-bury-on-kill( ttheo mặc định). Nó thực hiện những gì mà tên cho thấy - có vẻ khá phù hợp với câu hỏi ban đầu.
Harald Hanche-Olsen

Wow, cảm ơn, đó là một tính năng tốt, chắc chắn!
âm lịch

điều này không hiệu quả với tôi, bộ đệm luôn được gọi notes(mở khi khởi động) và nó không bị tấn công *scratch*(tôi đã thử và không thoát khỏi dấu sao)
fommil

@fommil Chỉ tò mò thôi. Tại sao bạn muốn vết xước phải bền bỉ. Tại sao không sử dụng ghi chú cho liên tục và đầu cho việc sử dụng không liên tục?
Talespin_Kit

2

ok, toàn bộ cuộc thảo luận này đã thôi thúc tôi quay trở lại một cách tiếp cận mà tôi đã cố gắng thiết lập nhưng @Drew đã khơi dậy mối quan tâm.

Tạo một tệp như thế này trong ~/.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

cảm ơn https://emacs.stackexchange.com/a/19507/5142 cho Local Variables.

Và sau đó thêm ~/.emacs.d/init.elcâu trả lời vào câu trả lời của @ 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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.