【问题标题】:Emacs: How do I create a new "empty" buffer whenever creating a new frame?Emacs:每当创建新框架时,如何创建一个新的“空”缓冲区?
【发布时间】:2014-09-11 15:34:57
【问题描述】:

我的 Emacs 在 OS X 系统上。每当我使用 ⌘N 时,有什么方法可以使新框架默认为空缓冲区(就像 TextEdit 的工作方式一样)?我更喜欢先写内容,然后再决定一个合适的文件名。然而,Emacs 想让我先决定文件名,然后再写内容。我看不出它有什么好处。有谁知道为什么 Emacs 会这样工作?

基本上,如果我使用 C-x 5 2,Emacs 总是会弹出一个框架,其中包含我当前正在处理的任何文件。这很不方便。我也不希望我的 Emacs 弹出一个默认为 *scratch* 的新框架(许多 Google 搜索结果以某种方式暗示了这种方法)。我更喜欢它在新框架中有一个临时称为“Untitled”的缓冲区,如果我再次使用 ⌘N,Emacs 会弹出另一个临时“Untitled 2”缓冲区,依此类推。这样,我可以稍后决定缓冲区文件名。

【问题讨论】:

  • 所以,只需在您找到的解决方案中将*scratch* 替换为*Untitled
  • 我想要多个新的“无标题”缓冲区。到目前为止,所有新帧都指向同一个“Untitled”缓冲区。
  • 缓冲区不应该有唯一的名称吗? *untitled-01* *untitled-02* *untitled-03* 如果名称不是唯一的,恐怕您实际上会在显示该缓冲区名称的每一帧中查看相同的缓冲区。

标签: emacs


【解决方案1】:

您可以使用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))))

将此绑定到C-c n:

(global-set-key (kbd "C-c n") #'lunaryorn-new-buffer-frame)

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

【讨论】:

  • 很好 - 我不知道 generate-new-buffer,所以我尝试从头开始实现它。
  • @lunaryorn,我刚试过你的功能,它有效!有什么理由将它绑定到 (kbd "C-c n") 而不是 (kbd "s-n")?我更喜欢使用系统默认的 CMD-n,它对我来说更直观。您是否因为 MELPA/ELPA 包中的几个潜在的键绑定冲突而以这种方式绑定它?
  • @BartSimpson C-c n 是“安全的”,因为它不会与来自 Emacs 本身或其他模式的绑定发生冲突,因为 C-c <letter> 是为用户保留的,根据 Key Binding Conventions . Emacs 和任何其他行为良好的模式都不会绑定这些,因此没有冲突的风险。当然,您可以使用任何您喜欢的其他绑定,只要您知道它可能与 Emacs 或其他模式冲突。
  • @lunaryorn,谢谢!我会在我的键绑定中记住这一点!
  • 如果我想在同一个窗口而不是新窗口中打开缓冲区怎么办?谢谢!
【解决方案2】:

以下将创建一个具有唯一名称的缓冲区。缓冲区不与任何文件关联,因此如果/当您曾经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")))

【讨论】:

  • 当我点击发布答案时,我看到@lunaryorn 发布了类似的内容,并且增加了设置主要模式的扭曲。哦,好吧。
【解决方案3】:

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

(defun empty-frame ()
  (interactive)
  (let ((fl (make-temp-file "Untitled")))
    (switch-to-buffer-other-frame fl)))

这将为每个新缓冲区打开一个新的临时文件。如果您不想实际创建该文件,则可以改用它:

(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)))))

【讨论】:

  • 不要在每次迭代时映射和搜索整个缓冲区列表。使用get-buffer 测试是否存在具有特定名称的缓冲区。但实际上,请使用generate-new-buffer
  • 这样更好,谢谢。我将把它留在这里作为您答案的(劣质)替代方案。
【解决方案4】:

您已经看到了有关如何创建新的“Untitled”缓冲区的答案,但至于 Emacs 为什么要您首先选择一个名称,其中一些原因是:

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

【讨论】:

    【解决方案5】:

    如果不存在,C-x b *untitled* 将打开新的缓冲区。另见Emacs manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多