在Emacs GUI中生成帧的行为类似于终端中的帧

在Emacs GUI中生成帧的行为类似于终端中的帧,emacs,Emacs,在终端中,Emacs管理多个名为F1、F2….的帧。。。。因为它不能创建多个操作系统窗口。我希望GUI版本以这种方式运行,也就是说,我希望它在单个Emacs窗口中创建多个虚拟帧,而不是创建多个OS窗口。有办法吗?如果您的意思是希望能够通过名称访问帧,那么是的,您可以使用 默认情况下,C-x 5 o绑定到冰柱选择框。这允许您按名称选择一个或多个帧 框架的名称来自其名称框架参数。根据需要将其后缀为[NUMBER],以 让它独一无二。例如,在为帧命名的上下文中 它们的缓冲区,您有两个显示缓冲区*帮助*

在终端中,Emacs管理多个名为F1、F2….的帧。。。。因为它不能创建多个操作系统窗口。我希望GUI版本以这种方式运行,也就是说,我希望它在单个Emacs窗口中创建多个虚拟帧,而不是创建多个OS窗口。有办法吗?

如果您的意思是希望能够通过名称访问帧,那么是的,您可以使用

默认情况下,C-x 5 o绑定到冰柱选择框。这允许您按名称选择一个或多个帧

框架的名称来自其名称框架参数。根据需要将其后缀为[NUMBER],以 让它独一无二。例如,在为帧命名的上下文中 它们的缓冲区,您有两个显示缓冲区*帮助*,其中一个 这些帧将被称为*Help*[2],以便与此命令一起使用

使用C-x 5 o的帧选择使用完成和循环。完成可以是香草Emacs完成或regexp,当然包括子字符串完成。它也可以是几个模糊补全式中的任意一个


如果出于某种原因,希望帧名称仅为F1、F2等,就像终端Emacs一样,则只需在帧参数名称级别执行此操作。您可以使用钩子等来实现这一点。

有一种方法可以在GUI中模拟终端emacs的帧切换行为。这就是我所做的。基本上,它使用“使帧不可见”来隐藏非活动帧。它在带有i3的archlinux上运行良好

(defsubst +amos--is-frame-daemons-frame (f)
(and (daemonp) (eq f terminal-frame)))

(defun +amos--frame-list-without-daemon ()
"Return a list of frames without the daemon's frame."
(if (daemonp)
    (filtered-frame-list
    #'(lambda (f) (not (+amos--is-frame-daemons-frame f))))
    (frame-list)))

(defun +amos/workspace-new ()
(interactive)
(let ((name (frame-parameter nil 'name))
        (oframe (selected-frame)))
    (select-frame (if (s-starts-with? "F" name)
                    (make-frame)
                    (make-frame `((name . ,name)))))
    (make-frame-invisible oframe t))
(setq +amos--frame-list (reverse (+amos--frame-list-without-daemon))))

(setq +amos-tmux-need-switch nil)

;; TODO ring lru
(defun +amos/workspace-delete ()
(interactive)
(let ((f (selected-frame)))
    (select-frame (previous-frame))
    (make-frame-visible)
    (delete-frame f))
(setq +amos--frame-list (reverse (+amos--frame-list-without-daemon)))
(+doom-modeline|set-selected-window)
(realign-windows)
(when +amos-tmux-need-switch
    (shell-command! "tmux switch-client -t amos\; run-shell -t amos '/home/amos/scripts/setcursor.sh $(tmux display -p \"#{pane_tty}\")'")
    (setq +amos-tmux-need-switch nil)))

(defun +amos/workspace-switch-to (index)
(interactive)
(when (< index (length +amos--frame-list))
    (let ((frame (nth index +amos--frame-list))
        (oframe (selected-frame)))
    (select-frame frame)
    (raise-frame frame)
    (make-frame-invisible oframe t)
    (setq +amos-tmux-need-switch nil)
    (realign-windows)
    (recenter))))

(defun +amos/workspace-switch-to-1 () (interactive) (+amos/workspace-switch-to 0))
(defun +amos/workspace-switch-to-2 () (interactive) (+amos/workspace-switch-to 1))
(defun +amos/workspace-switch-to-3 () (interactive) (+amos/workspace-switch-to 2))
(defun +amos/workspace-switch-to-4 () (interactive) (+amos/workspace-switch-to 3))
(defun +amos/workspace-switch-to-5 () (interactive) (+amos/workspace-switch-to 4))
(defun +amos/workspace-switch-to-6 () (interactive) (+amos/workspace-switch-to 5))
(defun +amos/workspace-switch-to-7 () (interactive) (+amos/workspace-switch-to 6))
(defun +amos/workspace-switch-to-8 () (interactive) (+amos/workspace-switch-to 7))
(defun +amos/workspace-switch-to-9 () (interactive) (+amos/workspace-switch-to 8))
(defun +amos-workspace-cycle (off)
(let* ((n (length +amos--frame-list))
        (index (-elem-index (selected-frame) +amos--frame-list))
        (i (% (+ off index n) n)))
    (+amos/workspace-switch-to i)))
(defun +amos/workspace-switch-left ()  (interactive) (+amos-workspace-cycle -1))
(defun +amos/workspace-switch-right () (interactive) (+amos-workspace-cycle +1))

(defun +amos|maybe-delete-frame-buffer (frame)
(let ((windows (window-list frame)))
    (dolist (window windows)
    (let ((buffer (window-buffer (car windows))))
        (when (eq 1 (length (get-buffer-window-list buffer nil t)))
        (kill-buffer buffer))))))
(add-to-list 'delete-frame-functions #'+amos|maybe-delete-frame-buffer)

我认为问题更多的是关于能够在虚拟帧之间切换的类似屏幕的功能。我也希望如此。我想这样的事情可以通过保存窗口配置和它的同级函数来完成,但不是在我可以实验的地方。@triplee虚拟帧?对不起,我不清楚你的评论。在这个问题中,我没有看到任何与save-window-configuration相关的内容。使用emacs-nw,C-X5 2创建了一个看起来像是新的emacs会话的内容,您可以切换回以前使用C-X5 o所做的工作。它很整洁,试试看!显然,emacs-nw中没有框架。我想这个特性是在v23中引入的;如果您尝试在没有GUI的情况下使用框架命令,旧版本的Emacsen只会发出嘟嘟声