什么是最好的Emacs工作区插件?

18

所谓工作空间,是指需要保存当前打开的缓冲区状态(可能在用户指定的工作空间文件中),并快速切换到另一组打开的缓冲区,例如继续处理与另一个项目相关的文件。

是否有适用于Emacs的插件可以实现这一功能?你会推荐哪个?


一种现代的方法是使用eyebrowse:https://github.com/wasamasa/eyebrowse - iHowell
6个回答

11
我使用了 save-visited-filesworkgroups 的组合。实际上,单独使用 workgroups 可以满足大部分需求。
我的配置如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; workgroups for windows

(setq wg-prefix-key (kbd "C-c z")
      wg-no-confirm t
      wg-file (concat emacs-persistence-directory "workgroups")
      wg-use-faces nil
      wg-switch-on-load nil)

(defun wg-load-default ()
  "Run `wg-load' on `wg-file'."
  (interactive)
  (wg-load wg-file))

(defun wg-save-default ()
  "Run `wg-save' on `wg-file'."
  (interactive)
  (when wg-list
    (with-temp-message ""
      (wg-save wg-file))))

(with-library 'workgroups
  (define-key wg-map (kbd "C-l") 'wg-load-default)
  (define-key wg-map (kbd "C-s") 'wg-save-default)
  (workgroups-mode 1)
  (add-hook 'auto-save-hook 'wg-save-default)
  (add-hook 'kill-emacs-hook 'wg-save-default))

2
我希望切换到另一个工作组时,关闭与旧工作组相关的所有缓冲区并打开新的缓冲区,而不仅仅是打开新的缓冲区。 - axel22
1
"workgroups"没有适当的在缓冲区集之间切换,而且加载/保存很麻烦。我感谢您的回答,但我认为这不是一个好的解决方案。 - axel22
我同意恢复(wg-restore-workgroup)和更新(wg-update-workgroup)可能很麻烦,因为它需要纪律。你可以制作一些钩子来自动化它,但它真的应该是内置的东西。加载和保存可以轻松自动化,例如使用auto-save-hook,就像我所做的那样。我很久以前就不再关心打开的缓冲区了。我每隔几天清理一些缓冲区,ido模式使切换变得容易。我现在有91个缓冲区打开。 - jpkotta
我明白你的意思。实际上,我一直在四处寻找一个不错的工作区和缓冲区组织模式/插件,但是没有找到。工作组是我看到的最好的东西之一,但它们缺少一些功能。 - axel22
这个跟IDE(Eclipse)PROJ相比怎么样? - zinking
感谢您的回答。我正在使用“workgroups”,因为“workgroups2”对我来说存在问题。我使用“workgroup”的用例是在会话之间保存窗口配置。至于仅限于项目的本地缓冲区,我已经有了Projectile,所以我不希望“workgroups”在切换到新缓冲区时关闭所有缓冲区。那样就不对了。 - Amumu

6

就我个人而言,我一直在使用`persp-mode'

这是一个基于Nathan Weizenbaum的perspective-el开发的emacs增强工具。它不仅可以实现多窗口之间的视角共享,还可以将当前的视角存储到文件中,方便再次恢复。


2
HIROSE Yuuji的revive.el很长一段时间以来一直对我有很好的作用。我使用在revive.el评论中提供的标准配置。文档写得很好,revive非常易于使用和配置。特别是,与某些复杂配置的恢复相比,revive.el具有更好的支持。如果您将它与HIROSE Yuuji的windows.el结合使用,它会特别好。它们是为了配合使用而制作的。windows.el使得回忆窗口分割等操作成为可能。revive.el的构建考虑到了特定设置的深度模式集成的可扩展性。但是对于我的使用,我发现它开箱即用非常好,尽管我认为下一步我会调整它以便恢复w3m窗口,因为我目前没有设置(更新:我现在已经设置好了,请参见底部)。
这是我的revive配置。首先是一些有用的注释,其中包括windows.el和revive.el内联:
(provide 'my-revive-config)

(require 'windows) ; use this with revive so that window splits are recallable
                   ; too

(win:startup-with-window) ; start with window 1


;;;[Key Bindings]
;;;
;;;   The default prefix key stroke for Windows is `C-c C-w'.  If it
;;; causes  you some  troubles, see  the  section  `Customizations'.
;;; Here are the default key bindings.
;;;
;;;     C-c C-w 1       Switch to window 1 (Q)
;;;     C-c C-w 2       Switch to window 2 (Q)
;;;        :
;;;     C-c C-w 9       Switch to window 9 (Q)
;;;     C-c C-w 0       Swap windows with the buffer 0 (Q)
;;;                 (Select unallocated frame(Emacs 19))
;;;     C-c C-w SPC     Switch to window previously shown (Q)
;;;     C-c C-w C-n     Switch to next window
;;;     C-c C-w C-p     Switch to previous window
;;;     C-c C-w !       Delete current window (Q)
;;;     C-c C-w C-w     Window operation menu
;;;     C-c C-w C-r     Resume menu
;;;     C-c C-w C-l     Local resume menu
;;;     C-c C-w C-s     Switch task
;;;     C-c C-w =       Show window list (Q)
;;;
;;;   The  key strokes  to  select  windows from  1    to 9 must  be
;;; frequently used, so the alternative key strokes `C-c [Num.]' are
;;; available  by default  (And  any  function  with (Q)mark can  be
;;; invoked without  C-w).  To disable these  quick key strokes, set
;;; the variable win:quick-selection to `nil' in your ~/.emacs.

(autoload 'save-current-configuration "revive" "Save status" t)
(autoload 'resume "revive" "Resume Emacs" t)
(autoload 'wipe "revive" "Wipe Emacs" t)

(define-key ctl-x-map "S" 'save-current-configuration)
(define-key ctl-x-map "F" 'resume)
(define-key ctl-x-map "K" 'wipe)

;;;
;;;[How to use]
;;;
;;;  Call `save-current-configuration' (`C-x S' if you define key as
;;; above) when you want to save current editing status and call
;;; `resume' to restore it. Numerical prefix arg to them specifies
;;; the buffer number in which the editing status will be saved.
;;; Here the buffer refers to a revive s-exp in ~/.revive.el of
;;; which there can be n
;;;
;;;     [Sample Operations]
;;;     C-u 2 C-x S     ;save status into the buffer #2
;;;     C-u 3 C-x F     ;load status from the buffer #3

有其他人喜欢 revive-plus.el和在github上略作修改的克隆 slightly modified clone on github,但我更喜欢原版。
更新于2015年1月12日星期一:现在我可以在revive中恢复w3m(请参阅revive.el文档以了解详细信息,特别是查看revive:major-mode-command-alist-default中的示例)。
(setq revive:major-mode-command-alist-private
      '(("*w3m*"    . w3m)))

注意,您正在告诉恢复w3m缓冲区的名称。即使您有多个选项卡,只需要枚举第一个选项卡即可。
这是我设置的w3m变量,用于恢复上一个会话中的所有选项卡:
(setq w3m-session-load-last-sessions t)

2

desktop.el将对您的情况有所帮助。

它可以(从其介绍页面复制)从emacs包缓冲区中:

保存桌面,即, - 一些全局变量 - 带有关联文件的缓冲区列表。 对于每个缓冲区还有 - 主要模式 - 默认目录 - 点 - 标记和标记活动 - 缓冲区只读 - 一些本地变量


1
我还没有尝试过使用多个桌面文件,它能工作吗?我认为它更适用于在Emacs重新启动时保存状态,这方面它做得非常好。 - tripleee
可以的:我们可以将桌面文件保存在指定目录中(desktop-save-in-directory),并通过desktop-read函数读取它。 - Ehvince

2
如果你使用的是Linux/Gnome3系统,你可以尝试使用这个扩展:https://extensions.gnome.org/extension/361/emacs-manager/。该扩展可以通过管理多个emacs daemons,使你能够同时处理不同的项目,并保存/恢复缓冲区状态。请注意保留HTML标签。

0

弹丸模式可以实现你想要的功能:

在一个项目内切换缓冲区:projectile-switch-to-buffer

切换项目:projectile-switch-to-project

我有类似这样的东西:

(global-set-key (kbd "C-x b") '(λ ()
                                (interactive)
                                (if (projectile-project-p) 
                                    (call-interactively 'projectile-switch-to-buffer)
                                (call-interactively 'ivy-switch-buffer))))

(global-set-key (kbd "C-x B") 'ivy-switch-buffer)

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