Emacs:如何创建一个新的;“空的”;创建新帧时缓冲区?

Emacs:如何创建一个新的;“空的”;创建新帧时缓冲区?,emacs,Emacs,我的Emacs在OSX系统上。有什么方法可以使新帧在使用时默认为空缓冲区⌘N(就像文本编辑的工作方式)?我喜欢先写内容,然后再决定一个合适的文件名。但是,Emacs希望我先决定文件名,然后再写内容。我看不出有什么好处。有人知道为什么Emacs是这样工作的吗 基本上,如果我使用C-X52,Emacs总是会弹出一个包含我当前正在处理的任何文件的框架。这很不方便。我也不想让我的Emacs弹出一个默认为*scratch*的新框架(许多谷歌搜索结果不知何故建议使用这种方法)。我更喜欢在新帧中有一个临时称为

我的Emacs在OSX系统上。有什么方法可以使新帧在使用时默认为空缓冲区⌘N(就像文本编辑的工作方式)?我喜欢先写内容,然后再决定一个合适的文件名。但是,Emacs希望我先决定文件名,然后再写内容。我看不出有什么好处。有人知道为什么Emacs是这样工作的吗


基本上,如果我使用C-X52,Emacs总是会弹出一个包含我当前正在处理的任何文件的框架。这很不方便。我也不想让我的Emacs弹出一个默认为
*scratch*
的新框架(许多谷歌搜索结果不知何故建议使用这种方法)。我更喜欢在新帧中有一个临时称为“Untitled”的缓冲区,如果我使用⌘N再一次,Emacs弹出另一个临时“Untitled 2”缓冲区,依此类推。这样,我可以在以后决定缓冲区文件名。

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

(取消空帧()
(互动)
(let((fl(使临时文件“无标题”))
(切换到缓冲区其他帧fl)))
这将为每个新缓冲区打开一个新的临时文件。如果您不想实际创建文件,可以使用以下方法:

(取消空帧()
(互动)
(让((bn“无标题-”)
(数字1)
(而
(获取缓冲区(concat bn(数字到字符串num)))
(设置数量(1+num)))
(切换到缓冲其他帧)
(concat bn(数字到字符串num‘‘‘‘)’)

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

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

(解除lunaryorn新缓冲帧()
“使用新的空缓冲区创建新帧。”
(互动)
(let((缓冲区(生成新缓冲区“未命名”))
(设置缓冲区主模式缓冲区)
(显示缓冲区(显示缓冲区弹出框.nil)))
将此绑定到
C-cn

(全局设置键(kbd“C-C n”)#'lunaryorn-new-buffer-frame)

现在按
C-cn
创建一个新的帧,其中新的空缓冲区名为“untitled”,其中x是一个连续的数字。

下面将创建一个具有唯一名称的缓冲区。缓冲区不与任何文件关联,因此,如果/当您
C-x C-s
保存缓冲区时,系统将提示您提供文件名

(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")))
(取消空帧()
“使用名为Untitled的缓冲区打开新帧。
缓冲区未与文件关联。“
(互动)
(切换到缓冲其他帧(生成新缓冲区“无标题”))

关于如何创建新的“无标题”缓冲区,您已经看到了答案,但关于为什么Emacs希望您首先选择一个名称,原因如下:

  • 历史:这就是它的工作原理,一旦你习惯了,它就不会比另一种更糟糕了
  • 通常根据文件名选择主要模式和各种其他详细信息。因此,您只需打开扩展名为“.tex”或“.C”的文件,而不是创建一个无标题的缓冲区并选择是将其置于LaTeX模式还是C模式
  • 有一个文件名意味着Emacs可以使用标准的自动保存过程,而使用无标题方法,应用程序需要有一些特殊的方法来自动保存那些无标题的文档在某个“标准”位置

C-x b*无标题*将在不存在的情况下打开新缓冲区。另外,请参见

因此,在您找到的解决方案中,只需将
*scratch*
替换为
*Untitled
。我希望有多个新的“Untitled”缓冲区。到目前为止,所有新帧都指向同一个“无标题”缓冲区。缓冲区不应该有唯一的名称吗
*untitle-01*
*untitle-02*
*untitle-03*
如果名称不唯一,恐怕您在显示该缓冲区名称的每个帧中都会看到相同的缓冲区。很好-我不知道如何生成新缓冲区,所以我尝试从头开始实现它。@lunaryorn,我刚刚尝试了您的函数,它起作用了!是否有任何理由将其绑定到(kbd“C-cn”)而不是(kbd“s-n”)?我更喜欢使用系统默认的CMD-n,它对我来说更直观。您是因为MELPA/ELPA包中存在几个潜在的键绑定冲突而这样绑定的吗?@BartSimpson
C-cn
是“安全的”,因为它不会与来自Emacs本身或其他模式的绑定冲突,因为
C-C
是为用户保留的。Emacs和任何其他行为良好的模式都不会绑定这些,因此没有冲突的风险。当然,您可以使用您喜欢的任何其他绑定,只要您知道它可能与Emacs或其他模式冲突。@lunaryorn,谢谢!我会记住我的钥匙扣!如果我想在同一个窗口中而不是在新窗口中打开缓冲区,该怎么办?谢谢当我点击Post Answer时,我看到@lunaryorn发布了类似的内容,并且设置了一个主模式。哦,好吧。不要在每次迭代中映射和搜索整个缓冲区列表。使用
get buffer
测试是否存在具有特定名称的缓冲区。但实际上,使用
生成新缓冲区
。这样更好,谢谢。我将把这个留在这里,作为你答案的(次)选择。