Якщо я випадково закрив буфер подряпин у 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
визначає інший режим подряпин за замовчуванням , це буде режим нової подряпини, а не режим взаємодії зі списком.
Я додаю наступне у своїх .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-взаємодія за замовчуванням).
Я виявив це років тому, коли вперше почав використовувати 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
прийнято з: http://everything2.com/index.pl?node_id=1038451
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
автоматично, якщо ви його випадково вб'єте. Змінюйте палітурку, як вам подобається.
Як каже 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)
Це те, що я використовую - я пов'язаний зі зручним натисканням клавіш. Він надсилає вас у *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")))
У мене є спеціальна функція буфера вбивства, яка робить по суті те ж саме - знову відкриває мій особистий збережений файл подряпини і вбиває подряпину за замовчуванням, якщо я вбив останній видимий буфер.
Я налаштував декілька 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-каталог завжди буде повертати базовий каталог вашого Makefile, TODO-файл і т.д. У разі , якщо немає робочого столу ( --no-робочий стіл командного рядка перемикач чи ні настільного файлу) --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))