Emacs如何暂存windows layout

我使用大屏幕显示器是,经常开至少两个window进行操作。

我总有这样的需求:暂存一下某个 windows layout ,去做完其它事情然后迅速我切 回来。

刚开始时我找到了 `window-configuration-to-register' 这个函数。它可以把 windows layout 存到寄存器中。需要调出来的时候直接 `jump-to-register' 就搞定。但是经常registor一多,我就忘了哪些是存过的哪些是没有存过的。这 样的话,就容易把之前存的内容覆盖掉。于是我写了这两个函数:

  (defun peng-found-in-register-alist-p (r)
    "whether the register is in `register-alist'"
    (let ((plist register-alist)
          (value)
          (flag-p nil))

      (while (and plist
                  (not flag-p))
        (setq value (car (car plist)))
        (if (equal value r)
            (progn
              (setq flag-p t)
              t))
        (setq plist (cdr plist))
        )

      ;; flag-p is t when found
      (if flag-p
          t
        nil))) 
  (defun peng-window-configuration-to-register ()
    "put window configuration to register, when register is
  used. Make sure override or not"
    (interactive)
    (let ((r (read-char  "Put windows  to register: ")))

      (if (peng-found-in-register-alist-p  r)
          (progn
            (if (y-or-n-p "The register is in using, Override or not?")
                (progn
                  (window-configuration-to-register r)
                  (message "Save windows-conf-in %s" (char-to-string r))
                  )
              (message "Do not thing")))
        (progn
          (window-configuration-to-register r)
          (message "Save windows-conf-in %s" (char-to-string r))
          )
        )))

使用 `peng-window-configuration-to-register' 来存,如果原来的 r 中保 存了内容,会提示你是否覆盖。

过了一段时间,我发现原来 `ivy' 也提供类似的功能。主要就是 `ivy-push-view' 和 `ivy-pop-view' 。具体见 这里

简单来讲,调用 `ivy-push-view' 可以保存一个类似于 {} bufname1 bufname2 xxx 这样的一个 view 。使用 `ivy-switch-buffer' 可以切换过 去。一般很少以 { 开头的buffer。所以一般输入 { 后就可以切换已经保存 过的 windows layout 啦。如果对应文件已关闭了,它还会打开它。

另外,把 `ivy-use-virtual-buffers' 设置 为 t 。 `ivy-switch-buffer' 就可以切换最近打开的文件和bookmarks。那这样的话,该函数可以打开已开启 的buffer,最近的文件,bookmarkd,和 windows layout 。很方便了。

我由于使用 windows layout 比较多。就参考 `ivy-switch-buffer' 改了一 个这样的小函数:

  (defun peng-ivy-switch-buffer-to-views ()
    "Switch to another buffer with { as default value"
    (interactive)
    (let ((this-command 'ivy-switch-buffer))
      (ivy-read "Switch to buffer: " 'internal-complete-buffer
                :initial-input "{ "
                :matcher #'ivy--switch-buffer-matcher
                :preselect (buffer-name (other-buffer (current-buffer)))
                :action #'ivy--switch-buffer-action
                :keymap ivy-switch-buffer-map
                :caller 'ivy-switch-buffer)))

如果还有其它更方便的方法,欢迎联系我 :)

Date: 2017-06-24

Author: Peng Xie

Created: 2018-10-01 Mon 21:36