在窗口布局之间切换


24

当我配置自定义布局时,只需要临时全屏浏览一个文件,一旦我想要该布局,就需要手动对其进行重排。

我想要一个插件/省略号代码来保存我的布局并能够在保存的布局之间切换。

更新

谢谢你们。

abo-abo建议使用获胜者模式真的很好,我让它在零时间工作。

wasamasa建议了一堆我从未听说过的出色插件,并提供了有关如何使用寄存器的信息。

Jordon Biondo向我解释了如何使用寄存器,而这些东西实际上正是我想要的最简单的方法。

谢谢你们。

Answers:


23

内置的方法是使用寄存器。

例如用于C-xrwa保存当前窗口配置以注册一个。

然后,您可以使用内置绑定C-x1运行delete-other-windows

查看完单个文件后,使用C-xrja来弹出寄存器a中保存的窗口配置。

简而言之:

C-xrwa (将配置保存到寄存器中)

C-x1 (删除其他窗口)

C-xrja (重新应用保存的窗口配置)


我确实发现寄存器不方便,但是我使用自定义窗口配置堆栈来管理我的配置。

我有两个绑定将当前配置推送到堆栈,然后弹出并应用顶部配置。

因此,在您的场景中,我将执行推入绑定,然后执行Cx 1,然后执行弹出绑定。

这是代码:

(defvar winstack-stack '()
  "A Stack holding window configurations.
Use `winstack-push' and
`winstack-pop' to modify it.")

(defun winstack-push()
  "Push the current window configuration onto `winstack-stack'."
  (interactive)
  (if (and (window-configuration-p (first winstack-stack))
         (compare-window-configurations (first winstack-stack) (current-window-configuration)))
      (message "Current config already pushed")
    (progn (push (current-window-configuration) winstack-stack)
           (message (concat "pushed " (number-to-string
                                       (length (window-list (selected-frame)))) " frame config")))))

(defun winstack-pop()
  "Pop the last window configuration off `winstack-stack' and apply it."
  (interactive)
  (if (first winstack-stack)
      (progn (set-window-configuration (pop winstack-stack))
             (message "popped"))
    (message "End of window stack")))

然后,您可以绑定winstack-push喜欢的东西C-cC-u,并winstack-popC-cC-o轻松地跳来跳去。


这非常非常非常好!
lukas.pukenis 2014年

20

我用winner-mode。这是我的设置:

(winner-mode)
(global-set-key [f7] 'winner-undo)
(global-set-key [C-f7] 'winner-redo)
(global-set-key [f9] 'delete-other-windows)
(global-set-key [C-f9] 'delete-window)

我不知道是否可以使用书签标记布局或其他内容,但是对于我而言,能够连续切换回先前的布局就足够了。


哇,只是能够切换回以前的布局,对我来说确实很多。谢谢!
lukas.pukenis 2014年

11

Emacs提供了寄存器来保存和应用数据,例如您当前的窗口配置,这可以通过C-x r w和来完成C-x r j。但是,由于您需要记住窗口寄存器,因此这种方法变得笨拙。

有一些软件包可以改善这一点。iregister使此基本功能更易于检查和交互。我知道的其他人在不影响寄存器的情况下使用它,例如elscreenescreen,它们使用标题栏显示选项卡。工作组工作组2是解决此问题的两种更新,更广泛的方法。我个人都不喜欢它,因此写了我自己的介于两者之间的东西,希望它的错误和复杂性会减少。


那是关于寄存器的好东西,但是在这种情况下我应该如何使用它们呢?我将检查您列出的插件,看看是否对我有任何成功:)
lukas.pukenis 2014年

您将当前布局保存到寄存器中,进行一些更改,然后一旦要切换到其旧状态,就从寄存器中恢复布局。我列出的软件包使您摆脱了每次想切换布局时的精神负担。
wasamasa 2014年

是否可以在启动过程中(在我的.emacs文件中)创建某个窗口配置,然后将其保存到寄存器中?我想(window-configuration-to-register "1")在我的.emacs命令,但没有奏效
下午

为此,请尝试使用desktop.el,它已成功与眉毛组合。
wasamasa

2

您可以将当前窗口布局保存到寄存器,然后使用还原它jump-to-register。该命令默认window-configuration-to-register绑定C-x r w

例如,当您以有用的方式排列窗口时,可以i使用以下命令将它们保存为注册文件C-x r w i,稍后使用来恢复布局C-x r j i


1
哈,我们三个人同时回答了关于寄存器的问题。
glucas 2014年

1

Zygospore可为您打开多个窗口并临时最大化其中一个窗口的情况提供快速解决方案。它修改的行为C-x 1。当您打开多个窗口时,它的行为类似于默认delete-other-windows,并删除所有窗口,但您正在查看的窗口除外。当您再次点击它时,它将还原其他窗口。

优胜者模式提供了一个更通用的解决方案,但是合子孢子非常适合暂时放大框架中的单个窗口。最好的事情是它不使用任何新的键绑定-它C-x 1以非常直观的方式重新定义,因此没有新的绑定需要学习。


1

这是一个有趣的问题。几年前,我研究了所有解决方案。仅workgroups2.el的重量足以覆盖所有角落的情况。

但是workgroups2 UI是一场灾难。例如,如果启用worksgroup-mode(如其README所建议),则先前的布局将在emacs启动期间自动加载。这会使启动每次都很慢。

我的解决方案是将workgroups2视为API的集合,而不是开箱即用的可用工具。所以我通过使用@ abo-abo的ivy-mode(https://github.com/abo-abo/swiper)来更改其默认UI交互

在此处输入图片说明

切换整个窗口很容易,使用赢家模式的API就足够了。

下面是完整的代码(我只用M-x toggle-full-windowM-x wg-create-workgroup而且M-x my-wg-switch-workgroup,你还需要安装刷卡,正如我上面提到)

(defun toggle-full-window()
  "Toggle the full view of selected window"
  (interactive)
  ;; @see http://www.gnu.org/software/emacs/manual/html_node/elisp/Splitting-Windows.html
  (if (window-parent)
      (delete-other-windows)
    (winner-undo)))

(setq wg-use-default-session-file nil)
;; don't open last workgroup automatically in `wg-open-session',
;; I only want to check available workgroups! Nothing more.
(setq wg-load-last-workgroup nil)
(setq wg-open-this-wg nil)

;(workgroups-mode 1) ; put this one at the bottom of .emacs
;; by default, the sessions are saved in "~/.emacs_workgroups"
(autoload 'wg-create-workgroup "workgroups2" nil t)

(defun my-wg-switch-workgroup ()
  (interactive)
  (let (group-names selected-group)
    (unless (featurep 'workgroups2)
      (require 'workgroups2))
    (setq group-names
          (mapcar (lambda (group)
                    ;; re-shape list for the ivy-read
                    (cons (wg-workgroup-name group) group))
                  (wg-session-workgroup-list (read (f-read-text (file-truename wg-session-file))))))
    (ivy-read "work groups" group-names
              :action (lambda (group)
                        (wg-find-session-file wg-default-session-file)
                        (wg-switch-to-workgroup group)))))

(eval-after-load 'workgroups2
  '(progn
     ;; make sure wg-create-workgroup always success
     (defadvice wg-create-workgroup (around wg-create-workgroup-hack activate)
       (unless (file-exists-p (wg-get-session-file))
         (wg-reset t)
         (wg-save-session t))

       (unless wg-current-session
         ;; code extracted from `wg-open-session'.
         ;; open session but do NOT load any workgroup.
         (let ((session (read (f-read-text (file-truename wg-session-file)))))
           (setf (wg-session-file-name session) wg-session-file)
           (wg-reset-internal (wg-unpickel-session-parameters session))))
       ad-do-it
       ;; save the session file in real time
       (wg-save-session t))

     (defadvice wg-reset (after wg-reset-hack activate)
       (wg-save-session t))

     ;; I'm fine to to override the original workgroup
     (defadvice wg-unique-workgroup-name-p (around wg-unique-workgroup-name-p-hack activate)
       (setq ad-return-value t))))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.