GNU-devel ELPA - disproject

disproject Atom Feed

Description
Dispatch project commands with Transient
Latest
disproject-2.2.0.0.20260114.143840.tar (.sig), 2026-Jan-14, 340 KiB
Maintainer
Alvin Hsu <aurtzy@gmail.com>
Website
https://github.com/aurtzy/disproject
Browse ELPA's repository
CGit or Gitweb
Badge
Manual
disproject

To install this package from Emacs, use package-install or list-packages.

Full description

1. Disproject

Disproject is a GNU Emacs package that implements Transient menus for managing and interacting with project files. It aims to provide a featureful, yet extensible interface from which users can intuitively dispatch commands on projects.

Some of its notable features include:

  • a main menu with access to many of the built-in project library's commands and other project-aware commands;
  • auto-detection of current project as the default project to act on from the menu;
  • options for switching to other projects from the menu in order to execute commands elsewhere;
  • a menu for finding common "special" project files, like the dir-locals file;
  • a menu for custom project-local suffix commands;
  • and display-buffer override options, to control where commands should display buffers to.

An Info manual is included with this program under the name disproject, which can also be viewed in the Org format at doc/disproject.html.

This package was inspired by the project-switch-project command, from the built-in project library. Users may also draw similarities to the Projectile library's projectile-commander.

disproject-dispatch.png

See images for more screenshots of Disproject menus.

1.1. Installation

disproject-badge.svg disproject-badge.svg latest-version.svg

1.1.1. MELPA

Disproject is available in MELPA and MELPA Stable. See Getting Started instructions for using MELPA.

1.1.2. Guix

Disproject is also available as a GNU Guix package.

The stable version can be found in the (gnu packages emacs-xyz) module under the name emacs-disproject. It may be installed in the user profile like so:

guix install emacs-disproject

Alternatively, one may use the package definition in ./guix.scm to install a development version of Disproject from the repository. For example, to install in the user profile, run the following in this repository's root directory:

guix package --install-from-file=guix.scm

1.2. Usage

Disproject is usable out of the box. After it is loaded, the only command that needs to be known is disproject-dispatch, which opens a transient interface - referred to as the "main menu" - with access to a collection of commands that the user can choose from to execute on projects.

The following configuration is a suggested minimal setup that can be added to the user's init file:

(use-package disproject
  ;; Replace `project-prefix-map' with `disproject-dispatch'.
  :bind ( :map ctl-x-map
          ("p" . disproject-dispatch)))

See the manual for more information on using and configuring Disproject.

News

# -*- mode: org -*-

* Changelog

** Unreleased

** [[https://github.com/aurtzy/disproject/tree/v2.2.0][2.2.0]] - 2025-10-03

This version introduces two new (customizable) menus: one for selecting
~display-buffer~ overrides to apply to suffix commands, and another for finding
common project files, dubbed "special files".

An Info user manual has also been written to provide documentation on using and
customizing Disproject, and should now be distributed with this package.

*** Added

- Add ~disproject-display-buffer-action-suffix~ class and
  ~disproject-display-buffer-action-set~ suffix command.  These facilities
  provide a means of generating suffix commands that set ~display-buffer~ action
  overrides.
- Add ~disproject-display-buffer-action-dispatch~ prefix command, bound to =,=
  in the main menu.  This provides a new menu with some out-of-the-box commands
  (implemented with ~disproject-display-buffer-action-set~) for managing the
  ~display-buffer~ override.  Replaces transient switch =--prefer-other-window=,
  although the other-window override is set to =o= to preserve the =,o= key
  sequence.
- Add ~disproject-find-special-file-suffix~ class and
  ~disproject-find-special-file~ suffix command, which provide a means of
  creating suffixes that find "special files" in projects.
- Add ~disproject-find-dir-locals-file~ and ~disproject-find-dir-locals-2-file~
  suffix commands, bound to =l= and =L= (respectively) in
  ~disproject-find-special-file-dispatch~.  These supersede
  ~disproject-dir-locals~.
- Add ~disproject-find-special-file-dispatch~ prefix, bound to =l= in the main
  menu (replacing ~disproject-dir-locals~).
- Add ~disproject-find-special-file-suffixes~ variable for customizing
  ~disproject-find-special-file-dispatch~.  By default, it includes suffixes for
  finding dir-locals files and a transient switch that enables using
  ~customize-dirlocals~ (added in Emacs 30.1) to open them with the Customize
  interface ([[https://github.com/aurtzy/disproject/issues/10][#10]]).
- Add ~disproject-global-header-group~ transient group, which inserts the
  selected-project header and "Global options" section.
- Include ~disproject-global-header-group~ in ~disproject-custom-dispatch~ and
  ~disproject-find-special-file-dispatch~.  This makes the "Global options"
  section available in these menus.
- Add a user manual.

*** Changed

- Bump transient dependency version to 0.9.2.
- Force-enable ~switch-to-buffer-obey-display-actions~ when a ~display-buffer~
  override is set.
- Set =transient= slot to t for ~disproject-switch-project*~ commands in suffix
  definitions.
- Rename ~disproject-find-line~ description "line occurrence" to "line in
  buffers".
- Show ~disproject-magit-todos-list~ if the magit-todos library is available, as
  opposed to only showing it when the library is loaded.  This permits using the
  command as an autoload.
- Set advice slots for relevant transient groups to ~disproject-with-env-apply~.
  This makes it no longer necessary to use project environment functions for
  project-aware commands when adding to those transient groups.
- Rename ~disproject-commands~ customization group to
  ~disproject-swappable-commands~.
- Set the last transient group class for ~disproject-dispatch~ to
  ~transient-row~.

*** Deprecated

- Deprecate ~disproject-scope-prefer-other-window?~ method.
- Deprecate ~disproject-dir-locals~.

** [[https://github.com/aurtzy/disproject/tree/v2.1.0][2.1.0]] - 2025-05-29

In addition to a few new commands, +this version notably adds support for
Transient version 0.9.0++ (the breaking change was found to be [[https://github.com/magit/transient/discussions/389][an unintentional
bug]]).

*** Added

- Re-add note about reserved keys in ~disproject-custom-suffixes~ documentation,
  which was accidentally removed.  The reserved keys are still the same as
  before.
- Add ~disproject-query-replace-regexp~ suffix command, bound to =r= in main
  menu ([[https://github.com/aurtzy/disproject/pull/7][#7]]).
...
...