[[https://elpa.gnu.org/packages/activities.html][file:https://elpa.gnu.org/packages/activities.svg]]
Inspired by Genera's and KDE's concepts of "activities", this Emacs library allows the user to manage frames/tabs, windows, and buffers according to their purpose. An "activity" comprises a frame or tab, its window configuration, and the buffers displayed in them--its "state"; this state would be related to a certain task the user performs at various times, such as developing a certain software project, reading and writing email, working with one's Org mode system, etc.
"Suspending" an activity saves the activity's state and closes its frame/tab; the user would do this when finished with the activity's task for the time being. "Resuming" the activity restores its buffers and windows to its frame/tab; the user would do this when ready to resume the task at a later time. This saves the user from having to manually arrange the same windows and buffers each time the task is to be done.
Each activity saves two states: the default state, set when the activity is defined by the user, and the last-used state, which was how the user left it when the activity was suspended (or when Emacs exited, etc). This allows the user to resume the activity where the task was left off, while also allowing it to be reverted to the default state, providing a consistent entry point into the activity.
Internally, the Emacs ~bookmark~ library is used to save and restore buffers' states--that is, any major mode that supports the bookmark system is compatible. A buffer whose major mode does not support the bookmark system (or does not support it well enough to restore useful state) is not compatible and can't be fully restored, or perhaps not at all; but solving that is as simple as implementing bookmark support for the mode, which is often trivial.
Various hooks are (or will be--feedback is welcome) provided, both globally and per-activity, so that the user can define functions to be called when an activity is saved, restored, or switched from/to. For example, this could be used to limit the set of buffers offered for switching to within an activity, or to track the time spent in an activity.
Contents :noexport: :PROPERTIES: :TOC: :include siblings :depth 0 :force (nothing) :ignore (this) :local (nothing) :END: :CONTENTS:
[[#installation][Installation]]
[[#configuration][Configuration]]
[[#usage][Usage]]
[[#faq][FAQ]]
[[#changelog][Changelog]]
[[#development][Development]] :END:
Installation
** GNU ELPA
~activities~ may be installed into Emacs versions 29.1 or later from [[https://elpa.gnu.org/packages/activities.html][GNU ELPA]] by using the command ~M-x package-install RET activities RET~. This will install the latest stable release, which is recommended.
** Quelpa
To install directly from git (e.g. to test a pre-release version), it's recommended to use [[https://framagit.org/steckerhalter/quelpa][Quelpa]]:
(use-package activities :quelpa (activities :fetcher github :repo "alphapapa/activities.el"))
If you choose to install it otherwise, please note that the author can't offer help with manual installation problems.
This is the recommended configuration, in terms of a ~use-package~ form to be placed in the user's init file:
(use-package activities :init (activities-mode) (activities-tabs-mode) ;; Prevent `edebug' default bindings from interfering. (setq edebug-inhibit-emacs-lisp-mode-bindings t)
:bind
(("C-x C-a C-n" . activities-new)
("C-x C-a C-d" . activities-define)
("C-x C-a C-a" . activities-resume)
("C-x C-a C-s" . activities-suspend)
("C-x C-a C-k" . activities-kill)
("C-x C-a RET" . activities-switch)
("C-x C-a b" . activities-switch-buffer)
("C-x C-a g" . activities-revert)
("C-x C-a l" . activities-list)))
** Activities
For the purposes of this library, an "activity" is a window configuration and its associated buffers. When an activity is "resumed," its buffers are recreated and loaded into the window configuration, which is loaded into a frame or tab.
From the user's perspective, an "activity" should be thought of as something like, "reading my email," "working on my Emacs library," "writing my book," "working for this client," etc. The user arranges a set of windows and buffers according to what's needed, then saves it as a new activity. Later, when the user wants to return to doing that activity, the activity is "resumed," which restores the activity's last-seen state, allowing the user to pick up where the activity was left off; but the user may also revert the activity to its default state, which may be used as a kind of entry point to doing the activity in general.
** Compatibility
This library is designed to not interfere with other workflows and tools; it is intended to coexist and allow integration with them. For example, when ~activities-tabs-mode~ is enabled, non-activity-related tabs are not affected by it; and the user may close any tab using existing tab commands, regardless of whether it is associated with an activity.
** Modes
** Workflow
An example of a workflow using activities:
** Bindings
Key bindings are, as always, ultimately up to the user. However, in [[Configuration][Configuration]], we suggest a set of bindings with a simple philosophy behind them:
** Commands
/With the recommended bindings:/
** Bookmarks
When option ~activities-bookmark-store~ is enabled, an Emacs bookmark is stored when a new activity is made. This allows the command ~bookmark-jump~ (~C-x r b~) to be used to resume an activity (helping to universalize the bookmark system).
FAQ
How is this different from [[https://github.com/alphapapa/burly.el][Burly.el]] or [[https://github.com/alphapapa/bufler.el/][Bufler.el]]? :: Burly is a well-polished tool for restoring window and frame configurations, which could be considered an incubator for some of the ideas furthered here. Bufler's ~bufler-workspace~ library uses Burly to provide some similar functionality, which is at an exploratory stage. ~activities~ hopes to provide a longer-term solution more suitable for integration into Emacs.
How does this differ from "workspace" packages? :: Yes, there are many Emacs packages that provide "workspace"-like features in one way or another. To date, only Burly and Bufler seem to offer the ability to restore one across Emacs sessions, including non-file-backed buffers. As mentioned, ~activities~ is intended to be more refined and easier to use (e.g. automatically saving activities' states when ~activities-mode~ is enabled). Comparisons to other packages are left to the reader; suffice to say that ~activities~ is intended to provide what other tools haven't, in an idiomatic, intuitive way. (Feedback is welcome.)
How does this differ from the built-in ~desktop-mode~? :: As best this author can tell, ~desktop-mode~ saves and restores one set of buffers, with various options to control its behavior. It does not use ~bookmark~ internally, which prevents it from restoring non-file-backed buffers. As well, it is not intended to be used on-demand to switch between sets of buffers, windows, or frames (i.e. "activities").
"Activities" haven't seemed to pan out for KDE. Why would they in Emacs? :: KDE Plasma's Activities system requires applications that can save and restore their state through Plasma, which only (or mostly only?) KDE apps can do, limiting the usefulness of the system. However, Emacs offers a coherent environment, similar to Lisp machines of yore, and its ~bookmark~ library offers a way for any buffer's major mode to save and restore state, if implemented (which many already are).
Why did a buffer not restore correctly? :: Most likely because that buffer's major mode does not support Emacs bookmarks (which ~activities~ uses internally to save and restore buffer state). But many, if not most, major modes do; and for those that don't, implementing such support is usually trivial (and thereby benefits Emacs as a whole, not just ~activities~). So contact the major mode's maintainer and ask that ~bookmark~ support be implemented.
Why did I get an error? :: Because ~activities~ is at an early stage of development and some of these features are not simple to implement. But it's based on Burly, which has already been through much bug-fixing, so it should proceed smoothly. Please report any bugs you find.
Changelog
** v0.8-pre
Fixes
** v0.7
Additions
Changes
Fixes
** v0.6
Additions
Changes
** v0.5.1
Fixes
** v0.5
Additions
Changes
Fixes
** v0.4
Additions
Fixes
** v0.3.3
Fixes
** v0.3.2
Updated documentation, etc.
** v0.3.1
Fixes
** v0.3
Additions
** v0.2
Additions
Fixes
** v0.1.3
Fixes
** v0.1.2
Fixes
** v0.1.1
Fixes
** v0.1
Initial release.
~activities~ is developed on [[https://github.com/alphapapa/activities.el][GitHub]]. Suggestions, bug reports, and patches are welcome.
** Copyright assignment
This package is part of [[https://www.gnu.org/software/emacs/][GNU Emacs]], being distributed in [[https://elpa.gnu.org/][GNU ELPA]]. Contributions to this project must follow GNU guidelines, which means that, as with other parts of Emacs, patches of more than a few lines must be accompanied by having assigned copyright for the contribution to the FSF. Contributors who wish to do so may contact [[mailto:emacs-devel@gnu.org][emacs-devel@gnu.org]] to request the assignment form.
** Info export options
** File-local variables