15 ответов:
привязки GNU Emacs по умолчанию:
C-xb
*scratch*RETили, более подробно
M-x
switch-to-buffer *scratch*RETThe
*scratch*буфер-это буфер, выбранный при запуске, и основной режим Lisp Interaction. Примечание: режим для*scratch*буфер управляется переменнойinitial-major-mode.в общем случае вы можете создать столько "царапин" буферов, как вы хотите, и назвать их, как вы выбираете.
C-xb
NAMERETпереключается на буфер
NAME, создавая его, если он не существует. Новый буфер не связан с файлом на диске, пока вы не используете C-xC-w (или M-xwrite-fileRET), чтобы выбрать файл, где он должен быть сохранен.M-x
text-modeRETизменяет основной режим текущего буфера на текстовый режим. Чтобы найти все доступные режимы (то есть, не требуя никаких новых пакетов), вы можете получить список, набрав:
M-x
apropos-command -mode$RET
Я добавляю следующее В моем .emacs:
;; 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)))Если я не хочу видеть царапины буфер я нажимаю C-x C-k , но он не убивает его, просто поместите в конец списка буферов, поэтому мне нужно это в следующий раз, когда мне не нужно создавать новый.
есть целая куча советов о эта страница EmacsWiki.
вот первая:
очень простая функция для воссоздания скретч-буфера:
(defun create-scratch-buffer nil "create a scratch buffer" (interactive) (switch-to-buffer (get-buffer-create "*scratch*")) (lisp-interaction-mode))
C-x b
*scratch*RET y RET с включенным режимом iswitchb.просто C-x b
*scratch*RET в противном случае.
Я нашел это много лет назад, когда я впервые начал использовать emacs; я понятия не имею, где сейчас, но у него всегда был дом в моем личном .Эль-файлов. Он появляется в поиске 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) ;;;----------------------------------------------------------------------
я использовал решение dwj, и я был очень доволен этим, пока не понял, что это не удалось, когда вы на самом деле переименовать буфер царапин (например, путем его сохранения).
затем я принял это, что хорошо работает для меня:
(run-with-idle-timer 1 t '(lambda () (get-buffer-create "*scratch*")))
Это то, что я использую - у меня это связано с удобным нажатием клавиши. Он отправляет вас в
*scratch*буфер, независимо от того, существует он или нет, и устанавливает его вlisp-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)))
у меня есть
scratchкак интерактивная команда для открытия нового скретч-буфера (мне нравится иметь несколько):(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
Я предпочитаю, чтобы мой буфер царапин был фактическим файлом, который автоматически сохраняется, и его повторное открытие так же просто, как открытие файла. При запуске я убиваю значение по умолчанию и нахожу свое собственное, как это.
(add-hook 'emacs-startup-hook (lambda () (kill-buffer "*scratch*") (find-file "/Users/HOME/Desktop/.scratch")))у меня есть пользовательская функция kill-buffer, которая делает по существу то же самое-открывает мой личный сохраненный файл царапины и убивает царапину по умолчанию если Я убил последний видимый буфер.
Я настроил несколько из
desktop.elфункции для загрузки после(kill-buffer "*scratch*")и(find-file "/Users/HOME/Desktop/.scratch")чтобы файл, последний видимый при выходе из Emacs, не был похоронен царапиной по умолчанию или похоронен моей пользовательской царапиной при запуске Emacs.и
auto-save-buffers-enhanced, который автоматически сохраняет все расширения файлов, которые специально не исключены:https://github.com/kentaro/auto-save-buffers-enhanced/blob/master/auto-save-buffers-enhanced.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"))Я использую небольшое изменение функция @paprika, когда я хочу создать буфер для посещения без файлов:
(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) ))
(global-set-key (kbd "C-x M-z") '(lambda () (interactive) (switch-to-buffer "*scratch*")))это не только быстро переключится на
*scratch*буфера(так как я делаю это часто), но воссоздать*scratch*буфера и включитьlisp-interaction-modeавтоматически, если вы убьете его случайно. Измените привязку, как вам нравится.
просто отметить пакет emacs
unkillable-scratchв MELPA будет делать это. Есть такжеscratch-persistэто автоматически сохранит и восстановит буфер между сеансами.
Я объединил решения, опубликованные до сих пор в одной функции:
(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))чтобы применить эту функцию в вашем .emacs использование:
(--scratch-buffer t) (run-with-idle-timer 3 t '--scratch-buffer)это сделает буфер царапин неразрушимым в первую очередь, и если он будет сохранен, он будет воссоздан. Кроме того, мы можем использовать функцию быстрого доступа
scratchчтобы быстро вызвать буфер:(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))))в прошлом было полезно знать исходный каталог запуска, из которого был Emacs начатый. Это либо значение
desktop-dirnameилиdefault-directoryлокальная переменная скретч-буфера:(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))так --startup-directory всегда будет возвращать базовый каталог вашего makefile, TODO-файла и т. д. В случае, если нет рабочего стола (--no-desktop командная строка-переключатель или нет рабочего стола-файл)
--scratch-directoryпеременная будет содержать каталог Emacs, который был когда-то запущен.
Как говорит docstring, эта функция будет:
переключиться на буфер нуля. Если буфер не существует, создайте его и запишите в него исходное сообщение."
это приведет к появлению нового буфера царапин, который выглядит как исходный буфер царапин.
(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)
найти ответ в 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 и затем введите
*scratch*↩ ︎чтобы создать новый буфер, который также находится в режиме взаимодействия lisp.
Comments