Commit Graph
100 Commits
Author SHA1 Message Date
NicolasGB e066efb140 refactor(terminal): Centralize default keybinds 2026-07-29 18:32:55 +02:00
Nicolas GBandGitHub 15f842fb3d feat(log): Implement squash --interactive from the log buffer (#145) 2026-07-24 19:48:30 +02:00
Nicolas GBandGitHub 3d10ae14be fix(status): Make restoring files available in visual mode (#144) 2026-07-24 17:47:24 +02:00
NicolasGB cf11a4ffec feat(assets): Add jj.nvim logo 2026-07-24 17:41:00 +02:00
Nicolas GBandGitHub 76efdf514f fix(ui): correctly extract the cmd on floating buffers (#142) 2026-07-16 12:33:49 -07:00
NicolasGB 2cbb69a914 fix(bookmarks): Strip ?? from bookmarks too 2026-07-13 10:45:32 +02:00
NicolasGB 2af8f0d80a fix(log): Correctly pass revsets to the new command from visual mode 2026-07-13 10:41:52 +02:00
Nicolas GBandGitHub 0cbccf3e3c fix(log): Correctly compute highlights and selection of changes independently of the display format of the log buffer (#140) 2026-07-10 12:48:49 +02:00
Nicolas GBandGitHub b7c17af6d2 fix(cmd): Parse default commands through a json template to avoid manual parsing through regex (#137) 2026-07-10 09:06:28 +02:00
Nicolas GBandGitHub b3ac14928c support: Setup bmac (#136) 2026-07-08 15:27:16 +02:00
Nicolas GBandGitHub 7f2786ff16 refactor!: Migrate runners cmd from string to argv (#134)
Migrate command execution to structured argv lists across the plugin, replacing shell-string command construction with `vim.system` argv execution. The runner API now exposes argv-based execution as the default path:

   - `runner.execute_command` -> `runner.execute`
   - `runner.execute_command_async` -> `runner.execute_async`
   - `runner.execute_command_raw` -> `runner.execute_raw`
   - `runner.execute_command_raw_async` -> `runner.execute_raw_async`
   - `runner.execute_command_sync` was removed; use `runner.execute` and handle the result directly

BREAKING CHANGES:
   - `cmd.new({ args = ... })` now requires `args` as `string[]` argv tokens, not a single string.
   - `cmd.log({ ... })` now uses `raw_flags` as `string[]` for raw passthrough flags; `raw = "..."` is no longer supported.
   - Direct users of `jj.core.runner` must migrate from the old `execute_command*` string helpers to the new argv-based `execute*` helpers.
2026-07-07 18:25:30 +02:00
NicolasGB c724290141 fix(filesets): Correclty escape filesets in different commands to avoid
special characters breaking jj's parsing
2026-06-30 12:45:40 +02:00
NicolasGB db06e9a73c fix(tests): Update an old test to match correct new behavior 2026-06-30 12:45:40 +02:00
Nicolas GBandGitHub cffc74128a fix(picker): Reformat the file history picker (#127) 2026-06-18 20:24:29 +02:00
Nicolas GBandGitHub 30d740024d feat(picker): Fallback to vim.ui.select in all pickers (#126) 2026-06-18 20:08:58 +02:00
Nicolas GBandGitHub af14ce8eda feat(picker): Add a conflict picker (#119) 2026-06-18 20:03:27 +02:00
NicolasGB aa3e98af26 fix(terminal): pass argv to native resolve
Pass raw command arguments to the interactive floating terminal instead
    of a shell-escaped string.

    This fixes native `jj resolve` exiting immediately when opened without
    an external tool.
2026-06-18 17:50:38 +02:00
Nicolas GBandGitHub 7fc91fe6d2 feat(resolve): add resolve command and log integration (#125)
Add first-class conflict resolution support to jj.nvim.

   - add `jj.cmd.resolve` to run `jj resolve` in a floating terminal or via an
     external tool
   - add `:J resolve` with support for `-r/--revision`, `--tool`,
     `--external/--ext`, and positional filesets
   - integrate resolve into the log buffer with the `gr` mapping and optional
     `resolve_strategies` picker
   - add `utils.is_change_conflicted()` and avoid opening resolve when the
     selected revision has no conflicts
   - document resolve usage, config, and keymaps in the README
   - add tests for resolve arg parsing and conflict detection helpers
2026-06-16 19:06:33 +02:00
Nicolas GBandGitHub 9f2a76d079 feat(push): Add the possibility to push to arbitrary remotes through the vim command (#124) 2026-06-16 18:46:46 +02:00
Nicolas GBandGitHub 33179e2f15 feat(duplicate): Add a duplication mode (#118) 2026-06-08 09:09:28 +02:00
Nicolas GBandGitHub 3e151d43c8 feat(browse): fix windows url opening (#116) 2026-06-03 09:42:48 +02:00
NicolasGB f30eefeaf3 fix(describe): Allow for empty descriptions in the editor 2026-05-26 15:41:11 +02:00
NicolasGB 71f640be45 feat(status,highlights): Handle renamed files in restore and picker flows
- Improve status-line parsing to support top-level and nested rename 
        syntaxes, so actions no longer include trailing braces in paths.
    - Update the Snacks status picker integration to pass structured 
        rename/status metadata and use git_status formatting, preserving 
        icons/highlighting while showing rename pairs correctly.
    - Also tighten renamed-line highlighting in the editor buffer for consistent jjRenamed behavior.
2026-05-19 18:05:17 +02:00
Nicolas GBandGitHub 5558c22471 feat(editor): Add the possibility to configure a window for the editor like in the terminal allowing for "hsplit"/"vsplit"/"tab"/"floating" (#114) 2026-05-19 18:04:44 +02:00
Nicolas GBandGitHub fbfff97a18 fix(config): correctly initialize default config and propagate it accordingly to the given submodules (#111) 2026-05-15 06:28:00 -07:00
NicolasGB 46932e5410 feat(log/summary): Add o keymap from the summary that allows users to
do the equivalent of `Jtabedit` of the file in under the cursor
2026-04-28 17:52:34 +02:00
NicolasGB 167c206521 feat(diff): Make both codediff/diffview work with the new Jedit
command to allow diffing agianst arbitrary revisions in buffer
2026-04-26 19:25:17 +02:00
NicolasGB 2dbe2c73c5 fix(terminal): make cursor_render_delay optional in the typesystem 2026-04-07 10:44:02 +02:00
NicolasGB cbfcdbbf36 fix(terminal): Correctly reset position on floating terminal 2026-04-07 10:31:35 +02:00
NicolasGB 578c5f15df feat(diff): Now diff command supports <rev1>..<rev2> format 2026-04-04 15:50:52 +02:00
Nicolas GBandGitHub 61f123f518 fix(utils): Now getting the commit_id of a revset forces it being unique (#98)
This will raise an error, as expected, when trying to diff with a revset that has multiple commits associated
2026-03-17 12:11:14 +01:00
NicolasGB 29e4cd054e fix(bookmark): Always move bookmars with -B to allow the user moving
it forward and backwards seemlessly
2026-03-17 11:34:40 +01:00
NicolasGB d471a03685 docs(readme): Document the bookmark track native usage 2026-03-12 18:10:06 +01:00
NicolasGB 3b6f46b9f6 docs(readme): Document the new editor.auto_insert config option 2026-03-12 18:04:39 +01:00
NicolasGB d357409268 feat(log): Add change_revset keybind to change the current log revset
being displayed in the log command
2026-03-12 18:04:39 +01:00
NicolasGB 80caa923c2 feat(cmd): Implement the bookmark forget as a native function 2026-03-12 18:04:39 +01:00
Nicolas GBandGitHub 1c3d38a626 feat(diff): Add the diff_history command (#97)
This new command is natively implemented by both the `codediff` and `diffview` backends allowing to easily navigate the changes between two revsets while diffing the. 

It also gives a new `:J diff_hisotyr` command that optionally takes a range of revsets formatted `<rev1>..<rev2>` otherwise it prompts the user for the range.
2026-03-12 18:03:23 +01:00
NicolasGB bbba4051c8 feat(fetch_pr): Introdue the fetch_pr command that allows to pick open
Pull requests from github and import them locally
2026-02-24 18:18:59 +01:00
NicolasGB 185190909d fix(terminal): Remove <S-a> keymap that locked the terminal 2026-02-22 18:06:58 +01:00
Nicolas GBandGitHub 138044c7e3 feat(browse): add :Jbrowse to open current file on remote (#89) 2026-02-22 09:05:13 -08:00
Nicolas GBandGitHub 19db4e8178 feat(tag): Implement set/delete/push (push only colocated repistories) (#84) 2026-02-22 08:53:51 -08:00
NicolasGB 3d78c28f7e feat(split): add jj split command with interactive floating terminal
Add split command that allows splitting a change into multiple revisions
    from the log buffer or via :J split. Supports --parallel, --message,
    --fileset, and --ignore-immutable flags. Includes immutability checks
    with user confirmation and empty change detection.
2026-02-13 18:44:27 +01:00
NicolasGB 3115a0b3f0 fix(parser): use / instead of \ as divergent change separator
jj uses / (e.g., rs/1) for divergent changes, not \. Update the parser
to match revsets with /N suffix and update all related tests.
2026-02-13 10:13:30 +01:00
NicolasGB 7827458568 fix(terminal): clamp tooltip dimensions to available screen space
Prevent tooltip from overflowing when the cursor is near the bottom or
right edge of the screen by clamping width and height to the remaining
space.
2026-02-11 13:54:41 +01:00
NicolasGB 2318e5ecfc feat(cmd/bookmark): Add a new bookmark_track command that uses
vim.ui.select listing the currently untracked remotes
2026-02-10 17:35:29 +01:00
NicolasGB 6a3ff64116 fix(editor,terminal): Correctly restore log buffer and cursor position
A regresion was introduced by #81 where the log buffer was not being
    restored when there was no modification after describing from the
    log buffer. This has been reworked and now the function `on_done` is
    always called not only when there are lines in the buffer giving the
    responsibility to check the nilness on the `on_done` function.

    There was a bug also when restoring cursor position which was being
    wiped when the buffer was closed which is not actually what we want
2026-02-09 13:10:09 +01:00
NicolasGB 149ae9ebc7 fix(commit): Migrate from simulated commit to jj's native command.
- This required some improvements on the editor buffer logic,
      introduced a `on_write` (previously on_done but it wasn't the
      right meaning) hook and an `on_unload` to allow for both
      describe and commit correct workflows.
    - Introduced an utils function to extract the description text and
      clean it post buffer write
2026-02-07 17:32:57 +01:00
NicolasGB 400a3a5263 fix(describe/keymaps): Remove <ESC> from default keymap which may not be a
sensitive default after some users feedback
2026-02-02 17:08:39 +01:00
Nicolas GBandGitHub 680d864e11 fix(diff): Correctly compare against @- instead of HEAD~1 when (#76) 2026-01-29 09:28:50 +01:00
NicolasGB 463fd0876a fix(parser): support for divergent changes 2026-01-25 19:15:06 +01:00
NicolasGB 470bc244e9 fix(readme): Fix some typos and update outdated info 2026-01-25 19:02:09 +01:00
Nicolas GBandGitHub 335663c3ee Feat: Rewrite diff module to allow for external dependencies as jj.nvim's diff tool (#74)
- Refactor diff into modular architecture (native, diffview, codediff)
- Add the possibility for users to define their own diff backend
- Support external diff tools like diffview.nvim codediff.nvim
- Enable visual mode selection to diff two changes in log buffer
- Add summary tooltip integration with terminal
- Update documentation with new diff workflows
2026-01-25 09:39:31 -08:00
Nicolas GBandGitHub 8ed2aa52aa feat(log): Add summary view (#70)
Display a summary of changed files for any revision in the log buffer
using a floating tooltip. From the tooltip, users can diff or edit
specific files directly.

- Add summary tooltip triggered by <S-k> in log buffer
- Integrate tooltip as stateful component of terminal
- Make summary keymaps configurable
- Add documentation and demo gif
2026-01-25 09:25:06 -08:00
NicolasGB 9a20b24849 feat(cmd): Add jj commit as a native command 2026-01-22 11:00:07 +01:00
NicolasGB 80d3a88f16 feat(log)!: add interactive bookmark selection for push commands and
remove push all method. 

BREAKING CHANGE: handle_log_push_all renamed to handle_log_push_from_all
and now requires user to select a bookmark instead of pushing all.

- Add vim.ui.select prompt when revision has multiple bookmarks
- Include "[All]" option to push all bookmarks from a revision
2026-01-09 18:26:17 +01:00
NicolasGB 5b20479cff feat(log): Allow creating new changes with multiple parents through
visual selection
2026-01-09 13:59:27 +01:00
NicolasGB b6d7ebddf6 feat(log): Allow abandoning multiple changes at once through visual
selection
2026-01-09 13:09:45 +01:00
NicolasGB 9d9e2379fd feat(log): Implement squash and quick squash from the log buffer.
- Squash: behaves like rebase, the user can select 1 or more
      revisions to squash and then a destination
    - Quick squash: `-r {rev} -u --ignore-immutable` flag from jj allowing
      for quick visuall squashes
2026-01-08 18:29:04 +01:00
NicolasGB a23997d3bc fix(parser): Fix some edge cases where false positives where getting
parsed as change-lines.

    - Added some tests to avoid these false positives
    - Forced the parser to ensure there is at least a symbol in the
      change line allowed_prefixes before finding out the change
2026-01-07 12:52:42 +01:00
NicolasGB ba48ed08b5 feat(log): add immutable-ignoring rebase keymaps
Changes add support for rebasing while ignoring immutability constraints with new keymaps (<S-CR>, <S-o>, <S-a>, <S-b>) and update documentation. Refactors rebase handler to accept optional ignore_immut parameter and includes minor comment improvements in buffer and command modules.
2026-01-06 13:20:19 +01:00
NicolasGB 8c6a656810 fix(readme): Update default config following structure changes 2026-01-02 19:00:45 +01:00
NicolasGB 4b8d4130ff readme: Improve readme with a Table of contents 2026-01-02 18:57:35 +01:00
Nicolas GBandGitHub 12e91e547d feat: Rebase on log buffer (#62)
Now it is possible to rebase interactively from the log buffer with visual feedback. You can rebase one or many visually selected changes.

Supported target modes are: `-o` / `-A` / `-B`.

Limitation:
	- As of now you cannot rebase a whole branch (-b) from the log view.

Bonus from this pr:
	- Now keymaps support different modes
2026-01-02 18:41:59 +01:00
Nicolas GBandGitHub 2c898c6be3 feat(diff): Restore cursor when exiting diff mode (#63) 2026-01-02 12:11:11 +01:00
NicolasGB 16eedac9b9 fix(editor): Use native jjdescription highlights groups and simply override them
Keep the Renamed logic since this one is not native to neovim.
2025-12-30 18:39:16 +01:00
NicolasGB c40dfed316 fix(log): handle bookmark now is a method of the module instead of local
like all the others
2025-12-30 12:25:56 +01:00
NicolasGB 746f78b60f fix(log): if a default prefix has been set take it into account when
creating a bookmark from the logfile
2025-12-30 12:22:47 +01:00
NicolasGB 0dea8bfd5a readme: update it with annotate info 2025-12-29 20:53:05 +01:00
Nicolas GBandGitHub 6eb41f631e Feat: Annotation by file and line (#55) 2025-12-29 11:46:35 -08:00
NicolasGB 40cf2fea13 fix(bookmark): add -r when creating bookmarks to correctly handle revsets 2025-12-19 19:36:54 +10:00
NicolasGB be8cacae9d fix(readme): Mention correct default keybind for opening a pr 2025-12-19 17:02:49 +10:00
NicolasGB 5dc6fbafa7 fix(runner): use sh -c wrapper for safe command execution 2025-12-19 16:57:38 +10:00
NicolasGB 1fd8faed4b feat(bookmark): add prefix configuration for bookmark creation
- Add `prefix` option to `bookmark_create()` function for setting default bookmark names
- Add `bookmark.prefix` configuration option for global bookmark prefix defaults
- Update README with bookmark prefix usage examples
2025-12-18 19:43:36 +10:00
NicolasGB 43b5a81771 fix: prevent invalid buffer access in terminal on_exit callbacks
When closing a terminal buffer (floating or regular), a race condition
could occur where the BufWipeout/BufDelete autocmd clears the buffer
reference, but the job's on_exit handler later tries to operate on it
via vim.schedule. This caused 'Invalid buffer' errors.

Add validity checks in both floating and regular buffer on_exit
handlers to safely handle the case where the buffer has already been
cleaned up.
2025-12-11 17:01:46 +11:00
NicolasGB ddfd6e0b56 fix(readme): Fix broken identation 2025-11-27 22:11:49 +01:00
Nicolas GBandGitHub d63761e1bf feat(bookmark): add bookmark management from log buffer and bookmark_move API (#51) 2025-11-27 22:07:22 +01:00
NicolasGB b32ba1aa5e fix(utils): get_all_bookmarks returns only local and non deleted ones 2025-11-27 21:29:37 +01:00
NicolasGB 8350606dab feat(cmd): add platform-agnostic PR/MR opening functionality 2025-11-27 20:58:34 +01:00
NicolasGB e22bf5ec4e feat: Add fetch/push commands and log keybinds, make long-running operations non-blocking
Convert blocking jj commands to async using vim.fn.jobstart() to prevent UI
freezing during fetch, push, rebase, squash, and other heavy operations.

Changes:
- Implement execute_command_async() in runner with proper error handling
  - Captures stdout from job and passes to success callback
  - Supports stdin input for commands that require it
  - Includes silent flag to suppress error notifications
  - Replicates sync version's error handling behavior

- Convert blocking operations to async:
  - handle_log_fetch, handle_log_push_all, handle_log_new
  - handle_log_edit, handle_log_abandon, handle_log_describe
  - describe.execute_describe, all init.lua commands

- Add push/fetch as public commands with CLI support:
  - M.fetch() - fetch from remote
  - M.push(opts) - push all changes or specific bookmark
  - CLI: :J push, :J push <bookmark>, :J fetch

- Implement handle_log_push_bookmark() for revision under cursor:
  - Retrieves and strips modified bookmark indicator (*)
  - Pushes specific bookmark to remote
  - Keybind: Shift+p in log buffer

- Update README with new keybinds:
  - a: abandon revision under cursor
  - f: fetch from remote
  - p: push all changes
  - Shift+p: push revision's bookmark

- Add Lua API docs for push command options
2025-11-27 20:58:34 +01:00
NicolasGB 8f1a60342a feat: implement jj abandon as native 2025-11-27 20:58:34 +01:00
Nicolas GBandGitHub 10c611eaab feat: add close_on_edit config for log buffer (#48)
- Add close_on_edit option to close log buffer after editing a change (default: false)
- Rename handle_log_enter to handle_log_edit with close_on_exit parameter
- Update log keymaps to pass close_on_edit config to handlers
- Update config types and defaults in init.lua
2025-11-26 15:48:56 +01:00
Nicolas GBandGitHub 39de3c6bc9 fix: Improve the parser and add test to handle edge cases (#42) 2025-11-26 09:42:45 +01:00
NicolasGB a9f0ca0031 fix: update readme with correct module initialization for the lua api 2025-11-25 18:10:47 +01:00
NicolasGB 7329e89a85 feat(terminal): add configurable cursor render delay for terminal buffers
Add cursor position restoration with configurable timing to handle terminal
     buffer rendering asynchronously. This fixes cursor column being reset to 0
     when refreshing jj log commands.

     Changes:
     - Add `terminal.cursor_render_delay` configuration option (default: 10ms)
     - Add buffer.get_cursor() and buffer.set_cursor() helpers in core/buffer
       * buffer.set_cursor() uses defer_fn with configurable delay for terminal buffers
       * Automatic position validation with clamping to buffer bounds
       * Line number clamped to [1, line_count]
       * Column clamped to [0, line_length] based on actual line content
       * Validation happens inside deferred callback to check against final rendered content
     - Extract clamp_cursor_position() helper to eliminate code duplication
     - Refactor terminal module to use new buffer cursor helpers
     - Store and restore cursor position when cycling through log commands
     - Update README with terminal configuration section and example usage

     The delay is necessary because nvim_open_term() + nvim_chan_send() have
     asynchronous rendering in the terminal emulator layer. Setting the cursor
     before rendering completes results in the column being reset to 0. Users
     experiencing issues can increase the delay value if needed.
2025-11-25 09:10:12 +01:00
NicolasGB 0cd1f554a6 fix: Correctly parse complex subcommands and push a table to terminal.run() when it's possible instead of making a concat 2025-11-23 18:07:30 +01:00
NicolasGB e78c35846a BREAKING: Complete restructuring of plugin architecture and configuration. Please check the new readme to update your config if needed. Lua api remains unchanged 2025-11-23 16:37:35 +01:00
NicolasGB c5a51a1beb refactor: Make the floating buffer configurable keymaps too 2025-11-23 16:34:42 +01:00
NicolasGB 050608c2cc refactor: remove hardcoded closing keymaps on the terminal buffer 2025-11-23 16:34:42 +01:00
NicolasGB a96a5c7849 refactor: split cmd.lua into multiple files when commands have enough business inside them 2025-11-23 16:34:42 +01:00
NicolasGB be925a9882 Update README with new config structure
- Document describe.editor configuration for type and keymaps
- Document keymaps configuration for log, status, and close keybindings
- Update examples to show the new nested config structure
- Add section on customizing describe editor keymaps
- Preserve multiline descriptions in describe editor buffer
2025-11-23 16:34:42 +01:00
NicolasGB b34e08d815 fix: describe command reopening log buffer without flicker
- Close terminal buffer before opening describe editor
  - Capture log state before closing to detect if we should reopen
  - Add on_unload callback to editor to handle log reopening
  - Suppress redraws during buffer transitions with lazyredraw
  - Remove duplicate hardcoded status keymaps from terminal.lua (were referencing undefined functions)
  - Fix resolve_keymaps_from_specs to validate handlers exist before creating keymaps
2025-11-23 16:34:42 +01:00
NicolasGB f06b23326e refactor: Restructure keymaps and event handlers into centralized config-driven system
- Add M.setup() to cmd module for configuration
    - Move describe editor config to M.config.describe.editor with nested structure
    - Add keymaps config with separate log, status, and close sections
    - Implement resolve_keymaps_from_specs() helper to build keymap lists from config
    - Extract editor.open_editor() keymaps parameter support
    - Move status/log event handlers from terminal.lua to cmd.lua
    - Convert log/status buffer keymaps to config-driven approach with handler specs
2025-11-23 16:34:42 +01:00
NicolasGB f0cfb459bd refactor: create a new buffer module to centralize buffer operation logic 2025-11-23 16:34:42 +01:00
NicolasGB e545d02ceb refactor: restructure the whole plugin following a better separation of concers 2025-11-23 16:34:42 +01:00
NicolasGB f6982a7716 fix: split with the same logic as the editor 2025-11-23 16:34:42 +01:00
Nicolas GBandGitHub d385501067 fix: Improve default command parsing logic and allow for toml array definition. (#37) 2025-11-20 13:21:15 +01:00
NicolasGB 9d39e74ce5 fix: update clearing buffer, this makes the plugin work again on nightly 2025-11-18 17:21:29 +01:00
NicolasGB 84ba77a8fc fix(log): Add u/r keymaps for undoing and redoing operations on log buffer. 2025-11-18 14:33:16 +01:00
NicolasGB 10c9a07ad7 Refactor M.j() command dispatch to use handler table
- Replace nested if/elseif chains with dispatch table for cleaner pattern matching
- Store remaining_args_str to avoid repeated table.concat() calls
- Simplify whitespace trimming using vim.trim() instead of gsub patterns
- Add state.buf_cmd tracking to store subcommand on successful execution for conditional UI refreshes
- Clean up state on buffer close and execution failure
- Add conditional log refresh for squash(), undo(), and redo() when log buffer is active
- Fix type annotations for nil handling
2025-11-18 14:04:21 +01:00
NicolasGB e0370ad0ca feat: Make undo/redo native 2025-11-18 14:04:21 +01:00