Emacsでスクラッチバッファーを誤って閉じてしまった場合、新しいスクラッチバッファーを作成するにはどうすればよいですか?
Emacsでスクラッチバッファーを誤って閉じてしまった場合、新しいスクラッチバッファーを作成するにはどうすればよいですか?
回答:
GNU Emacsのデフォルトのバインディング:
C-xb
*scratch*
RET
または、より詳細に
M-x
switch-to-buffer *scratch*
RET
*scratch*
バッファは、起動時に選択されたバッファであり、主要なモードがあるLispの相互作用を。注:*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))
*scratch*
iswitchb-modeを有効にしたCx b RET y RET
*scratch*
それ以外の場合はCx b RET だけです。
initial-major-mode
(デフォルトではlispの対話モード)変数。
私が初めてemacsを使い始めたとき、私はこの数年前に見つけました。私は今どこにいるかはわかりませんが、個人の.elファイルには常にホームがあります。それはグーグル検索でポップアップします。
;;; 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)
;;;----------------------------------------------------------------------
私は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
bufname
RET)に切り替えるよりも優れていますか?
ido-mode
おり、通常はかなりの数のバッファを開いています。を使用して新しいバッファを作成するのC-x b
は、とても面倒です。現在存在するどのバッファとも一致しない一意の名前を考え出す必要があります。
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")))
基本的に同じことをするカスタムのkill-buffer関数があります-個人用のスクラッチ保存ファイルを再度開き、最後に表示されているバッファーをkillした場合、デフォルトのスクラッチをkillします。
私はいくつかのカスタマイズされた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-directoryは常にメイクファイル、TODOファイルなどのベースディレクトリを返します。デスクトップがない場合(--no-desktop commandline-switchまたはデスクトップファイルがない場合)、--scratch-directory
変数はディレクトリを保持します。下から始めた。