Commits
Stops defining its own ignore knobs and reads from the existing
`editor.file-picker` config block (`hidden`, `parents`, `ignore`,
`git-ignore`, etc.) so a single set of rules governs both the
fuzzy file picker and the panel. `is_vcs_internal` keeps filtering
out `.git` plumbing regardless of config — that's structurally
never useful to surface.
Adds nerd-font glyphs for files and directories — chosen by extension /
basename via a small palette that's themable through `ui.filetree.icon.*`
scopes. Directory icons fall back through the file-icon palette so a
folder named after a recognized extension still gets a sensible glyph.
Icons live in a self-contained `icons` submodule (a 330-line palette is
clearly its own concern from birth) and the palette is consulted from
the entry row formatter.
Holding Alt at the start of a drag (`MouseEventKind::Drag` with
`KeyModifiers::ALT`) latches the gesture into copy mode rather than
move; the modifier is captured at drag-start so a later modifier
release doesn't reclassify mid-gesture (matching Finder / VSCode).
Files copy via `std::fs::copy`, directories via a new `copy_recursive`
helper that walks the source tree and re-creates it at the destination
without merging into an existing target.
Adds `a` (new file) / `A` (new directory) / `r` (rename) / `d` (delete)
keybindings and the matching context-menu items. Each pushes a `Prompt`
layer with input validation appropriate to the action — names rejected
for separators, NUL, or special-dot-dot; targets rejected for already-
existing paths; delete confirmed with a yes-prompt that distinguishes
files from non-empty directories.
The prompt-pushing and dispatching live in a new `ops` submodule
(so `filetree.rs` stays out of `ui::Prompt` plumbing) with the
filename / target-path validators in a new `paths` submodule
(closed-domain logic with exhaustive table tests). The cursor-row
"what does this action target" resolution joins the gestures
module as `resolve_action_dir`.
Press and hold on a row, drag onto a directory (or a file row that
resolves to its parent dir), release to `std::fs::rename`. The
dragged source row is dimmed during the gesture and the drop target
is highlighted, with files-row-resolves-to-parent-dir for the
"drop onto a file to land in its directory" UX.
Drag, click, and resize gestures cluster cleanly enough at this
point to earn a `gestures` submodule: `DragState` and the typed
outcomes `ClickOutcome` / `MoveValidity` live there alongside the
pure helpers (`classify_click`, `compute_resize_width`,
`validate_move`, `resolve_drop_target`) so the boundary cases are
unit-tested without faking a `Context`.
Spawns a notify watcher rooted at the panel root and refreshes
entries on filesystem changes. Path-classification (`is_noisy_path`)
filters out churn from typical workspace noise (`.git/objects`,
`target/`, swap files), and `watcher_action` decides whether a raw
event should rebuild entries, refresh VCS, or be ignored — both
live as pure functions in a `watcher` submodule so the noisy-path
boundaries and event-routing are unit-tested without a real
watcher.
Reads each entry's git status via `helix-vcs` and colors the row by
state (modified / added / deleted / untracked). Directories roll up:
a dir is highlighted by the strongest status among its descendants,
so a clean tree shows clean folders. The scan runs on a tokio
blocking task so a large repo never stalls the panel; results
trickle into a shared cache that the render path reads
lock-free.
Right-click on an entry opens a context menu with operations that
apply to it (open, reveal, copy path, …); right-click on blank space
opens a smaller menu rooted at the panel itself (refresh, change
sort, …). Navigation is keyboard or mouse; pressing the same key
again closes the menu. Lives in its own `context_menu` submodule —
the menu's data model, rendering, and event handling form a coherent
unit large enough to be its own concern from birth.
Tracks the most recent mouse position so the row under the cursor and
the resize-handle column get a subdued highlight (themed via
`ui.filetree.hover` and `ui.filetree.resize-handle.hover`), giving
mouse users an unobtrusive "this is what I'm about to act on" cue
before they click.
Press-and-drag on the column adjacent to the panel border resizes the
panel in real time, clamped between a configurable min/max and the
`min_remaining_editor_width` budget so the editor can never be squeezed
out. `compute_resize_width` lives as a pure helper so the boundary
math (clamps, position-aware sign) is unit-tested without faking a
Context.
Left-click selects the row under the cursor; a second click on the same
row within ~500ms activates (opens the file or toggles the directory).
Drag-out (release on a different row) cancels. The scroll-wheel pans
the viewport with buffer-scroll semantics — the cursor stays anchored
on its entry and only catches up when it would drift outside the
`scrolloff` comfort zone — matching how the editor scrolls buffers.
Click classification is factored out as a pure `classify_click`
returning typed `ClickOutcome` so the boundary cases (drag-out, second
click on a different row, threshold expiry) can be unit-tested without
faking a Context.
Adds a dot next to entries whose path matches an open buffer (with
directory rollup, so an ancestor of any open file gets the dot too) and
a render mode that auto-hides the panel when the terminal is narrow
*and* the panel isn't focused — pressing `<space>e` brings it back as
an overlay until focus drops again. The colon-passthrough comment in
the keymap is also updated to note that dropping focus is what triggers
the auto-hide.
The panel keeps its cursor on the focused view's current buffer at all
times — not just at focus-time — so it remains a live status indicator
of "where you are" while you work in the editor. When the panel itself
isn't focused, the cursor row is drawn in a subdued, bufferline-active-
derived style so the selection stays visible without competing with the
editor.
When `<space>e` (filetree_focus) lands the panel and the focused view has a
non-scratch buffer whose path lives under the panel root, expand every
ancestor directory and snap the cursor to that file's row so the next
`j`/`k` is relative to where you actually are. Scratch buffers and files
outside the workspace are silently skipped.
Lets <space> and `:` sequences route to the editor's keymap when typed
inside the panel by dropping focus on those keys (and leaving Helix's
own multi-key trie to handle the rest). The modal "unfocus, regain
with <space>e" shape matches the convention pickers already follow.
Reads the working directory into the panel, expands directories on demand
on Enter/Right, collapses on Left, and moves the cursor with arrow keys
and h/j/k/l. Opens files in the editor when activated.
Introduces a persistent filetree panel that can be opened on the left or
right side of the editor, with config, state, and a render skeleton in
place for subsequent features. Removes the modal file_explorer command
and key binding it replaces.
When cycling to the side-side refine pair (current vs incoming), both
sections represent alternative additions — neither is conceptually
"removed". Use the "added" highlight style for both instead of showing
one side as "removed" (red).
Split tokens into three character classes (whitespace, alphanumeric,
punctuation) instead of just whitespace vs non-whitespace. This makes
trailing punctuation like `",` common when only the identifier differs.
Whitespace tokens are compared by length with common leading newlines
skipped, so indentation changes highlight only the extra spaces and
line-break differences show cleanly. Each whitespace token also gets
a unique serial to prevent the diff algorithm from matching identical
whitespace runs at different positions across the two sides.
Includes a regression test for the current-incoming pair of a real 3-way
conflict.
Store parsed conflict regions as a plain Vec on Document instead of
wrapping them in a RefCell for lazy computation. This allows conflicts()
to return &[ConflictRegion] directly, eliminating the per-frame clone
that was required when the regions were inside a RefCell.
Parse eagerly in the constructor and recompute on every edit in
apply_impl, then pass the pre-computed &[ConflictRegion] through the
render chain to all consumers (section backgrounds, marker highlights,
refine overlays, diagnostics suppression, marker line computation).
This avoids each consumer re-parsing the document independently.
Clippy says it's currently 784 bytes. Given it's intended to be long lived,
allocating to fix that is not an issue.
This change adds functionality that computes the shortest unique
filepath for each document in the editor to display as the title in the
bufferline, along with the appropriate configuration options.
When jumping to the next/previous conflict with ]= / [=, place the conflict
marker at the top of the viewport instead of the bottom. This maximizes the
chance of seeing the entire conflict region without further scrolling.
When manually resolving a conflict by keeping lines from both sides, the user
may delete the base section and its markers, leaving only the outer <<<<<<<
and >>>>>>> lines around the hand-picked content. Previously this was not
recognised as a conflict region, making it impossible to use the resolution
commands to strip the remaining markers. Now such bare conflicts are parsed
as a single-section region, so any resolution command (e.g. <space>xc) can
be used to finalize the edit.
The diffs are computed and displayed as soon as a conflict appears on
the screen, without requiring the cursor to be in the conflict region.
Render per-section background colors and marker line highlights
in conflicts, with correct z-ordering (section bg < cursorline <
rulers). Side background colors alternate by Side index for clean
visual grouping in N-way jj conflicts.
Also add conflict_marker_lines() public helper and theme scopes
for tokyonight, base16, and the default theme.
- ]= / [= in the unimpaired section (after ]G/[G)
- Space x submap in a new 'Conflict' subsection under Space mode
Add conflict_accept_at_cursor ((space)xx): resolves the conflict by
accepting whichever section the cursor is on, without the user needing
to know which side it is. Marker lines (<<<<<<<, |||||||, >>>>>>>) are
attributed to their section; the ======= separator is a no-op.
Tests cover both git and jj snapshot formats.
Diagnostic underlines and inline annotations are suppressed for any
diagnostic whose range overlaps a conflict region. The LSP sees conflict
markers as broken code and produces spurious errors that are meaningless
until the conflict is resolved.
- Removed from kqqqutzr: HashMap/Range/imara_diff imports,
ConflictRegion::num_refine_pairs/refine_pair_indices, all refine
functions (conflict_pair_sections, conflict_refine_pair, WordTokens,
refine_diff), and refine tests
- Added to wkqtnzvn: same content restored plus 3 new refine tests
(refine_diff_identical_sections, refine_diff_single_word_change,
refine_diff_completely_different) from descendant ponzynvy
- Fixed old ours_content/theirs_content → current_content/incoming_content
in those descendant tests (signature changed in wkqtnzvn)
Add four commands under the (space)x submap to resolve the conflict
region under the cursor:
c accept current change (keep <<<<<<< side)
i accept incoming change (keep >>>>>>> side)
b accept base change (keep ||||||| side, diff3 only)
a accept all changes (concatenate current and incoming)
Add helix-core/src/conflict.rs with a parser for VCS merge conflict
markers and navigation helpers. Supports git 2-way, git diff3 3-way,
and jj snapshot N-way formats from the start.
ConflictRegion uses a Vec<Section> model (SectionKind: Side/Base) that
works uniformly across all formats. Helper functions use current/incoming
terminology instead of ours/theirs.
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 67ef31d5b988238dd797d409d6f9574278e20537 to fa04a1451ff1842e2626ccb99004d0195b455a88.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](https://github.com/dtolnay/rust-toolchain/compare/67ef31d5b988238dd797d409d6f9574278e20537...fa04a1451ff1842e2626ccb99004d0195b455a88)
---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
dependency-version: fa04a1451ff1842e2626ccb99004d0195b455a88
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.82.2 to 2.82.7.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/9e1e5806d4a4822de933115878265be9aaa786d9...16b05812d776ae1dfaabc8277e421fb6d2506419)
---
updated-dependencies:
- dependency-name: taiki-e/install-action
dependency-version: 2.82.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the rust-dependencies group with 5 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [arc-swap](https://github.com/vorner/arc-swap) | `1.9.1` | `1.9.2` |
| [arrayvec](https://github.com/bluss/arrayvec) | `0.7.7` | `0.7.8` |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.102` | `1.0.103` |
| [ignore](https://github.com/BurntSushi/ripgrep) | `0.4.26` | `0.4.27` |
| [open](https://github.com/Byron/open-rs) | `5.3.5` | `5.3.6` |
Updates `arc-swap` from 1.9.1 to 1.9.2
- [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vorner/arc-swap/commits)
Updates `arrayvec` from 0.7.7 to 0.7.8
- [Release notes](https://github.com/bluss/arrayvec/releases)
- [Changelog](https://github.com/bluss/arrayvec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bluss/arrayvec/compare/0.7.7...0.7.8)
Updates `anyhow` from 1.0.102 to 1.0.103
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.102...1.0.103)
Updates `ignore` from 0.4.26 to 0.4.27
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.26...ignore-0.4.27)
Updates `open` from 5.3.5 to 5.3.6
- [Release notes](https://github.com/Byron/open-rs/releases)
- [Changelog](https://github.com/Byron/open-rs/blob/main/changelog.md)
- [Commits](https://github.com/Byron/open-rs/compare/v5.3.5...v5.3.6)
---
updated-dependencies:
- dependency-name: arc-swap
dependency-version: 1.9.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: arrayvec
dependency-version: 0.7.8
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: anyhow
dependency-version: 1.0.103
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: ignore
dependency-version: 0.4.27
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: open
dependency-version: 5.3.6
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [gix](https://github.com/GitoxideLabs/gitoxide) from 0.84.0 to 0.85.0.
- [Release notes](https://github.com/GitoxideLabs/gitoxide/releases)
- [Changelog](https://github.com/GitoxideLabs/gitoxide/blob/main/CHANGELOG.md)
- [Commits](https://github.com/GitoxideLabs/gitoxide/compare/gix-v0.84.0...gix-v0.85.0)
---
updated-dependencies:
- dependency-name: gix
dependency-version: 0.85.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Noticed in Go which injects `comment` syntax for comments.
The comment continuation wouldn't work because it would try to
resolve the comment continuation token from the injected comment
syntax which doesn't define one.
Resolved by bubbling up until we find a first layer that defines comment
token.
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 to 67ef31d5b988238dd797d409d6f9574278e20537.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](https://github.com/dtolnay/rust-toolchain/compare/3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9...67ef31d5b988238dd797d409d6f9574278e20537)
---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
dependency-version: 67ef31d5b988238dd797d409d6f9574278e20537
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.81.8 to 2.82.2.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/0631aa6515c7d545823c67cfae7ef4fc7f490154...9e1e5806d4a4822de933115878265be9aaa786d9)
---
updated-dependencies:
- dependency-name: taiki-e/install-action
dependency-version: 2.82.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This should be a user decision in most languages but it's almost
mandatory in Go to drop unused imports (compile error).
On :wq we use the single threaded futures_executor::block_on, and calling
block_on to resolve code actions would hit the nested guard.
Resolve code actions async within a job.
Fixes #15928
Stops defining its own ignore knobs and reads from the existing
`editor.file-picker` config block (`hidden`, `parents`, `ignore`,
`git-ignore`, etc.) so a single set of rules governs both the
fuzzy file picker and the panel. `is_vcs_internal` keeps filtering
out `.git` plumbing regardless of config — that's structurally
never useful to surface.
Adds nerd-font glyphs for files and directories — chosen by extension /
basename via a small palette that's themable through `ui.filetree.icon.*`
scopes. Directory icons fall back through the file-icon palette so a
folder named after a recognized extension still gets a sensible glyph.
Icons live in a self-contained `icons` submodule (a 330-line palette is
clearly its own concern from birth) and the palette is consulted from
the entry row formatter.
Holding Alt at the start of a drag (`MouseEventKind::Drag` with
`KeyModifiers::ALT`) latches the gesture into copy mode rather than
move; the modifier is captured at drag-start so a later modifier
release doesn't reclassify mid-gesture (matching Finder / VSCode).
Files copy via `std::fs::copy`, directories via a new `copy_recursive`
helper that walks the source tree and re-creates it at the destination
without merging into an existing target.
Adds `a` (new file) / `A` (new directory) / `r` (rename) / `d` (delete)
keybindings and the matching context-menu items. Each pushes a `Prompt`
layer with input validation appropriate to the action — names rejected
for separators, NUL, or special-dot-dot; targets rejected for already-
existing paths; delete confirmed with a yes-prompt that distinguishes
files from non-empty directories.
The prompt-pushing and dispatching live in a new `ops` submodule
(so `filetree.rs` stays out of `ui::Prompt` plumbing) with the
filename / target-path validators in a new `paths` submodule
(closed-domain logic with exhaustive table tests). The cursor-row
"what does this action target" resolution joins the gestures
module as `resolve_action_dir`.
Press and hold on a row, drag onto a directory (or a file row that
resolves to its parent dir), release to `std::fs::rename`. The
dragged source row is dimmed during the gesture and the drop target
is highlighted, with files-row-resolves-to-parent-dir for the
"drop onto a file to land in its directory" UX.
Drag, click, and resize gestures cluster cleanly enough at this
point to earn a `gestures` submodule: `DragState` and the typed
outcomes `ClickOutcome` / `MoveValidity` live there alongside the
pure helpers (`classify_click`, `compute_resize_width`,
`validate_move`, `resolve_drop_target`) so the boundary cases are
unit-tested without faking a `Context`.
Spawns a notify watcher rooted at the panel root and refreshes
entries on filesystem changes. Path-classification (`is_noisy_path`)
filters out churn from typical workspace noise (`.git/objects`,
`target/`, swap files), and `watcher_action` decides whether a raw
event should rebuild entries, refresh VCS, or be ignored — both
live as pure functions in a `watcher` submodule so the noisy-path
boundaries and event-routing are unit-tested without a real
watcher.
Reads each entry's git status via `helix-vcs` and colors the row by
state (modified / added / deleted / untracked). Directories roll up:
a dir is highlighted by the strongest status among its descendants,
so a clean tree shows clean folders. The scan runs on a tokio
blocking task so a large repo never stalls the panel; results
trickle into a shared cache that the render path reads
lock-free.
Right-click on an entry opens a context menu with operations that
apply to it (open, reveal, copy path, …); right-click on blank space
opens a smaller menu rooted at the panel itself (refresh, change
sort, …). Navigation is keyboard or mouse; pressing the same key
again closes the menu. Lives in its own `context_menu` submodule —
the menu's data model, rendering, and event handling form a coherent
unit large enough to be its own concern from birth.
Press-and-drag on the column adjacent to the panel border resizes the
panel in real time, clamped between a configurable min/max and the
`min_remaining_editor_width` budget so the editor can never be squeezed
out. `compute_resize_width` lives as a pure helper so the boundary
math (clamps, position-aware sign) is unit-tested without faking a
Context.
Left-click selects the row under the cursor; a second click on the same
row within ~500ms activates (opens the file or toggles the directory).
Drag-out (release on a different row) cancels. The scroll-wheel pans
the viewport with buffer-scroll semantics — the cursor stays anchored
on its entry and only catches up when it would drift outside the
`scrolloff` comfort zone — matching how the editor scrolls buffers.
Click classification is factored out as a pure `classify_click`
returning typed `ClickOutcome` so the boundary cases (drag-out, second
click on a different row, threshold expiry) can be unit-tested without
faking a Context.
Adds a dot next to entries whose path matches an open buffer (with
directory rollup, so an ancestor of any open file gets the dot too) and
a render mode that auto-hides the panel when the terminal is narrow
*and* the panel isn't focused — pressing `<space>e` brings it back as
an overlay until focus drops again. The colon-passthrough comment in
the keymap is also updated to note that dropping focus is what triggers
the auto-hide.
The panel keeps its cursor on the focused view's current buffer at all
times — not just at focus-time — so it remains a live status indicator
of "where you are" while you work in the editor. When the panel itself
isn't focused, the cursor row is drawn in a subdued, bufferline-active-
derived style so the selection stays visible without competing with the
editor.
When `<space>e` (filetree_focus) lands the panel and the focused view has a
non-scratch buffer whose path lives under the panel root, expand every
ancestor directory and snap the cursor to that file's row so the next
`j`/`k` is relative to where you actually are. Scratch buffers and files
outside the workspace are silently skipped.
When cycling to the side-side refine pair (current vs incoming), both
sections represent alternative additions — neither is conceptually
"removed". Use the "added" highlight style for both instead of showing
one side as "removed" (red).
Split tokens into three character classes (whitespace, alphanumeric,
punctuation) instead of just whitespace vs non-whitespace. This makes
trailing punctuation like `",` common when only the identifier differs.
Whitespace tokens are compared by length with common leading newlines
skipped, so indentation changes highlight only the extra spaces and
line-break differences show cleanly. Each whitespace token also gets
a unique serial to prevent the diff algorithm from matching identical
whitespace runs at different positions across the two sides.
Includes a regression test for the current-incoming pair of a real 3-way
conflict.
Store parsed conflict regions as a plain Vec on Document instead of
wrapping them in a RefCell for lazy computation. This allows conflicts()
to return &[ConflictRegion] directly, eliminating the per-frame clone
that was required when the regions were inside a RefCell.
Parse eagerly in the constructor and recompute on every edit in
apply_impl, then pass the pre-computed &[ConflictRegion] through the
render chain to all consumers (section backgrounds, marker highlights,
refine overlays, diagnostics suppression, marker line computation).
This avoids each consumer re-parsing the document independently.
When manually resolving a conflict by keeping lines from both sides, the user
may delete the base section and its markers, leaving only the outer <<<<<<<
and >>>>>>> lines around the hand-picked content. Previously this was not
recognised as a conflict region, making it impossible to use the resolution
commands to strip the remaining markers. Now such bare conflicts are parsed
as a single-section region, so any resolution command (e.g. <space>xc) can
be used to finalize the edit.
Render per-section background colors and marker line highlights
in conflicts, with correct z-ordering (section bg < cursorline <
rulers). Side background colors alternate by Side index for clean
visual grouping in N-way jj conflicts.
Also add conflict_marker_lines() public helper and theme scopes
for tokyonight, base16, and the default theme.
Add conflict_accept_at_cursor ((space)xx): resolves the conflict by
accepting whichever section the cursor is on, without the user needing
to know which side it is. Marker lines (<<<<<<<, |||||||, >>>>>>>) are
attributed to their section; the ======= separator is a no-op.
Tests cover both git and jj snapshot formats.
- Removed from kqqqutzr: HashMap/Range/imara_diff imports,
ConflictRegion::num_refine_pairs/refine_pair_indices, all refine
functions (conflict_pair_sections, conflict_refine_pair, WordTokens,
refine_diff), and refine tests
- Added to wkqtnzvn: same content restored plus 3 new refine tests
(refine_diff_identical_sections, refine_diff_single_word_change,
refine_diff_completely_different) from descendant ponzynvy
- Fixed old ours_content/theirs_content → current_content/incoming_content
in those descendant tests (signature changed in wkqtnzvn)
Add helix-core/src/conflict.rs with a parser for VCS merge conflict
markers and navigation helpers. Supports git 2-way, git diff3 3-way,
and jj snapshot N-way formats from the start.
ConflictRegion uses a Vec<Section> model (SectionKind: Side/Base) that
works uniformly across all formats. Helper functions use current/incoming
terminology instead of ours/theirs.
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 67ef31d5b988238dd797d409d6f9574278e20537 to fa04a1451ff1842e2626ccb99004d0195b455a88.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](https://github.com/dtolnay/rust-toolchain/compare/67ef31d5b988238dd797d409d6f9574278e20537...fa04a1451ff1842e2626ccb99004d0195b455a88)
---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
dependency-version: fa04a1451ff1842e2626ccb99004d0195b455a88
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.82.2 to 2.82.7.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/9e1e5806d4a4822de933115878265be9aaa786d9...16b05812d776ae1dfaabc8277e421fb6d2506419)
---
updated-dependencies:
- dependency-name: taiki-e/install-action
dependency-version: 2.82.7
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the rust-dependencies group with 5 updates in the / directory:
| Package | From | To |
| --- | --- | --- |
| [arc-swap](https://github.com/vorner/arc-swap) | `1.9.1` | `1.9.2` |
| [arrayvec](https://github.com/bluss/arrayvec) | `0.7.7` | `0.7.8` |
| [anyhow](https://github.com/dtolnay/anyhow) | `1.0.102` | `1.0.103` |
| [ignore](https://github.com/BurntSushi/ripgrep) | `0.4.26` | `0.4.27` |
| [open](https://github.com/Byron/open-rs) | `5.3.5` | `5.3.6` |
Updates `arc-swap` from 1.9.1 to 1.9.2
- [Changelog](https://github.com/vorner/arc-swap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/vorner/arc-swap/commits)
Updates `arrayvec` from 0.7.7 to 0.7.8
- [Release notes](https://github.com/bluss/arrayvec/releases)
- [Changelog](https://github.com/bluss/arrayvec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bluss/arrayvec/compare/0.7.7...0.7.8)
Updates `anyhow` from 1.0.102 to 1.0.103
- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.102...1.0.103)
Updates `ignore` from 0.4.26 to 0.4.27
- [Release notes](https://github.com/BurntSushi/ripgrep/releases)
- [Changelog](https://github.com/BurntSushi/ripgrep/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BurntSushi/ripgrep/compare/ignore-0.4.26...ignore-0.4.27)
Updates `open` from 5.3.5 to 5.3.6
- [Release notes](https://github.com/Byron/open-rs/releases)
- [Changelog](https://github.com/Byron/open-rs/blob/main/changelog.md)
- [Commits](https://github.com/Byron/open-rs/compare/v5.3.5...v5.3.6)
---
updated-dependencies:
- dependency-name: arc-swap
dependency-version: 1.9.2
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: arrayvec
dependency-version: 0.7.8
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: anyhow
dependency-version: 1.0.103
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: ignore
dependency-version: 0.4.27
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
- dependency-name: open
dependency-version: 5.3.6
dependency-type: direct:production
update-type: version-update:semver-patch
dependency-group: rust-dependencies
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [gix](https://github.com/GitoxideLabs/gitoxide) from 0.84.0 to 0.85.0.
- [Release notes](https://github.com/GitoxideLabs/gitoxide/releases)
- [Changelog](https://github.com/GitoxideLabs/gitoxide/blob/main/CHANGELOG.md)
- [Commits](https://github.com/GitoxideLabs/gitoxide/compare/gix-v0.84.0...gix-v0.85.0)
---
updated-dependencies:
- dependency-name: gix
dependency-version: 0.85.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [dtolnay/rust-toolchain](https://github.com/dtolnay/rust-toolchain) from 3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 to 67ef31d5b988238dd797d409d6f9574278e20537.
- [Release notes](https://github.com/dtolnay/rust-toolchain/releases)
- [Commits](https://github.com/dtolnay/rust-toolchain/compare/3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9...67ef31d5b988238dd797d409d6f9574278e20537)
---
updated-dependencies:
- dependency-name: dtolnay/rust-toolchain
dependency-version: 67ef31d5b988238dd797d409d6f9574278e20537
dependency-type: direct:production
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.81.8 to 2.82.2.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/0631aa6515c7d545823c67cfae7ef4fc7f490154...9e1e5806d4a4822de933115878265be9aaa786d9)
---
updated-dependencies:
- dependency-name: taiki-e/install-action
dependency-version: 2.82.2
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6...v7)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: '7'
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>