Releases: idursun/jjui
v0.9.3
What's Changed
- feat: squash files from details view by @Jollywatt in #283
Bug Fixes
- ace_jump: Selection logic improved to fix navigation issues #285
- megamerge: Changed revision removal order to ensure correct rebasing #291
- megamerge: Descendant commits now preserved during merge operations #289
- details: Escaped file names to prevent errors in the details view #290
- revisions: Shortcuts disabled when no revisions are present to prevent crashes #286
- inline_describe: Single row log graphs now display correctly #280
Full Changelog: v0.9.2...v0.9.3
v0.9.2
Mostly a maintenance release, but adds a new operation for supporting megamerge users.
Pressing M
will start the mega merge operation, in which you can use space
to add/remove parents.
Bug fixes
- Make sure that the selected revision stays selected after refreshes
- Fixed a bug in
jj shell/exec
so that commands always run inside the repository directory.
What's Changed
- fix(fuzzy_file): Prevent crash if current revset is invalid. by @vic in #265
- feat(fuzzy_input): More intuitive movement on history and different suggestions modes. by @vic in #254
- fix(leader): Use tea.Sequence instead of our custom cmd sequencing. by @vic in #268
- $checked_commit_ids expands to none() without checked commit by @glehmann in #271
Full Changelog: v0.9.1...v0.9.2
v0.9.1
This was supposed to be a maintenance release but it is packed with new features thanks to all the contributors!
Phew, another release which was supposed to be a minor maintenance release but to be honest, I didn't much other than implementing flash messages and lane tracing.
All the remaining features are implemented by contributors: @vic @zerowidth @penryu Thanks!
New Features
🎉 Flash messages
jjui
now shows the output of the commands as flash messages. Success messages disappear after 4 seconds, and failure messages stay sticky and can be dismissed with esc
.
🎉 Fuzzy file search
Pressing ctrl+t
opens up the fuzzy file search. Choosing one file from the list will change the revset to show all changes made to that file. #203
Additionally, when the fuzzy file search is open, you can use ctrl+t
again to turn on preview mode to see the contents of the file and the changes made to the file.
🎉 Ace jump
Similar to how vim's ace jump works, pressing f
will highlight the first character of each change id (only non-hidden, non-conflicting, and non-root) or each commit id and typing the letters until an unambigous revision is found will jump the cursor to that revision.
🎉 (experimental) Lane tracing
This is an experimental feature and currently disabled by default, but you can enable it with the following configuration:
[ui.tracer]
enabled = true
When tracing is enabled, lanes that the currently selected revision in are highlighted and out of lane revisions are fainted.
🎉 Restore from evolog
While in the evolog view, you can now press r
to restore the selected evolog into the target revision you select.
The operation will run equivalent of the following command:
jj restore --from <selected evolog commit id> --into <selected target revision change id> --restore-descendants
As a result of this new functionality, evolog key bindings turned into a table with the following defaults:
[keys.evolog]
mode = ["v"]
diff = ["d"]
restore = ["r"]
🎉 Preview window at the bottom of the UI
Pressing shift+p
will move the preview window to the bottom of the screen. This can be made the default position with the following configuration:
[ui.preview]
show_at_bottom = true
🎉 Force apply
Performing an operation on an immutable revision returned an error in jjui
. Now you can use alt+enter
to force the command to ignore immutable revisions. (i.e. add --ignore-immutable
argument)
Default key binding configuration is like the following:
[keys]
force_apply = ["alt+enter"]
🎉 Log batching
Log batching will only load the first 50 revisions and load the next chunk if you scroll past the 50th revision. Previously, jjui
loaded the whole logs before it displayed the revisions. This new method should reduce the start up times greatly if you are working with large repositories. It almost has no effect if you are working with small repositories.
This has been an experimental feature for a while, turned off by default, behind the experimental_log_batching_enabled
configuration option.
In this release it is turned on by default, but the configuration location has been moved to the following and you can still turn it off if you like:
[revisions]
log_batching = false
Minor Changes
Light and Dark theme syntax
Theme configuration now allows choosing different themes for light and dark themes.
[ui.theme]
light = "my-light-theme"
dark = "my-dark-theme"
Previous syntax is still supported, which will set light
and dark
to be the same value.
[ui]
theme = "my-theme"
Conflict markers in details view
Details view now show conflict
markers next to the conflicted files.
Make default log format and revset configurable
jjui
reads and uses the default revset and the log format as they are configured in jj.
You can now override these values with the following configuration:
[revisions]
template = 'builtin_log_compact' # overrides jj's templates.log
revset = "" # overrides jj's revsets.log
Confirmation dialogs show menu option shortcuts in the status bar
Previously, you needed to know pressing y
for yes and n
for no. These shortcuts now are displayed in the status bar.
New placeholders for commands
The following new place holders are added:
$commit_id
$checked_commit_ids
$checked_files
Stats
70 files changed with 4,120 additions and 841 deletions, in 90 commits by 4 contributors.
What's Changed
- fix(details): Quote file paths when changing revset from details. by @vic in #204
- feat: add command outputs as (auto-expiring) flash messages by @idursun in #206
- feat(loader): Support JJUI_CONFIG_DIR environment var. by @vic in #207
- feat(fuzzy_files): add ctrl+t fuzzy-file search. by @vic in #203
- Dark and light theme support by @zerowidth in #201
- feat(exec): add fuzzy search on command history by @vic in #210
- Add github issue templates. by @vic in #213
- feat(details): show conflicted files by @idursun in #215
- feat(docs): Deploy to gh-pages. by @vic in #214
- enhance fuzzy-file live preview. add contextual help and open file in editor by @vic in #220
- fix(find_file): Make keys customizable on jjui config. by @vic in #224
- fix(commands): don't create snapshots when only querying current state. by @vic in #225
- feat(revisions): Ace jump to revision.
f
key on revisions view. by @vic in #226 - fix(preview): Limit preview resize to range 5% up to 95%. by @vic in #234
- feat(commands): Add
$commit_id
context placeholder. by @vic in #233 - feat(revisions): Move to revision parent when toggle selection. by @vic in #232
- fix(ace_jump): Correctly handle highligting for ambigous change_ids. by @vic in #231
- fix(ace_jump): Allow jump only to revisions visible on screen by @vic in #230
- feat(preview): Allow showing preview at bottom (config and toggle-key) by @vic in #238
- fix(preview): Add
P
to help menu. by @vic in #239 - chore(issue_template): Add implementation proposal template. by @vic in #242
- fix(jj_exec): Tab key must only accept-suggestion if there are matches. by @vic in #245
- feat(evolog): Restore descendants from selected evolog revision. by @vic in #236
- feat(placeholders): Add $checked_files and $checked_commit_ids. by @vic in #246
- feat(revert): Revert operation (
R
) with interactive target selection by @vic in #247 - feat: make log format and revset configurable by @penryu in #252
- feat(force_apply): keybinds for using --ignore-immutabe. by @vic in #255
- feat(confirmation): Show key-bindings on confirmation dialog. by @vic in #256
New Contributors
- @zerowidth made their first contribution in #201
- @penryu made their first contribution in #252
Full Changelog: v0.9.0...v0.9.1
v0.9.0
Breaking changes
💥 preview.extra_args
configuration option is removed in favour of preview commands (see below).
This change allows far more customisation opportunities than what extra_args
offered.
💥 ui.highlight_dark
and ui.highlight_light
configuration options are removed
These have been replaced by the new theming system for more granular control over the UI's appearance.
Migration: You can now set "selected" = { bg = "your colour" }
under [ui.colors] table in your config.toml or by creating a custom theme. See the new "Theme Support" feature below for details.
New Features
🎉 Theme support
You now have granular control over the application's appearance with a new theming system.
- Load Custom Themes: Create your own .toml theme files and enable them with the ui.theme setting in your config.
- Easy Overrides: Quickly tweak any colour from your loaded theme directly in your main config.toml under the [ui.colors] section.
- Detailed Styling: Themes use selectors to target specific UI elements (like selected, border, or revisions title), allowing you to customise everything from text colours and styles to backgrounds.
Selected revision styled with italic and underline:
A complete theme example:
Read Themes page in the wiki for detailed information.
See discussion.
🎉 Leader key support
This release introduces a "Leader key" feature, inspired by Vim's <Leader>
and Emacs' hydra
. It acts as a prefix key (default: \
) to navigate a tree of custom, mnemonic keymaps for your personal workflows.
- Create Custom Shortcuts: Define key sequences in your
config.toml
under the[leader]
table to execute any action possible in the UI. - Nested & Context-Aware: Keymaps can be nested (e.g.,
\na
for "new after") and can be configured to appear only in specific contexts, such as when a revision is selected. - How it works: Press the leader key (
\
), then navigate the help menu with single-character key presses to trigger your custom command sequences.
This allows for powerful, user-defined workflows, such as editing a file from a specific revision or saving the current revset as an alias, directly from the UI.
Read Leader-Key page in the wiki for detailed information
🎉 Execute shell and jj
commands directly from jjui
You can now execute jj and shell commands directly from the TUI.
:
Run interactive jj commands.jjui
will suspend, and the command will run directly in your terminal (e.g.,: restore -i
). You will return tojjui
when the command finishes.$
Run any shell command without leaving jjui. (e.g., $ man jj or $ htop)
Context-aware placeholders like $file
and $change_id
are supported in your commands.
🎉 Inline describe
You can now edit the description of a revision by pressing enter
. This will load the description into an inline editor. You can accept the changes by pressing alt+enter
or ctrl+S
.
🎉 New shortcuts for menu items
You can now press the assigned shortcut to invoke an item in git, bookmarks and custom commands menus.
For example:
bmm
: will choose and invoke bookmarks move 'main'gpa
: will choosegit push --all
gpc
: will choosegit push --change
- etc
🎉 Interactive jj duplicate
You can now duplicate one or more revisions directly from the UI.
- Select the revision(s) you want to copy and press
y
(the default key) to enter "duplicate mode". - Choose a Destination: Navigate to the target revision where you want to place the copy.
- Fine-tune Placement: The UI provides a live preview of the operation. Use sub-keys to control the exact placement:
a
: Place the copy after the target revision.b
: Place the copy before the target revision.d
: Place the copy onto the target revision (i.e.,--destination
).
- Confirm: Press
Enter
to execute the command.
Minor Changes
Introduced preview commands per item type
You can now define separate commands to show the contents of the selected item in the preview window.
The following are the default commands.
[preview]
revision_command = ["show", "--color", "always", "-r", "$change_id"]
oplog_command = ["op", "show", "$operation_id", "--color", "always"]
file_command = ["diff", "--color", "always", "-r", "$change_id", "$file"]
For example; I changed oplog_command
to the following to see the tree at the selected op log entry.
[preview]
oplog_command = ["log", "--at-operation", "$operation_id", "--color", "always"]
Improvements to custom commands
- Custom commands can now change the revset. For example, the following custom command will filter the view to only show descendants of the selected revision.
[custom_commands]
"show after revisions" = { key = ["M"], revset = "::$change_id" }
- You can now use
$revset
place holder in your custom commands. Previously it was limited to$change_id
,$operation_id
and$file
.
New CLI argument
- Added support for
--period
or-p
can be passed to override theauto_refresh_interval
configuration. This can be handy when working with large repositories. (e.g.jjui --period 30
) #148 - Added support for
--limit
argument which is the equivalent ofjj log --limit
.
New items in the git menu
- Added
git push --change
Set bookmark
B
will now auto complete the movable bookmarks when typing. This change makes it easy if you want to move a bookmark just by typing the name of it.
Details view
- Details view stays open after restore or absorb command is applied.
K
jumps to child revision
Similar to the J
(jump to parent), now you can use K
to move the child revision.
Fixes
- Fixed: File names with spaces or back slashes caused errors on Windows. #164
- Fixed: Diff view was not showing the output of files that had CRLF line endings.
- Fixed:
J
movement was not working if the change id's were upper case.
What's Changed
- go mod tidy & go fmt by @ilyagr in #161
- ci: run
go fmt
andgo mod tidy
in CI by @ilyagr in #162 - feat: add --period/-p CLI option by @ilyagr in #165
- feat(git): add UI and test support for 'git push --change ' by @vic in #171
- feat: Inline description editor by @idursun in #174
- feat(leader): add Leader (vim/spacemacs) like commands. by @vic in #179
- add predefined shortcuts to certain menu items in git, bookmarks and custom commands by @idursun in #180
- feat: custom styling by @idursun in #183
- feat(exec): Exec key
:
one-shot interactive jj commands. by @vic in #182 - fix(exec_shell): Dont replace context values but set env. by @vic in #186
- test: fix flaky test by @idursun in #185
- Style revisions, evolog and oplog by @idursun in #189
- feat(leader): Allow leader entries to specify context requirements. by @vic in #190
- fix(revisions): Using
J
should work on uppercase templated change_id by @vic in #193 - Use os.Getwd for getting the current dir by @ilyagr in #196
- feat(status): Add editing history according to input mode. by @vic in #197
- feat(revisions): K jumps to revision first child. by @vic in #199
Full Changelog: v0.8.12...v0.9.0
v0.8.12
What's Changed
Improvements
Revset
- Completions show on the second line as a list now. You can use
tab
/shift+tab
to cycle forward/backward. - Loads and adds
revset-aliases
defined in your jj config to the list of completions. - Keeps the history. You can use
up
/down
to cycle through revset history. History is only available during the session. (i.e. it's not persisted)
Squash
Got two new modifiers:
- You can use
e
for keeping the source revision empty (--keep-emptied
) - You can use
i
for running the squash operation in interactive mode (--interactive
) - Squash key configuration has changed:
[keys.squash] mode = ["S"] keep_emptied = ["e"] interactive = ["i"]
Rebase
Revisions to be moved are marked with move
marker, and get updated according to the target. (i.e. branch/source will mark all revisions to be moved according to the target)
Minor
- Details: Added absorb option to absorb changes in the selected files.
- Help window is updated to have 3-columns now.
- Changed auto refresh to proceed only when there's an actual change.
- JJ's colour palette is loaded from jj config at start up and applied to change_id, rest, diff renamed, diff modified, diff removed. This is the first step towards implementing colour themes for
jjui
.
Fixes
- Revisions view don't get stuck in
loading
state when the revset don't return any results. - Selections should be kept as is across auto refreshes.
- Fixed various issues about bookmark management where delete bookmark menu items were not shown, and track/untrack items were shown incorrectly under certain circumstances #155 #156
- Double width characters should not cause visual glitches #138
- Fixed visual glitches when extending graph lines to accommodate graph overlays
Contributions
- gitignore: add
result
fornix build .
by @ilyagr in #133 - CI and Nix: make
nix flake check
build the flake by @ilyagr in #132 - build(nix): add git version to --version by @teto in #150
- doc: Remove a duplicated maintainer mention by @Adda0 in #153
- build(nix): allow building flake when
self.dirtyRev
is not defined by @ilyagr in #152 - fixed display of empty revsets (#151) by @Gogopex in #154
- fix: refresh SelectedFile on ToggleSelect by @IvanVergiliev in #158
New Contributors
- @teto made their first contribution in #150
- @Gogopex made their first contribution in #154
- @IvanVergiliev made their first contribution in #158
Full Changelog: v0.8.11...v0.8.12
v0.8.11
- 🎉 Added support for handling selected revisions (
space
) to rebase. For example, you can select one revision from each branch and get into rebase mode, set the source to be branch (b
), and then move the cursor tomain
, hitenter
. This will move all branches onto main. - 🎉 Added support for handling selected revisions to
squash
. Select multiple revisions and start squash (S
) and move the cursor to the destination revisions and hit enter. This will squash all selected revisions into the destination revision. - Fixed visual glitch when the revision messages included CJK encoding. #130
- Allow
quit
to be bound to the same key withcancel
. #127 #116 - Updated colours of git, bookmarks, custom commands windows to use Magenta. Previously these windows used bubbletea's default colour palette, which happened to use a shade of magenta as well. This is the first step for simplifying the colour palette of
jjui
. - Fixed a bug where
jjui --config
failed to start if the configuration file was missing.
What's Changed
- Fixup build command from ebfae40 by @ilyagr in #120
- Fixup build command from ebfae40 once more by @ilyagr in #123
- Allow selecting multiple revisions during
rebase
andsquash
by @idursun in #124 - Build/update dependencies by @idursun in #126
Full Changelog: v0.8.10...v0.8.11
v0.8.10
What's Changed
- docs: add Homebrew as an installation method by @lvignoli in #84
- Update instruction on installation for archlinux-based linux distros by @TeddyHuang-00 in #85
- feat: support
~/.config
and$XDG_CONFIG_HOME
on macOS by @PrayagS in #86 - Automatically add
--allow-new
argument to new local bookmarks by @idursun in #88 - fix(revisions): set selected item on refresh by @idursun in #103
- fix: snapshot working copy less often by @Jollywatt in #96
- fix: highlight background colour seq calculation by @idursun in #106
- fix: add
--remote
argument to bookmarks with multiple remotes by @idursun in #107 - perf: make the preview pane more responsive when switching commit by @glehmann in #108
- Add compilation instructions and add
/jjui
to.gitignore
by @ilyagr in #112 - Abandon command passes
--retain-bookmarks
by default - New key binding:
@
jumps to working copy revision #111 - New key binding:
J
jump to parent of the currently selected revision - New key binding:
ctrl+z
suspendsjjui
and returns to terminal. Typingfg
should resume it. jjui
won't start and print an error message if the configuration file is malformed #114- When typing a bookmark name, spaces will be automatically replaced with
-
and the input box will expand if it exceeds the initial size. - Git: git push commands will be repeated per remote and
--remote
argument is always displayed.
New Contributors
- @TeddyHuang-00 made their first contribution in #85
- @PrayagS made their first contribution in #86
- @Jollywatt made their first contribution in #96
- @glehmann made their first contribution in #108
- @ilyagr made their first contribution in #112
Full Changelog: v0.8.8...v0.8.10
v0.8.9
What's Changed
- docs: add Homebrew as an installation method by @lvignoli in #84
- Update instruction on installation for archlinux-based linux distros by @TeddyHuang-00 in #85
- feat: support
~/.config
and$XDG_CONFIG_HOME
on macOS by @PrayagS in #86 - Automatically add
--allow-new
argument to new local bookmarks by @idursun in #88 - fix(revisions): set selected item on refresh by @idursun in #103
- fix: snapshot working copy less often by @Jollywatt in #96
- fix: highlight background colour seq calculation by @idursun in #106
- fix: add
--remote
argument to bookmarks with multiple remotes by @idursun in #107 - perf: make the preview pane more responsive when switching commit by @glehmann in #108
- Add compilation instructions and add
/jjui
to.gitignore
by @ilyagr in #112 - Abandon command passes
--retain-bookmarks
by default - New key binding:
@
jumps to working copy revision #111 - New key binding:
J
jump to parent of the currently selected revision - New key binding:
ctrl+z
suspendsjjui
and returns to terminal. Typingfg
should resume it. jjui
won't start and print an error message if the configuration file is malformed #114- When typing a bookmark name, spaces will be automatically replaced with
-
and the input box will expand if it exceeds the initial size. - Git: git push commands will be repeated per remote and
--remote
argument is always displayed.
New Contributors
- @TeddyHuang-00 made their first contribution in #85
- @PrayagS made their first contribution in #86
- @Jollywatt made their first contribution in #96
- @glehmann made their first contribution in #108
- @ilyagr made their first contribution in #112
Full Changelog: v0.8.8...v0.8.9
v0.8.8
Everything from 0.8.7
What's Changed
Experimental log batching
I've added an experimental feature that loads revisions in batches and request the next batch only if the cursor goes beyond the last loaded revision.
This should greatly improve the loading times, reduce the memory footprint and essentially make jjui
usable with huge repositories.
I have done my best to hide this behind a configuration flag which can be enabled by adding the following to your configuration file:
experimental_log_batching_enabled = true
New Contributors
Full Changelog: v0.8.7...v0.8.8
v0.8.7
What's Changed
- fix panic when trying to open details diff without a selected file by @sullyj3 in #71
- feat: add an '(empty)' message to the diff view for empty diffs by @sullyj3 in #74
- feat: show status bar when in diff view by @sullyj3 in #75
- squash now auto selects the parent change rather than the one below #79
jjui
shows repository location in the window title- fixes a bug where change ids were incorrectly identified for a specific template configuration #76
New Contributors
Full Changelog: v0.8.6...v0.8.7