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 ?
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:
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
.emacs
xá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.
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.
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))
Cx b *scratch*
RET y RET với chế độ iswitchb được bật.
Chỉ cần Cx b *scratch*
RET nếu không.
initial-major-mode
biến (lisp tương tác chế độ mặc định).
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)
;;;----------------------------------------------------------------------
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*")))
Tôi có scratch
mộ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
bufname
RET)?
ido-mode
và 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 b
sẽ 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.
(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-mode
tự độ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.
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)
Đâ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)))
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.el
chức năng để tải sau (kill-buffer "*scratch*")
và (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) ))
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-dirname
hoặc default-directory
biế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-directory
biến sẽ giữ thư mục Emacs đã từng bắt đầu dưới
tìm câu trả lời trong 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))
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.