เปิดบัฟเฟอร์ * scratch * ใหม่ใน Emacs หรือไม่


168

ถ้าฉันปิดบัฟเฟอร์รอยขีดข่วนใน Emac โดยไม่ตั้งใจฉันจะสร้างบัฟเฟอร์รอยขีดข่วนใหม่ได้อย่างไร

คำตอบ:


199

GNU Emacs การผูกค่าเริ่มต้น:

C-xb *scratch* RET

หรือมากขึ้น verbosely

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 และต่อมา: การเปลี่ยนไปใช้ใหม่รอยขีดข่วนบัฟเฟอร์จะนำมันกลับเข้าสู่โหมดการโต้ตอบเสียงกระเพื่อม
Peter S. Housel

เช่นเดียวกับที่รวดเร็วตามขึ้นไปนี้ถ้าคุณ.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 เท่านั้น
Maurizio Loreti

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' และขึ้นบรรทัดใหม่ในบัฟเฟอร์รอยขีดข่วนที่สร้างขึ้นใหม่
Trey Jackson

อุ๊ปส์นั่นอาจมาจากโหมด iswitchb ขอโทษด้วยกับเรื่องนั้น. ในหัวข้ออื่นลองใช้โหมด iswitchb;)
Steven Huwig

หนึ่งไม่ควรนอกจากนี้ยังมีอะไรพิเศษเกี่ยวกับชื่อรอยขีดข่วน หนึ่งสามารถใช้ Cx b เพื่อสร้างบัฟเฟอร์ "scratch" จำนวนเท่าใดก็ได้พร้อมชื่อที่กำหนด
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จะน่าเบื่อจริงๆ ฉันจะต้องสร้างชื่อเฉพาะที่ไม่ตรงกับบัฟเฟอร์ที่มีอยู่ในปัจจุบัน
paprika

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

ฟังก์ชั่นนี้จะ:

สลับไปที่บัฟเฟอร์รอยขีดข่วน หากบัฟเฟอร์ไม่มีอยู่ให้สร้างและเขียนข้อความเริ่มต้นลงไป "

สิ่งนี้จะทำให้เกิดรอยขีดข่วนบัฟเฟอร์ใหม่ขึ้นซึ่งดูเหมือนกับบัฟเฟอร์เริ่มต้น

(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")เพื่อให้แฟ้มสุดท้ายปรากฏบนออก 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ตัวแปรโลคัลของ scratch-buffer:

(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 ของคุณสิ่งที่ต้องทำไฟล์ ฯลฯ ในกรณีที่มีสก์ท็อปไม่มี ( --no-เดสก์ทอป commandline สวิทช์หรือไม่มีสก์ท็อปไฟล์) สำหรับ--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 interaction ด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.