Mở lại * đệm * đệm trong Emacs?


168

Nếu tôi vô tình đóng bộ đệm đầu trong Emacs, làm cách nào để tạo bộ đệm đầu mới ?

Câu trả lời:


199

Các ràng buộc mặc định của GNU Emacs:

C-xb *scratch* RET

hoặc, dài dòng hơn

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

Bộ *scratch*đệm là bộ đệm được chọn khi khởi động và có chế độ Tương tác Lisp chính . Lưu ý: chế độ cho *scratch*bộ đệm được điều khiển bởi biến initial-major-mode.

Nói chung, bạn có thể tạo nhiều bộ đệm "cào" như bạn muốn và đặt tên cho chúng theo cách bạn chọn.

C-xb NAME RET

chuyển sang bộ đệm NAME, tạo nó nếu nó không tồn tại. Một bộ đệm mới không được liên kết với một tệp trên đĩa cho đến khi bạn sử dụng C-xC-w(hoặc M-x write-file RET) để chọn một tệp mà nó sẽ được lưu.

M-x text-mode RET

thay đổi chế độ chính của bộ đệm hiện tại thành chế độ Văn bản. Để tìm tất cả các chế độ có sẵn (nghĩa là không yêu cầu bất kỳ gói mới nào), bạn có thể nhận danh sách bằng cách nhập:

M-x apropos-command -mode$ RET


8
Lưu ý rằng có một điều đặc biệt về vết xước , ít nhất là trong GNU Emacs 21 trở lên: chuyển sang bộ đệm đầu mới sẽ đưa nó trở lại chế độ Tương tác Lisp.
Peter S. Housel

Cũng giống như làm theo nhanh chóng, nếu bạn .emacsxác định chế độ cào mặc định khác , thì chế độ này sẽ là chế độ cho vết xước mới - không phải là chế độ Tương tác danh sách.
ocodo

23

Tôi thêm sau đây trong .emacs của tôi:

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

Nếu tôi không muốn xem bộ đệm đầu, tôi nhấn Cx Ck, nhưng nó không giết được nó, chỉ cần đặt vào cuối danh sách bộ đệm, vì vậy tôi cần nó vào lần tới khi tôi không phải tạo cái mới.


Khi tôi thử lời khuyên này từ "ibuffer", lời khuyên đó bị bỏ qua. Nhưng tốt nhất tôi có thể nói, "ibuffer" đang sử dụng "kill-buffer". Bạn có thể giúp tôi được không?
A.Ellett

Vâng, nhấn "đệm gần" trong giao diện đồ họa đầu sẽ bị xóa. Điều này chỉ hoạt động cho Cx k,
Maurizio Loreti

15

Có rất nhiều lời khuyên trên trang EmacsWiki này .

Đây là cái đầu tiên:

Một chức năng rất đơn giản để tạo lại bộ đệm đầu:

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

9

Cx b *scratch*RET y RET với chế độ iswitchb được bật.

Chỉ cần Cx b *scratch*RET nếu không.


Với các ràng buộc mặc định, 'y RET' là không cần thiết và chỉ cần chèn một 'y' và một dòng mới vào bộ đệm đầu mới được tạo .
Trey Jackson

Ooops, có lẽ đó là từ chế độ iswitchb. Xin lỗi vì điều đó. Trong một chủ đề khác, hãy thử chế độ iswitchb;)
Steven Huwig

Ngoài ra, không nên có gì đặc biệt về vết xước tên . Người ta có thể sử dụng Cx b để tạo bất kỳ số lượng bộ đệm "cào" nào, với các tên tùy ý.
Chris Conway

1
một cái gì đó đặc biệt về tên * cào * (như đã nêu trong các câu trả lời được chấp nhận) - nếu bạn tạo một bộ đệm gọi là * cào * chế độ chính sẽ được thiết lập theo initial-major-modebiến (lisp tương tác chế độ mặc định).
phils

4

Tôi tìm thấy những năm trước đây khi tôi lần đầu tiên bắt đầu sử dụng emacs; Tôi không biết bây giờ ở đâu nhưng nó luôn có một ngôi nhà trong các tệp .el cá nhân của tôi. Nó hiện lên trong các tìm kiếm google.

;;; 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

Tôi đã từng sử dụng giải pháp của dwj và tôi khá hài lòng về nó, cho đến ngày tôi nhận ra rằng nó đã thất bại khi bạn thực sự đổi tên bộ đệm đầu (ví dụ bằng cách lưu nó).

Sau đó, tôi đã áp dụng điều này, hoạt động tốt cho tôi:

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

3

Tôi có scratchmột lệnh tương tác để mở bộ đệm đầu mới (tôi muốn có một số bộ đệm):

(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

được thông qua từ: http://everything2.com/index.pl?node_id=1038451


Làm thế nào là tốt hơn so với chỉ đơn giản là chuyển sang một bộ đệm mới (Cx b bufnameRET)?
bignose

@bignose: Tôi sử dụng ido-modevà thường có khá nhiều bộ đệm mở. Tạo một bộ đệm mới bằng cách sử dụng C-x bsẽ thực sự tẻ nhạt. Tôi sẽ phải đưa ra một cái tên duy nhất không phù hợp với bất kỳ bộ đệm hiện tại nào.
paprika

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

Điều này sẽ không chỉ nhanh chóng chuyển sang *scratch*bộ đệm (vì tôi thường xuyên làm điều này), mà còn tạo lại *scratch*bộ đệm và lisp-interaction-modetự động bật nếu bạn vô tình giết nó. Thay đổi các ràng buộc như bạn muốn.


3

Chỉ cần lưu ý gói emacs unkillable-scratchtrong MELPA sẽ làm điều này. Ngoài ra còn scratch-persistcó sẽ tự động lưu và khôi phục bộ đệm giữa các phiên.


2

Giống như docopes nói, chức năng này sẽ:

Chuyển sang bộ đệm đầu. Nếu bộ đệm không tồn tại, hãy tạo nó và viết thông điệp ban đầu vào nó. "

Điều này sẽ mang lại một bộ đệm cào mới lên trông giống như bộ đệm đầu tiên.

(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

Đây là những gì tôi sử dụng - Tôi có ràng buộc với một tổ hợp phím thuận tiện. Nó gửi bạn đến *scratch*bộ đệm, bất kể nó có tồn tại hay không và đặt nó ở tronglisp-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

Tôi thích để bộ đệm đầu của tôi là một tệp thực sự được lưu tự động và mở lại nó cũng đơn giản như mở một tệp. Khi khởi động, tôi giết mặc định và tìm cái riêng của mình như thế này.

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

Tôi có một chức năng kill-đệm tùy chỉnh về cơ bản giống như vậy - mở lại tệp đã lưu cá nhân của tôi và giết vết xước mặc định nếu tôi giết bộ đệm hiển thị cuối cùng.

Tôi đã tùy chỉnh một số desktop.elchức năng để tải sau (kill-buffer "*scratch*")(find-file "/Users/HOME/Desktop/.scratch")để tệp hiển thị lần cuối khi thoát Emacs không bị chôn vùi bởi vết xước mặc định hoặc bị chôn vùi bởi vết xước tùy chỉnh của tôi khi khởi chạy Emacs.

Tôi thích sử dụng auto-save-buffers-enhanced, tự động lưu bất kỳ tiện ích mở rộng tệp nào không được loại trừ cụ thể:

https://github.com/kentaro/auto-save-buffers-enhified/blob/master/auto-save-buffers-enhified.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"))

Tôi sử dụng một biến thể nhỏ của hàm bởi @paprika khi tôi muốn tạo bộ đệm truy cập không có tệp:

(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

Tôi đã kết hợp các giải pháp được đăng cho đến nay vào một chức năng:

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

Để áp dụng chức năng này trong .emacs của bạn, hãy sử dụng:

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

Điều này sẽ làm cho bộ đệm đầu không thể phá hủy ở vị trí đầu tiên, và nếu được lưu, nó sẽ được tạo lại. Ngoài ra, chúng ta có thể sử dụng chức năng phím tắt scratchđể nhanh chóng đưa bộ đệm vào:

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

Trước đây, việc chứng minh thư mục khởi động ban đầu mà Emacs đã được bắt đầu là rất hữu ích. Đây là giá trị của desktop-dirnamehoặc default-directorybiến cục bộ của bộ đệm đầu:

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

Vì vậy - thư mục khởi động sẽ luôn trả về thư mục cơ sở của tệp Makefile, tệp TODO của bạn, v.v. Trong trường hợp không có máy tính để bàn ( --no-desktop lệnh-switch hoặc không có tệp máy tính để bàn), --scratch-directorybiến sẽ giữ thư mục Emacs đã từng bắt đầu dưới



0

Để thêm vào câu trả lời được chấp nhận, nếu bạn bật chế độ ILO (và nó sẽ tự động hoàn tất sau C-x bđó, do đó không cho phép bạn viết *scratch*), sau đó thử:

C-xb C-b*scratch* RET

C-x b C-b *scratch* RET


-3

C-xb và sau đó gõ *scratch* ↩︎

để tạo một bộ đệm mới trong chế độ tương tác không thể thiếu.

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.