Emacs:创建新帧时如何创建新的"空"缓冲区?

Bar*_*son 16 emacs

我的Emacs在OS X系统上.有没有办法在我使用时将新帧默认为空缓冲区⌘N(就像TextEdit的工作方式一样)?我更喜欢先写内容,然后再决定一个合适的文件名.但是,Emacs要我先决定文件名,然后再写内容.我认为没有任何优势.有谁知道为什么Emacs这样工作?

基本上,如果我使用C-x 5 2,Emacs总是弹出一个框架,包含我目前正在处理的任何文件.这很不方便.我也不希望我的Emacs弹出一个默认的新框架*scratch*(许多谷歌搜索结果以某种方式建议这种方法).我更喜欢在新帧中暂时使用一个名为"Untitled"的缓冲区,如果⌘N再次使用,Emacs会弹出另一个临时"无标题2"缓冲区,依此类推.这样,我可以稍后决定缓冲区文件名.

lun*_*orn 22

您可以使用创建新缓冲区switch-to-buffer.类型C-x b,输入缓冲区名称,然后按RET.如果不存在具有该名称的缓冲区,Emacs将在基础模式下自动创建一个新缓冲区.您可以像往常一样切换到任何其他模式M-x,例如M-x python-mode.要更改默认缓冲区,请将默认值设置major-mode为所需的缓冲区.

但是,如果您想自动选择缓冲区名称并创建新框架,则需要编写自己的命令:

(defun lunaryorn-new-buffer-frame ()
  "Create a new frame with a new empty buffer."
  (interactive)
  (let ((buffer (generate-new-buffer "untitled")))
    (set-buffer-major-mode buffer)
    (display-buffer buffer '(display-buffer-pop-up-frame . nil))))
Run Code Online (Sandbox Code Playgroud)

绑定到C-c n:

(global-set-key (kbd "C-c n") #'lunaryorn-new-buffer-frame)
Run Code Online (Sandbox Code Playgroud)

现在按下C-c n创建一个新的框架,其中包含一个名为"untitled"的新空缓冲区,其中x是一个连续的数字.

  • @BartSimpson`Cc n`是"安全的",因为它不会与Emacs本身或其他模式的绑定冲突,因为`Cc <letter>`是为用户保留的,根据[Key Binding Conventions](http ://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Binding-Conventions.html).Emacs和任何其他表现良好的模式都不会绑定这些模式,因此不存在冲突的风险.当然,只要您意识到它可能与Emacs或其他模式冲突,您可以使用您喜欢的任何其他绑定. (3认同)

Gre*_*ott 6

下面将创建一个具有唯一名称的缓冲区。缓冲区不与任何文件相关联,所以如果/当你曾经C-x C-s save-buffer,你会被提示提供一个文件名。

(defun empty-frame ()
  "Open a new frame with a buffer named Untitled<N>.

The buffer is not associated with a file."
  (interactive)
  (switch-to-buffer-other-frame (generate-new-buffer "Untitled")))
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ler 5

如果我理解您的要求,这可能对您有用:

(defun empty-frame ()
  (interactive)
  (let ((fl (make-temp-file "Untitled")))
    (switch-to-buffer-other-frame fl)))
Run Code Online (Sandbox Code Playgroud)

这将为每个新缓冲区打开一个新的临时文件.如果您不想实际创建文件,可以使用此代码:

(defun empty-frame ()
  (interactive)
  (let ((bn "Untitled-")
        (num 1))
    (while
        (get-buffer (concat bn (number-to-string num))) 
      (setq num (1+ num))) 
    (switch-to-buffer-other-frame
     (concat bn (number-to-string num)))))
Run Code Online (Sandbox Code Playgroud)

  • 不要在每次迭代时映射和搜索整个缓冲区列表.使用`get-buffer`测试是否存在具有特定名称的缓冲区.但实际上,使用`generate-new-buffer`. (2认同)