2008-10-24 2 views

ответ

172

GNU Emacs привязки по умолчанию:

С-хб*scratch*RET

или, более пространно

М-хswitch-to-buffer *scratch*RET

*scratch* буфер представляет собой буфер, выбранный при запуске, и имеет основной режим Lisp Interaction. Примечание: режим для буфера *scratch* управляется переменной initial-major-mode.

В общем, вы можете создать столько «царапин» буферов, сколько хотите, и назовите их, как вы сами выбираете.

С-хбNAMERET

переключается в буфер NAME, создавая его, если он не существует. Новый буфер не связан с файлом на диске, пока вы не используете C-хC-ш (или M-хwrite-fileRET), чтобы выбрать файл, в котором он должен быть сохранен.

М-хtext-modeRET

изменяет основной режим текущего буфера в текстовом режиме.Для того, чтобы найти все режимы, доступные (то есть, не требуя каких-либо новых пакетов), вы можете получить список, набрав:

Mxapropos-command -mode$RET

8

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

Just C-x b *scratch* RET в противном случае.

+0

С привязками по умолчанию «y RET» не требуется и просто вставляет «y» и новую строку во вновь созданный буфер * scratch *. – 2008-10-24 20:02:06

+0

Ooops, может быть, это из режима iswitchb. Извини за это. На другой теме, попробуйте iswitchb-mode;) – 2008-10-24 20:14:44

+0

Не следует также, чтобы в названии * scratch * ничего особенного не было. Можно использовать C-x b для создания любого количества «царапающих» буферов с произвольными именами. – 2008-10-24 20:46:00

-3

С-хб а затем введите *scratch*↩︎

, чтобы создать новый буфер, который находится в режиме 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) 
;;;---------------------------------------------------------------------- 
20

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

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

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

Тогда я принял это, который хорошо работает для меня:

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

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

Переключение в буфер нуля. Если буфер не существует создать и записать первоначальное сообщение в него.»

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

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

Есть целые . целая куча советов по this EmacsWiki page

Вот первый:

очень простая функция, чтобы воссоздать царапину Буфер:

(defun create-scratch-buffer nil 
    "create a scratch buffer" 
    (interactive) 
    (switch-to-buffer (get-buffer-create "*scratch*")) 
    (lisp-interaction-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-desktop commandline-switch или no desktop-file) переменная --scratch-directory будет содержать директорию Emacs, которая была когда-то запущена.

2

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

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))) 
2
(global-set-key (kbd "C-x M-z") 
       '(lambda() 
        (interactive) 
        (switch-to-buffer "*scratch*"))) 

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

2

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

Смежные вопросы