Відкрити буфер * scratch * в Emacs?


168

Якщо я випадково закрив буфер подряпин у Emacs, як створити новий буфер нуля ?

Відповіді:


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


Коли я спробую цю пораду від "ibuffer", рада ігнорується. Але як я найкраще можу сказати, "ibuffer" використовує "kill-buffer". Можеш допомогти мені?
A.Ellett

Добре, натискання "закрити буфер" в графічному інтерфейсі подряпини видалено. Це працює лише для Cx k,
Мауріціо

15

На цій сторінці EmacsWiki є маса порад .

Ось перший:

Дуже проста функція відтворення буфера подряпин:

(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 з включеним режимом iswitchb.

Просто Cx b *scratch*RET в іншому випадку.


З прив'язкою за замовчуванням 'y RET' не потрібна, вона просто вставляє 'y' та новий рядок у новостворений буфер нуля .
Трей Джексон,

Ой, можливо, це з режиму iswitchb. Вибач за це. З іншої теми спробуйте iswitchb-mode;)
Стівен Ювіг

Не слід, також, немає нічого особливого в назві нуля . Можна використовувати Cx b для створення будь-якої кількості буферів "нуля" з довільними назвами.
Кріс Конвей

1
У назві * scratch * (як зазначено у прийнятій відповіді) є щось особливе - якщо ви створюєте буфер під назвою * scratch *, основний режим буде встановлений відповідно до initial-major-modeзмінної (режим Lisp-взаємодія за замовчуванням).
філ

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

3

Раніше я використовував рішення dwj, і я був дуже радий цьому, до дня, коли я зрозумів, що він не вдався, коли ви насправді перейменували буфер подряпин (наприклад, збереживши його).

Тоді я прийняв це, що добре працює для мене:

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

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автоматично, якщо ви його випадково вб'єте. Змінюйте палітурку, як вам подобається.


3

Просто зазначимо, що пакет Emacs unkillable-scratchу MELPA це зробить. Є також scratch-persistте, що автоматично зберігає та відновлює буфер між сеансами.


2

Як каже 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)

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

2

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

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

У мене є спеціальна функція буфера вбивства, яка робить по суті те ж саме - знову відкриває мій особистий збережений файл подряпини і вбиває подряпину за замовчуванням, якщо я вбив останній видимий буфер.

Я налаштував декілька 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) ))

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-каталог завжди буде повертати базовий каталог вашого Makefile, TODO-файл і т.д. У разі , якщо немає робочого столу ( --no-робочий стіл командного рядка перемикач чи ні настільного файлу) --scratch-directoryзмінна буде тримати каталог Emacs був коли - то почав під.



0

Щоб додати до прийнятої відповіді, якщо у вас увімкнено режим ILO (і він автоматично завершується, після C-x bчого не дозволяє писати *scratch*), спробуйте:

C-xb C-b*scratch* RET

C-x b C-b *scratch* RET


-3

C-xb а потім наберіть *scratch* ↩︎

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.