Jujutsu version control mode for Emacs inspired by Magit
Emacs Lisp
129
149 commits
updated Aug 31, 2026
jj-mode provides a magit-inspired interface for Jujutsu, offering an efficient way to interact with JJ repositories from within Emacs.
(package! jj-mode :recipe (:host github :repo "bolivier/jj-mode.el"))
(use-package jj-mode
:straight (:host github :repo "bolivier/jj-mode.el"))
(use-package jj-mode
:vc (:url "https://github.com/bolivier/jj-mode.el"))
Clone this repository and add it to your load path:
(add-to-list 'load-path "/path/to/jj-mode")
(require 'jj-mode)
jj-mode doesn't ship with support for evil mode by default. To make it work you need to put this snippet in your init config
(evil-make-overriding-map jj-mode-map 'normal)
Or, in Doom Emacs
(after! jj-mode
(evil-make-overriding-map jj-mode-map 'normal))
Start with M-x jj-log to open the main interface. Each project gets its own
buffer (*jj-log:project-name*).
n/p - Navigate between sectionsRET - Context-sensitive action (edit changeset, jump to file/line in diffs). - Jump to current changeset (@)TAB - Toggle section foldingg - Refresh logc - Commit (opens message buffer)d - Describe changeset at point (opens message buffer)e - Edit changeset (jj edit)u - Undo last operations - SquashN - New changeset here
n create new changeset with optionsa create new changeset after bookmark with optionsb create new changeset before bookmark with optionsr - Rebase transient menu
s - Set rebase sourced - Toggle rebase destinationr - Execute rebasec - Clear selectionsb - Bookmark transient menu
c - Create bookmarka - Abandon bookmarkf - Forget bookmarkt - Track remote bookmarkT - Tug (jj tug)G - Git operations transient
-n - Toggle --allow-new flag-b - Set bookmark to pushp - Pushf - FetchE - Edit conflicts with ediffM - Edit conflicts with smerge-modeWhen editing commit/describe messages:
C-c C-c - Finish and executeC-c C-k - CancelM-x jj-log - Open JJ interfacej/kc - Commit current changesC-c C-c to finishr - Open rebase menu, select source with s, destinations with d, execute with rb - Manage bookmarks as neededG p - Push to remote;; Customize jj executable path if needed
(setq jj-executable "/path/to/jj")
Issues and pull requests welcome! This project aims to provide a solid JJ interface while maintaining magit-like usability patterns.
Emacs Lisp
99.2%
Jujutsu version control mode for Emacs inspired by Magit
Emacs Lisp
129
149 commits
updated Aug 31, 2026
jj-mode provides a magit-inspired interface for Jujutsu, offering an efficient way to interact with JJ repositories from within Emacs.
(package! jj-mode :recipe (:host github :repo "bolivier/jj-mode.el"))
(use-package jj-mode
:straight (:host github :repo "bolivier/jj-mode.el"))
(use-package jj-mode
:vc (:url "https://github.com/bolivier/jj-mode.el"))
Clone this repository and add it to your load path:
(add-to-list 'load-path "/path/to/jj-mode")
(require 'jj-mode)
jj-mode doesn't ship with support for evil mode by default. To make it work you need to put this snippet in your init config
(evil-make-overriding-map jj-mode-map 'normal)
Or, in Doom Emacs
(after! jj-mode
(evil-make-overriding-map jj-mode-map 'normal))
Start with M-x jj-log to open the main interface. Each project gets its own
buffer (*jj-log:project-name*).
n/p - Navigate between sectionsRET - Context-sensitive action (edit changeset, jump to file/line in diffs). - Jump to current changeset (@)TAB - Toggle section foldingg - Refresh logc - Commit (opens message buffer)d - Describe changeset at point (opens message buffer)e - Edit changeset (jj edit)u - Undo last operations - SquashN - New changeset here
n create new changeset with optionsa create new changeset after bookmark with optionsb create new changeset before bookmark with optionsr - Rebase transient menu
s - Set rebase sourced - Toggle rebase destinationr - Execute rebasec - Clear selectionsb - Bookmark transient menu
c - Create bookmarka - Abandon bookmarkf - Forget bookmarkt - Track remote bookmarkT - Tug (jj tug)G - Git operations transient
-n - Toggle --allow-new flag-b - Set bookmark to pushp - Pushf - FetchE - Edit conflicts with ediffM - Edit conflicts with smerge-modeWhen editing commit/describe messages:
C-c C-c - Finish and executeC-c C-k - CancelM-x jj-log - Open JJ interfacej/kc - Commit current changesC-c C-c to finishr - Open rebase menu, select source with s, destinations with d, execute with rb - Manage bookmarks as neededG p - Push to remote;; Customize jj executable path if needed
(setq jj-executable "/path/to/jj")
Issues and pull requests welcome! This project aims to provide a solid JJ interface while maintaining magit-like usability patterns.
Emacs Lisp
99.2%