Emacs에서 * scratch * 버퍼를 다시 열겠습니까?


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 이상에서는 scratch에 특별한 무언가가 있습니다 : 새로운 스크래치 버퍼로 바꾸면 다시 Lisp Interaction 모드로 돌아갑니다.
피터 S. Housel

A는 빠른이 후속 것처럼, 당신의 경우 .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를위한이 작품 만 케이
마우리 치오 Loreti에게

15

이 EmacsWiki 페이지에는 수많은 팁 있습니다.

첫 번째는 다음과 같습니다.

스크래치 버퍼를 재생성하는 매우 간단한 기능 :

(defun create-scratch-buffer nil
   "create a scratch buffer"
   (interactive)
   (switch-to-buffer (get-buffer-create "*scratch*"))
   (lisp-interaction-mode))             

9

*scratch*iswitchb 모드가 활성화 된 Cx b RET y RET.

*scratch*그렇지 않으면 Cx b RET 만하면 됩니다.


기본 바인딩을 사용하면 'y RET'이 필요하지 않으며 새로 작성된 스크래치 버퍼에 'y'와 줄 바꿈 만 삽입하면 됩니다.
Trey Jackson

어쩌면 iswitchb 모드에서 나왔을 것입니다. 미안합니다. 다른 주제에, iswitchb 모드를 시도)
스티븐 Huwig에게

또한 이름 스크래치에 특별한 것이 없어야합니다 . Cx b를 사용하여 임의의 이름으로 임의의 수의 "스크래치"버퍼를 만들 수 있습니다.
Chris Conway

1
이름 * (허용 대답에 명시된 바와 같이) 스크래치 *에 대해 뭔가 특별는 - 당신이 * 주요 모드가에 따라 설정됩니다 * 스크래치라는 버퍼를 작성하는 경우, initial-major-mode변수 (기본적으로 혀짤배기 상호 작용 모드를).
phils

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

unkillable-scratchMELPA의 emacs 패키지를 참고 하면됩니다. 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")))

필자는 기본적으로 동일한 작업을 수행하는 사용자 지정 kill-buffer 기능을 가지고 있습니다. 개인 스크래치 저장 파일을 다시 열고 마지막으로 보이는 버퍼를 종료 하면 기본 스크래치를 종료 합니다 .

나는 몇 가지 사용자 desktop.el부하에 기능을 (kill-buffer "*scratch*") 하고 (find-file "/Users/HOME/Desktop/.scratch")있으므로 해당 파일을 이맥스를 종료에 표시 마지막은 기본 스크래치에 의해 매장되지 않습니다 또는 이맥스를 시작할 때 내 사용자 지정 스크래치에 의해 매장.

나는 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-directory 는 항상 makefile, TODO 파일 등의 기본 디렉토리를 반환합니다. 데스크탑이없는 경우 ( --no-desktop 명령 줄 스위치 또는 데스크탑 파일이없는 경우) --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 상호 작용 모드에있는 새 버퍼를 작성합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.