Releases: tim-janik/jj-fzf
JJ-FZF 0.34.0
JJ-FZF 0.34.0 - 2025-10-02
Added:
-
In the last month, jj-fzf underwent a complete rewrite. The new version has
out of the box support for running jj commands with multiple revisions and
extends utilization of new jj and fzf features. -
All key binding commands now operate on a change_id or a list thereof.
-
In case of divergent commits, an fzf list entry now expands to a commit_id,
which also means pretty much all commands now handle divergent commits. -
Inject will now copy the author, timestamp and message into the new commit.
-
The oplog now combines the operation show, diff and historic log views.
-
The default set of revisions for the jj-fzf log list is now
jj-fzf.log_revset
with a fallback ofrevsets.log
(the standard jj log
revset). To use a different revset with jj-fzf, type the revset into the
query field for live revset updates. To persist the revset in the repo
config underjj-fzf.log_revset
, hit Alt-Enter. -
The default commit display template for the jj-fzf log list is now
jj-fzf.log_template
with a fallback oftemplates.log
(the standard jj
log template). In order to configure jj-fzf for one line display, use:
jj config set --user jj-fzf.log_template builtin_log_oneline
-
Alt-B now presents a dialog to create, move, delete or track bookmarks and
delete tags. The former bookmark deletion under Alt-D has been merged into
Alt-B. -
Alt-Q will now squash changes from selected revisions into the revision
under the pointer, or into the parent if no revisions are selected. -
Alt-S now starts
jj restore --interactive
and restores files from a single
selected revision into the revision under the pointer, or into the parent
if no revisions are selected. -
Ctrl-D will pre-generate a commit message for merge commits only. For normal
commit messages, usetemplates.draft_commit_description
instead. If you
depend on the messages of previous jj-fzf versions, consider the hint printed
out by:lib/draft.sh --hint
See also: https://jj-vcs.github.io/jj/latest/config/#default-description -
Ctrl-F now toggles between the fzf finder and live revset editing.
There is no key binding replacement for the old 'file-editor', just run
jj edit
orjj new
on an old commit and open the file of interest. -
Ctrl-L will now either show the history up to a single selected revision,
or for the selected (multiple) revisions only. -
Ctrl-V is the new key binding for the evolution log browser.
-
An LLM can be used to generate commit messages with the Ctrl-S key binding.
The generated message is provided tojj describe
as a config value in
template-aliases.default_commit_description
.
See the manual page for LLM configurations via environment variables. -
Sub-dialogs like rebase, reparent or even bookmarks should now retain the
commit (bookmark) pointer position. -
An optimal column-major text layout algorithm now presents the key bindings.
-
The CI now runs and validates a selected set of screencasts.
-
New -c +c -r +r -s options allow using jj-fzf as a picker for 1 or many
commits, 1 or many revisions or a revset expression.
Changed:
-
Bookmarks are now display with a simplified state that indicates:
Deleted / Conflicted / Tracked / Untracked / Local Remote -
On startup
jj-fzf
now offers revset editing in the query field.
Use Ctrl-F for the fzf filter. -
When running
jj describe
a $EDITOR wrapper is used that prevents jj
from accepting an auto-generated default description as message. -
Running a command from jj-fzf switches back from the alternative screen
and will reload the entirejj log
output before returning. This may
take longer than the async log loading in previous versions, but it
allows fzf to track and keep the current pointer position.
Fixed:
-
The man page now list key bindings for jj-fzf and all sub-commands.
-
A new configuration section in the man page describes config keys that
jj-fzf makes use of, as well as how to configure LLM usage. -
The
push
command now avoids querying if nothing changed.
Breaking:
-
The minimum supported fzf version is now 0.65.2.
-
This release requires jj-0.34.0
-
Commands missing from the rewrite:
- Alt-V: vivifydivergent - use
jj metaedit --update-change-id
- Ctrl-A: author-reset - use
jj metaedit --update-author
- Ctrl-I: diff - should be handled by Ctrl-L now
- Ctrl-V: gitk - not provided anymore
- Ctrl-W: wb-diff - toggle ±b ±w for diff
- Alt-V: vivifydivergent - use
-
A number of changes listed above could be considered breaking old
workflows. Please provide feedback in Github discussions or IRC
if you encounter regressions or miss important features.
Thanks to everyone who gave feedback regarding the rewrite and
helped to make this release happen!
Full Changelog: v0.33.0...v0.34.0
JJ-FZF 0.33.0
JJ-FZF 0.33.0 - 2025-09-11
Added:
- New preflight.sh script dedicated to dependency handling
- Added version.sh to support Github "Source code" archives
- Added self extracting jj-fzf.sfx script to release artifacts
- Added manual page jj-fzf.1.gz to release artifacts
- Added contrib/jj-foreach.sh to run shell command for each commit in a revset
- Added option to contrib/jj-foreach.sh to not affecting descendants
- Alt-J: inject selected revision as historic commit before @
- Documented F5 and F11 keybindings
Breaking:
- This release requires jj-0.33.0
- This release is the last one to support fzf 0.44.1, future release
will depend on more recent fzf versions - Upon start, fzf will now wait for
jj log
to finish before display; if this
turns out too slow for some repos, please file an issue and request --async - Instead of enforcing gsed use, preflight.sh now defines an
sed()
function
that proxiesgsed
if needed. Please file an issue if sed problems remain
Changed:
- Pushing to a remote will now also push deleted bookmarks
- Preserve history when deleting tags or bookmarks
(enforces git.abandon-unreachable-commits=false during deletion) - Added cursor down to swap-commits to follow swapped commit
- Moved preview and helper into library files (speeds up previews)
- Undo/redo operations in jj-fzf now use jj's built-in commands
- Use
jj-fzf oplog
to display the undo stack with ⋯ undo step markers - Renamed oplog and oplog-browser commands
Fixed:
- Fixed evolog preview and evolog paging (was broken since jj-0.30)
- Fixed outdated uses of
jj --config-toml
- Fixed broken Github jj-fzf links
- Fixed lacking DESTDIR for make (un)install
Removed:
- Removed unnecessary
all:
prefix in jj revset expressions - Removed unsed command / key binding for undo marker reset
Full Changelog: v0.32.0...v0.33.0
JJ-FZF 0.32.0.nightly2508160046
JJ-FZF 0.32.0.nightly2508160046
Development version - may contain bugs or compatibility issues.
.github/workflows/testing.yml: update artifact name in GitHub workflow # 2025-08-16 Tim Janik 7f2c4ec
.github/workflows/testing.yml: add build step for self-extracting jj-fzf.sfx # 2025-08-16 Tim Janik 9360e32
Makefile.mk: add Makefile rule to build self-extracting archive for jj-fzf # 2025-08-16 Tim Janik cb67fb8
This commit introduces a new Makefile rule to generate a self-extracting
archive (SFX) for jj-fzf. The SFX archive bundles the jj-fzf script with
all its installation files into a single executable shell script.
sfx.sh: add self-extracting shell script generator # 2025-08-16 Tim Janik 5f0f8bb
This commit introduces sfx.sh, a self-extracting shell script utility that
packs a binary executable and its dependencies into a single, self-contained
shell script. The script embeds a tarball containing all necessary files,
which is extracted at runtime into a temporary directory. The embedded
script then executes the packed binary from that temporary location.
Makefile.mk: add `artifacts` to `CLEANDIRS` # 2025-08-16 Tim Janik 48926a7
Full Changelog: v0.32.0...v0.32.0.nightly2508160046
JJ-FZF 0.32.0
JJ-FZF 0.32.0 - 2025-08-14
Added:
- Ctrl-W: Added way to toggle between various diff formats
- Alt+M: New multi-select mode, use TAB to select multiple commits
- Added multi-mode support for abandon, backout, duplicate, squash, rebase
- Added
make distcheck
, always check in CI - Added check for jj-fzf --help
- Added installcheck rule
- Added separate manual page
- Added file summary to oplog history
- Added scripts to automate releases
- Added contirb/suspend-with-shell.el to run jj-fzf from emacs, see:
https://testbit.eu/2025/jj-fzf-in-emacs
Breaking:
- Depend on jj-0.32.0
- Changed Alt-N to run new-after with --no-edit
- Preserve PWD in subshells if possible (present)
- Remove unused 'merging' command
Changed:
- To install, run
make all install
- To run all checks, run
make all check install installcheck
- Builds require GNU Make
- Moved version checks for all tool dependencies into Makefile
- Use /usr/bin/env to find bash
- Undeprecate Alt-S: restore-file from selected revision
- Build man page, use a man page browser for
jj-fzf --help
- Fetch version information from Git
- Automatically run CI for PRs and tags
- Introduced pandoc dependency for man builds
Fixed:
- Fixed installations not working in non-jj repos
- Fixed --version not working outside a jj repo
Full Changelog: v0.25.0...v0.32.0
JJ-FZF 0.25.0.nightly2507310040
JJ-FZF 0.25.0.nightly2507310040
Development version - may contain bugs or compatibility issues.
.github/workflows/gh-release.sh: add script to create github releases # 2025-07-31 Tim Janik a07fa3d
.github/workflows/gh-release.sh: add recent git log for prereleases
.github/workflows/gh-release.sh: script to create github releases
.github/workflows/testing.yml: fix release title
Merge branch 'distcheck-in-ci' # 2025-07-31 Tim Janik a738119
* Branch commit log:
.github/workflows/testing.yml: run CI for PRs and tags
.github/workflows/testing.yml: upload artifacts/, add CreateRelease
Makefile.mk: fix ChangeLog and tarball location
.gitignore: updates
.github/workflows/testing.yml: add distcheck to CI, upload tarball
Makefile.mk: add `make distcheck`
Makefile.mk: reorder & cleanup
.github/workflows/testing.yml: install jj and fzf in usr/local
.github/workflows/testing.yml: use sudo for make install
.github/workflows/testing.yml: install pandoc for man builds
Merge branch 'makefile-version-checks' # 2025-07-30 Tim Janik ac769d5
* Branch commit log:
tests/utils.sh: use `jj-fzf --version` as minimal test
Makefile.mk: move version checks for all needed tools into makefile
Makefile.mk: let install depend on all (build artifacts and checks)
.github/workflows/testing.yml: add installcheck to CI
Makefile.mk: give `jj-fzf --help-bindings` a .jj repo to run in
Makefile.mk: add check for jj-fzf --help
Makefile.mk: add installcheck
Merge branch 'separate-manual-page' # 2025-07-30 Tim Janik b835b32
* Branch commit log:
Makefile.mk: add clean rule
Makefile.mk: use env to run bash
jj-fzf: handle --version early on, use man for --help
Makefile.mk: build man page
doc/jj-fzf.1.md: split manual page out of jj-fzf
.gitignore: updates
Merge branch 'versioned-install' # 2025-07-30 Tim Janik 79a6448
* Branch commit log:
Makefile.mk: install version.sh next to jj-fzf, hardcode git version
jj-fzf: introduce ABSPATHSCRIPT, use version.sh
version.sh: fetch version from git unless hardcoded
Makefile.mk, GNUmakefile: rename, support via GNU make include
.gitignore: ignore temporary files
Makefile.mk: install version.sh next to jj-fzf, hardcode git version # 2025-07-30 Tim Janik 017fa98
jj-fzf: introduce ABSPATHSCRIPT, use version.sh # 2025-07-30 Tim Janik a64d16c
version.sh: fetch version from git unless hardcoded # 2025-07-30 Tim Janik 7a7f1ee
Makefile.mk, GNUmakefile: rename, support via GNU make include # 2025-07-30 Tim Janik 8863432
.gitignore: ignore temporary files # 2025-07-30 Tim Janik c7bf25b
Merge branch 'simpler-new-after-and-before' # 2025-07-30 Tim Janik 456081a
* Branch commit log:
jj-fzf: fix comment
jj-fzf: change Alt-N to run new-after
The new-before function is now available under Ctrl-Alt-N.
BREAKING: Use Alt-N Alt-X to run new-after and swap commits to it is ordered *before* the target commit.
BREAKING: The new-after and new-before are now creating new commits with --no-edit, use Ctrl-e instead.
.github/workflows/testing.yml: install jj-0.31 for CI
Merge branch 'multi-select' # 2025-07-30 Tim Janik c3e28cc
* Branch commit log:
jj-fzf: undo: allow working in multi-select mode
jj-fzf: squash-into-parent: add multi-select support
jj-fzf: rebase: add multi-select support for rebase and duplicate operations
BREAKING: The default rebase mode is now --source, use Alt-B to select --branch.
jj-fzf: backout: add multi-select support
BREAKING: The working copy is now *not* adjusted after creating the backout commit.
This mirrors the plain `jj backout` behavior.
jj-fzf: abandon: add multi-select support
jj-fzf: remove unused 'merging' command
BREAKING: Use `jj new` and `jj bookmark set trunk` instead.
jj-fzf: add multiselect support for batch operations on revisions
jj-fzf: depend on jj-0.31.0
jj-fzf: undo: allow working in multi-select mode # 2025-07-30 Tim Janik a69ea1e
jj-fzf: squash-into-parent: add multi-select support # 2025-07-30 Tim Janik 5c853fb
jj-fzf: rebase: add multi-select support for rebase and duplicate operations # 2025-07-30 Tim Janik 9e617a3
BREAKING: The default rebase mode is now --source, use Alt-B to select --branch.
jj-fzf: backout: add multi-select support # 2025-07-30 Tim Janik e9ccb89
BREAKING: The working copy is now *not* adjusted after creating the backout commit.
This mirrors the plain `jj backout` behavior.
jj-fzf: abandon: add multi-select support # 2025-07-30 Tim Janik bad8dae
jj-fzf: remove unused 'merging' command # 2025-07-30 Tim Janik 8004d9c
BREAKING: Use `jj new` and `jj bookmark set trunk` instead.
jj-fzf: add multiselect support for batch operations on revisions # 2025-07-30 Tim Janik 2d30f54
jj-fzf: depend on jj-0.31.0 # 2025-07-30 Tim Janik 85e64d4
Merge branch 'oplog-file-summary' # 2025-07-04 Tim Janik 74e16eb
* Branch commit log:
jj-fzf: add file summary to oplog history
.gitignore: ignore .x*
Merge branch 'preserve-pwd' # 2025-05-28 Tim Janik 7aacc56
* Branch commit log:
jj-fzf: preserve PWD in subshells if possible
.gitignore: updates
Merge branch 'suspend-with-shell-for-jj-fzf' # 2025-01-30 Tim Janik 501a936
* Branch commit log:
README.md: describe contirb/suspend-with-shell.el
contrib/suspend-with-shell.el: use (suspend-emacs) to run a custom command
This works without use of `ioctl(TIOCSTI)` that (suspend-emacs) relies on
Merge branch 'ctrl-w-diff-formats' # 2025-01-30 Tim Janik 57cf5eb
* Branch commit log:
jj-fzf: add Ctrl-W to toggle between various diff formats
* Use git-diff to implement --git and --word-diff, because it produces diffs with hunk-header
* Move temp_dir() which might be required for previews now
* Use $SILENTEXECS for execute-silent
jj-fzf: get rid of $JJFZF_ATOP uses
jj-fzf: Alt-S: restore-file from selected revision or working copy
Full Changelog: v0.25.0...v0.25.0.nightly2507310040
0.25.0
JJ-FZF 0.25.0 - 2025-01-23
Added:
- Fzflog: use jjlog unless jj-fzf.fzflog-depth adds bookmark ancestry
- Use author.email().local(), required by jj-0.25
- Absorb: unconditionally support absorb
- Evolog: add Alt-J to inject a historic commit
- Evolog: add Enter to browse detailed evolution with patches
- Add Ctrl-T evolog dialog with detailed preview
- Add content-diff to jj describe
- Add ui.default-description to commit messages
- Display 'private' as a flag in preview
- Add jj-am.sh to apply several patches in email format
- Add jj-undirty.el, an elisp hook to auto-snapshot after saving emacs buffers
Changed:
- Always cd to repo root, so $PWD doesn't vanish
- Adjust Makefile to work with macOS, #6
- Merging: prefer (master|main|trunk) as UPSTREAM
- Make sure to use gsed
- Check-gsed: show line numbers
- Echo_commit_msg: strip leading newline from ui.default-description
- Flags: display hidden, divergent, conflict
- Cut off the preview after a few thausand lines
- Split-files: try using
jj diff
instead ofgit diff-tree
- Use JJ_EDITOR to really override th JJ editor settings
- Honor the JJ_EDITOR precedence
- Show content diff when editing commit message
- Adjust Bookmark, Commit, Change ID descriptions
- Display 'immutable' as a flag in preview
- Fzflog: silence deprecation warnings on stderr
- Include fzflog error messages in fzf input if any
- Unset FZF_DEFAULT_COMMAND in subshells
Fixed:
- Fix RESTORE-FILE title
- Properly parse options --help, --key-bindings, --color=always
- Echo_commit_msg: skip signoff if no files changed
Deprecation:
- Deprecate Alt-S for restore-file
- Deprecate Ctrl-V for gitk
Breaking:
- Depend on jj-0.25.0
- Op-log: use Alt-J to inject an old working copy as historic commit
- Alt-Z: subshells will always execute in the repository root dir
Full Changelog: v0.24.0...v0.25.0
Contributors
Thanks to everyone who made this release happen!
- Tim Janik (@tim-janik)
- Douglas Stephen (@dljsjr) - first contribution in #6
jj-fzf 0.24.0
JJ-FZF 0.24.0
Added:
- Added Alt-O: Absorb content diff into mutable ancestors
- Added
jj op show -p
as default op log preview (indicates absorbed changes) - Added marker based multi-step undo which improved robustness
- Op-log: Added restore (Alt-R), undo memory reset (Alt-K) and op-diff (Ctrl-D)
- Added RFC-1459 based simple message IRC bot for CI notifications
- Added checks for shellcheck-errors to CI
- Creating a Merge commit can now automatically rebase (Alt-R) other work
- Added duplicate (Alt-D) support to rebase (including descendants)
- Added auto-completion support to bookmarks set/move (Alt-B)
- Reparenting: added Alt-P to simplify-parents after
jj rebase
- Implemented faster op log preview handling
- New config
jj-fzf.fzflog-depth
to increasefzflog
depth - Ctrl-I: add diff browser between selected revision and working copy
- F5: trigger a reload (shows concurrent jj repo changes)
- Support rebase with --ignore-immutable via Alt-I
- Implement adaptive key binding display (Alt-H)
- Ctrl-H: show extended jj-fzf help via pager
- Broadened divergent commit support: squash-into-parent, describe, log
- Started adding unit tests and automated unit testing in CI
- Introduced Makefile with rules to check, install, uninstall
Breaking:
- Depend on jj-0.24.0 and require fzf-0.43.0
- Removed Alt-U for
jj duplicate
, use rebase instead: Alt-R Alt-D - Assert that bash supports interactive mode with readline editing
- Check-deps: check dependencies before installing
- Rebase: rename rebasing to
jj-fzf rebase
- Rebase: apply simplify-parents to the rebased revision only
- Rename 'edit' (from 'edit-workspace')
- Rename revset-assign → revset-filter
- Op-log: Ctrl-S: Preview "@" at a specific operation via
jj show @
(formerly Ctrl-D) - If you are significantly affected by an item in the breaking changes list,
please provide feedback, e.g. via IRC, email, Github issues or discussions.
Changed:
- Avoid JJ_CONFIG overrides in all places
- Support ui.editor, ui.diff-editor and other settings
- Squash-into-parent: use
jj new -A
to preserve change_id - Jump to first when reparenting and after rebase
- Ctrl-P: jj git fetch default remote, not all
- Support deletion of conflicted bookmarks
- Line Blame: skip signoff and empty lines
Fixed:
- Avoid slowdowns during startup
- Fixed some cases of undesired snapshotting
- Lots of fixes and improvements to allow automated testing
- Minor renames to make shellcheck happy
- Log: Ctrl-L: fix missing patch output
- Ensure
jj log
view change_id width matches jj log default width
See also jj-fzf --help
or the wiki page jj-fzf-help for detailed descriptions.
Full Changelog: v0.23.0...v0.24.0
v0.23.0
JJ-FZF 0.23.0
Development version - may contain bugs or compatibility issues.
Breaking:
- Depend on jj-0.23.0
- Remove experimental line-history command
Added:
- Support 'gsed' as GNU sed binary name
- Support line blame via: jj-fzf +
- Support '--version' to print version
- Define revset
jjlog
to matchjj log
- Define revset
fzflog
asjjlog
+ tags + bookmarks - Display
jj log -r fzflog
revset by default - Store log revset in --repo
jj-fzf.revsets.log
- Ctrl-R: reload log with new revset from query string
Changed:
- Require 'gawk' as GNU awk binary
- Ctrl-Z: use user's $SHELL to execute a subshell
- Shorten preview diffs with --ignore-all-space
- Show error with delay after failing jj commands
- Restore-file: operate on root relative file names
- Split-files: operate on root relative file names
- Fallback to @ if commands are called without a revision
- Allow user's jj config to take effect in log display
- Unset JJ_CONFIG in Ctrl+Z subshell
- Rebase: Alt-P: toggle simplify-parents (off by default)
- Reduce uses of JJ_CONFIG (overrides user configs)
Fixed:
- Split-files: use Git diff-tree for a robust file list
- Ensure that internal sub-shell is bash to call functions, #1
- Clear out tags in screencast test repo
- Various smaller bug fixes
- Add missing --ignore-working-copy in some places
- Fix git_head() expression for jj-0.23.0
Removed:
- Remove unused color definitions
- Skip explicit jj git import/export statements
- Skip remove-parent in screencast, use simplify-parents
Contributors
Thanks to everyone who made this release happen!
- Török Edwin (@edwintorok)
- Tim Janik (@tim-janik)
v0.22.0
Full Changelog: v0.0.0...v0.22.0
First project release, depending on jj-0.22.0, including the following commands:
- Alt-A: abandon
- Alt-B: bookmark
- Alt-C: commit
- Alt-D: delete-refs
- Alt-E: diffedit
- Alt-F: split-files
- Alt-I: split-interactive
- Alt-K: backout
- Alt-L: line-history
- Alt-M: merging
- Alt-N: new-before
- Alt-P: reparenting
- Alt-Q: squash-into-parent
- Alt-R: rebasing
- Alt-S: restore-file
- Alt-T: tag
- Alt-U: duplicate
- Alt-V: vivifydivergent
- Alt-W: squash-@-into
- Alt-X: swap-commits
- Alt-Z: undo
- Ctrl-↑: preview-up
- Ctrl-↓: preview-down
- Ctrl-A: author-reset
- Ctrl-D: describe
- Ctrl-E: edit-workspace
- Ctrl-F: file-editor
- Ctrl-H: help
- Ctrl-L: log
- Ctrl-N: new
- Ctrl-O: op-log
- Ctrl-P: push-remote
- Ctrl-T: toggle-evolog
- Ctrl-U: clear-filter
- Ctrl-V: gitk
See jj-fzf --help
or the wiki page jj-fzf-help for detailed descriptions.