Повторно открыть * скретч * буфер в Emacs?

168

Если я случайно закрыл пустой буфер в Emacs, как мне создать новый чистый буфер?

Fortepianissimo
источник

Ответы:

199

Привязки по умолчанию для 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

Трей Джексон
источник
8
Обратите внимание , что есть что - то особенное нуля , по крайней мере , в GNU Emacs 21 и более поздних версий: переключение на новый царапанию буфер будет положить его обратно в режим взаимодействия Лиспа.
Питер С. Хаусл
В качестве быстрого продолжения этого, если вы .emacsопределяете другой режим очистки по умолчанию , этот режим будет режимом нового ввода, а не режимом List List Interaction.
ocodo
23

Я добавляю следующее в мой .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, но он не уничтожает его, просто помещает в конец списка буферов, поэтому он мне понадобится в следующий раз, когда мне не нужно создавать новый.

user45273
источник
Когда я пробую этот совет от "ibuffer", совет игнорируется. Но, насколько я могу судить, ibuffer использует kill-buffer. Вы можете помочь мне?
Эллетт
Что ж, ударить «закрыть буфер» в графическом интерфейсе нуля удаляется. Это работает только для Cx k,
Маурицио Лорети
9

Cx b *scratch*RET y RET с включенным режимом iswitchb.

Просто Cx b *scratch*RET в противном случае.

Стивен Хьюиг
источник
При связывании по умолчанию y RET не требуется, а просто вставляет y и символ новой строки в только что созданный рабочий буфер.
Трей Джексон,
Упс, может быть, это из режима iswitchb. Извини за это. По другой теме, попробуйте iswitchb-mode;)
Steven Huwig
Не следует также ничего особенного в названии царапины . Можно использовать Cx b для создания любого количества «чистых» буферов с произвольными именами.
Крис Конвей
1
В имени * scratch * есть что-то особенное (как отмечено в принятом ответе) - если вы создадите буфер с именем * scratch *, основной режим будет установлен в соответствии с initial-major-modeпеременной (lisp-взаимодействия-mode по умолчанию).
Филс
4

Я обнаружил это несколько лет назад, когда впервые начал использовать 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
источник
3

Раньше я использовал решение dwj, и я был очень доволен этим, пока в тот день я не понял, что это не удалось, когда вы на самом деле переименовали рабочий буфер (например, сохранив его).

Затем я принял это, что хорошо работает для меня:

  (run-with-idle-timer 1 t
    '(lambda () (get-buffer-create "*scratch*")))
Gyom
источник
3

У меня 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

принято с: http://everything2.com/index.pl?node_id=1038451

паприка
источник
Чем это лучше простого переключения на новый буфер (Cx b bufnameRET)?
bignose
@bignose: я использую ido-modeи обычно открываю довольно много буферов. Создание нового буфера с использованием C-x bбыло бы очень утомительно. Я должен был бы придумать уникальное имя, которое не соответствует ни одному из существующих в настоящее время буферов.
паприка
3
(global-set-key (kbd "C-x M-z")
                '(lambda ()
                   (interactive)
                   (switch-to-buffer "*scratch*")))

Это не только быстро переключится в *scratch*буфер (так как я часто это делаю), но и заново создаст *scratch*буфер и включит его lisp-interaction-modeавтоматически, если вы случайно его уничтожите. Измените привязку, как вам нравится.

CodyChan
источник
3

Просто отметим, что пакет emacs unkillable-scratchв MELPA сделает это. Существует также, scratch-persistчто будет автоматически сохранять и восстанавливать буфер между сессиями.

nj35
источник
2

Как говорит строка документации, эта функция будет:

Переключитесь на рабочий буфер. Если буфер не существует, создайте его и запишите в него исходное сообщение. "

Это приведет к созданию нового буфера очистки, который выглядит как начальный буфер очистки.

(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)
kjfletch
источник
2

Это то, что я использую - это связано с удобным нажатием клавиши. Он отправляет вас в *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)))
Edric
источник
2

Я предпочитаю, чтобы мой рабочий буфер был реальным файлом, который автоматически сохраняется, и открыть его так же просто, как открыть файл. При запуске я убиваю настройки по умолчанию и нахожу свои вот так.

(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) ))
lawlist
источник
1

Я объединил опубликованные решения в одну функцию:

(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, который когда-то был началось под.

Андреас Шпиндлер
источник
0

Чтобы добавить к принятому ответу, если у вас включен режим ILO (после которого выполняется автозаполнение C-x b, что не позволяет вам писать *scratch*), попробуйте:

C-xb C-b*scratch* RET

C-x b C-b *scratch* RET

Petre
источник
-3

C-xb а затем введите *scratch* ↩︎

создать новый буфер, который также находится в режиме взаимодействия с lisp.

stephanea
источник