Efficient Multi-Project Hacking in Emacs

News

  • I got a new keyboard!

Working with multiple project in Emacs

Today I want to try and come up with a workflow for efficiently hacking in multiple projects at the same time in Emacs.

  • Running project commands, both with project-compile and project(-async)-shell-command
  • Finding files and directories in the project
  • Searching across the project with grep/rg
  • Looking at open project buffers with ibuffer (project-list-buffers)
  • Possibly using direnv or dir-local configurations

… and more!

What is the ideal workflow for multiple projects

  • No need for multiple tabs or frames
  • Really easy to jump between projects, especially to specific files
  • Easy to switch between buffers for the same project

Customizations

(defun my/project-compilation-buffer-name-function (name-of-mode)
  (format "*compilation: %s*" (project-name (project-current))))

;; Customize compilation buffer names using the project name
(setq project-compilation-buffer-name-function #'my/project-compilation-buffer-name-function)

(defun my/project-switch-to-buffer (&optional all-buffers)
  (interactive "P")
  (if (or (not (project-current))
          all-buffers)
      (call-interactively #'switch-to-buffer)
    (call-interactively #'project-switch-to-buffer)))

;; Use our custom buffer switching function
(keymap-global-set "C-x b" #'my/project-switch-to-buffer)

;; Allow all keymap keys to be used when switching project
(setq project-switch-use-entire-map t)

To automatically index all projects under a folder path:

(project-remember-projects-under "~/Projects/Code" t)

The default keymap for project.el

Key Binding

c-x p C-b project-list-buffers C-x p ! project-shell-command C-x p & project-async-shell-command C-x p D project-dired C-x p F project-or-external-find-file C-x p G project-or-external-find-regexp C-x p b project-switch-to-buffer C-x p c project-compile C-x p d project-find-dir C-x p e project-eshell C-x p f project-find-file C-x p g project-find-regexp C-x p k project-kill-buffers C-x p o project-any-command C-x p p project-switch-project C-x p r project-query-replace-regexp C-x p s project-shell C-x p v project-vc-dir C-x p x project-execute-extended-command

Other Packages

Subscribe to the System Crafters Newsletter!
Stay up to date with the latest System Crafters news and updates! Read the Newsletter page for more information.
Name (optional)
Email Address