如何将Emacs缓冲区移动到新窗口?

3

我在Emacs窗口中打开了许多缓冲区。我想将其中一个缓冲区移动到一个新窗口中。是否有一个命令可以实现这个功能?

2个回答

9
你要找的命令是tear-off-window。请注意,此命令必须与鼠标单击事件相关联。
例如,你可以将以下代码(来自这个Reddit评论)放入你的初始化文件中(更多有关初始化文件的信息在这里)。
(global-set-key [mode-line C-mouse-1] 'tear-off-window)

当您在缓冲器模型行上按住 Ctrl 并单击时,这将调用 tear-off-window

如果您想要使用键盘绑定,则以下是修改后的 tear-off-window 版本。将其放入您的初始化文件中以便在重新启动 Emacs 后保存它。

(bind-key "C-x C-X" #'my/tear-off-window)

(defun my/tear-off-window ()
  "Delete the selected window, and create a new frame displaying its buffer."
  (interactive)
  (let* ((window (selected-window))
     (buf (window-buffer window))
     (frame (make-frame)))          
    (select-frame frame)
    (switch-to-buffer buf)
    (delete-window window)))

在代码中,修改后的命令绑定到“C-x C-X”键序列。你可以自由地将其更改为任何其他键序列(更多详细信息请参见这里)。

我应该把修改后的 tear-off-window 版本保存在哪里?我不明白如何将命令与鼠标单击事件关联起来。请详细说明。 - vineeshvs
1
@yantar92 现在你可以在SO上投票了。顺便说一句,这是一个非常好的答案。 - pietrodito
假设我在一个单帧上打开了2个缓冲区,当我调用你的函数时,它会打开一个新的帧,并包含当前的缓冲区,但它不会关闭第一个帧上的缓冲区。而且,我不知道为什么,在新的帧中,我也可以看到第二个缓冲区,尽管它并不是活动缓冲区。当我调用你的函数时,我希望它打开一个新的帧,并将当前的缓冲区移动到新的帧,并关闭之前帧上的缓冲区。这可能吗? - efe373
Emacs在多个窗口中显示缓冲区是正常的。如果你想关闭一个框架中的所有缓冲区窗口,你需要遍历该框架中的window-list,并删除所有缓冲区为所需缓冲区的窗口。 - yantar92

3

如果我理解正确,您想创建一个新的WM窗口。

Emacs使用略有不同的术语:在GUI环境中通常称为“窗口”的内容,在Emacs中被称为“框架”。在单个框架内,Emacs将其区域细分为单独的“窗口”(换句话说,即使在非GUI环境中,Emacs也充当着“平铺”窗口管理器)。因此,您可以使用C-x 5 2(或等效的M-x make-frame-command RET)创建一个新的框架,然后在该框架中使用C-x b <buffer-name> RET切换到所需的缓冲区。

顺便提一下,您并不是“移动”缓冲区到新的框架中:无论是否存在显示缓冲区的(emacs)窗口,缓冲区都是独立存在的。


两个命令都可以使用。另外,注意到如果我使用C-x C关闭一个这样的缓冲区,它会关闭所有框架。 - vineeshvs
1
没错:正如我所说,缓冲区存在独立于显示它的任何窗口之外。当它不再存在时,没有窗口可以显示它。顺便说一句,您不需要单独的框架来观察此问题:同一框架中的两个窗口将表现出相同的行为。 - NickD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接