Если я случайно закрыл пустой буфер в Emacs, как мне создать новый чистый буфер?
Если я случайно закрыл пустой буфер в Emacs, как мне создать новый чистый буфер?
Ответы:
Привязки по умолчанию для GNU Emacs:
C-xb
*scratch*
RET
или, более многословно
M-x
switch-to-buffer *scratch*
RET
*scratch*
Буфер представляет собой буфер , выбранный при запуске, и имеет основной режим лисповского взаимодействия . Примечание: режим для *scratch*
буфера управляется переменной initial-major-mode
.
В общем, вы можете создать столько «чистых» буферов, сколько захотите, и называть их по своему выбору.
C-xb
NAME
RET
переключается на буфер NAME
, создавая его, если он не существует. Новый буфер не связан с файлом на диске, пока вы не используете C-xC-w(или M-x write-file
RET), чтобы выбрать файл, в котором он должен быть сохранен.
M-x
text-mode
RET
изменяет основной режим текущего буфера на текстовый режим. Чтобы найти все доступные режимы (то есть, не требуя каких-либо новых пакетов), вы можете получить список, набрав:
M-x
apropos-command -mode$
RET
.emacs
определяете другой режим очистки по умолчанию , этот режим будет режимом нового ввода, а не режимом List List Interaction.
Я добавляю следующее в мой .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)))
Если я не хочу видеть пустой буфер, я нажимаю Cx Ck, но он не уничтожает его, просто помещает в конец списка буферов, поэтому он мне понадобится в следующий раз, когда мне не нужно создавать новый.
На этой странице EmacsWiki есть множество полезных советов .
Вот первый:
Очень простая функция для воссоздания чистого буфера:
(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 с включенным режимом iswitchb.
Просто Cx b *scratch*
RET в противном случае.
initial-major-mode
переменной (lisp-взаимодействия-mode по умолчанию).
Я обнаружил это несколько лет назад, когда впервые начал использовать emacs; Я понятия не имею, где сейчас, но у меня всегда был дом в моих личных файлах .el. Это появляется в поиске 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
есть интерактивная команда для открытия нового рабочего буфера (мне нравится иметь несколько):
(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
bufname
RET)?
ido-mode
и обычно открываю довольно много буферов. Создание нового буфера с использованием C-x b
было бы очень утомительно. Я должен был бы придумать уникальное имя, которое не соответствует ни одному из существующих в настоящее время буферов.
(global-set-key (kbd "C-x M-z")
'(lambda ()
(interactive)
(switch-to-buffer "*scratch*")))
Это не только быстро переключится в *scratch*
буфер (так как я часто это делаю), но и заново создаст *scratch*
буфер и включит его lisp-interaction-mode
автоматически, если вы случайно его уничтожите. Измените привязку, как вам нравится.
Как говорит строка документации, эта функция будет:
Переключитесь на рабочий буфер. Если буфер не существует, создайте его и запишите в него исходное сообщение. "
Это приведет к созданию нового буфера очистки, который выглядит как начальный буфер очистки.
(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)
Это то, что я использую - это связано с удобным нажатием клавиши. Он отправляет вас в *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)))
Я предпочитаю, чтобы мой рабочий буфер был реальным файлом, который автоматически сохраняется, и открыть его так же просто, как открыть файл. При запуске я убиваю настройки по умолчанию и нахожу свои вот так.
(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) ))
Я объединил опубликованные решения в одну функцию:
(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 всегда будет возвращать базовый каталог вашего make-файла, TODO-файла и т. Д. В случае, если нет рабочего стола ( --no-desktop commandline-switch или нет desktop-файла), --scratch-directory
переменная будет содержать каталог Emacs, который когда-то был началось под.
найти ответ в 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))