Skip to content

Rebased from Helix upstream - #162

Open
Kruziikrel13 wants to merge 1052 commits into
usagi-flow:mainfrom
Kruziikrel13:rebase/2026.07.19
Open

Kruziikrel13 wants to merge 1052 commits into
usagi-flow:mainfrom
Kruziikrel13:rebase/2026.07.19

Conversation

@Kruziikrel13

@Kruziikrel13 Kruziikrel13 commented Jul 19, 2026 •

Copy link
Copy Markdown

Rebased on Helix from f6f3eb1

Initially just created for personal use. But if I find any regressions during my usage I'll update it here.

Can confirm it builds and runs without any error messages popping up.

archseer and others added 30 commits June 4, 2026 19:50
**Skip diagnostic-highlight construction when there are no diagnostics.**

**O(1) theme highlight lookup.**

`Theme::find_highlight_exact` linearly scanned the theme's ~200-entry
`scopes` vec, called many times per frame on a fixed set of strings.
Build a `scope_index` once at theme load for O(1) look ups.
* languages: point tree-sitter-nix to numtide's more active fork

* languages: update nix queries to match upstream
Bumps [gix](https://github.com/GitoxideLabs/gitoxide) from 0.83.0 to 0.84.0.
- [Release notes](https://github.com/GitoxideLabs/gitoxide/releases)
- [Changelog](https://github.com/GitoxideLabs/gitoxide/blob/main/CHANGELOG.md)
- [Commits](GitoxideLabs/gitoxide@gix-v0.83.0...gix-v0.84.0)

---
updated-dependencies:
- dependency-name: gix
  dependency-version: 0.84.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>
… 6 updates (#15843)

Bumps the rust-dependencies group with 6 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [bitflags](https://github.com/bitflags/bitflags) | `2.11.1` | `2.12.1` |
| [unicode-segmentation](https://github.com/unicode-rs/unicode-segmentation) | `1.13.2` | `1.13.3` |
| [termina](https://github.com/helix-editor/termina) | `0.3.2` | `0.3.3` |
| [log](https://github.com/rust-lang/log) | `0.4.30` | `0.4.32` |
| [chrono](https://github.com/chronotope/chrono) | `0.4.44` | `0.4.45` |
| [cc](https://github.com/rust-lang/cc-rs) | `1.2.62` | `1.2.63` |



Updates `bitflags` from 2.11.1 to 2.12.1
- [Release notes](https://github.com/bitflags/bitflags/releases)
- [Changelog](https://github.com/bitflags/bitflags/blob/main/CHANGELOG.md)
- [Commits](bitflags/bitflags@2.11.1...2.12.1)

Updates `unicode-segmentation` from 1.13.2 to 1.13.3
- [Commits](https://github.com/unicode-rs/unicode-segmentation/commits)

Updates `termina` from 0.3.2 to 0.3.3
- [Changelog](https://github.com/helix-editor/termina/blob/master/CHANGELOG.md)
- [Commits](helix-editor/termina@v0.3.2...v0.3.3)

Updates `log` from 0.4.30 to 0.4.32
- [Release notes](https://github.com/rust-lang/log/releases)
- [Changelog](https://github.com/rust-lang/log/blob/master/CHANGELOG.md)
- [Commits](rust-lang/log@0.4.30...0.4.32)

Updates `chrono` from 0.4.44 to 0.4.45
- [Release notes](https://github.com/chronotope/chrono/releases)
- [Changelog](https://github.com/chronotope/chrono/blob/main/CHANGELOG.md)
- [Commits](chronotope/chrono@v0.4.44...v0.4.45)

Updates `cc` from 1.2.62 to 1.2.63
- [Release notes](https://github.com/rust-lang/cc-rs/releases)
- [Changelog](https://github.com/rust-lang/cc-rs/blob/main/CHANGELOG.md)
- [Commits](rust-lang/cc-rs@cc-v1.2.62...cc-v1.2.63)

---
updated-dependencies:
- dependency-name: bitflags
  dependency-version: 2.12.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rust-dependencies
- dependency-name: unicode-segmentation
  dependency-version: 1.13.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: termina
  dependency-version: 0.3.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: log
  dependency-version: 0.4.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: chrono
  dependency-version: 0.4.45
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rust-dependencies
- dependency-name: cc
  dependency-version: 1.2.63
  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>
tree-house lets the inner @variable win otherwise, so a non-builtin call
(`render widget`) highlighted as a variable instead of a call
This will be used by the cargo indent-check xtask to validate queries,
similar to the existing indent tests in helix-core.
usagi-flow and others added 28 commits July 28, 2026 08:41
…mode behave exactly like Vim (usagi-flow#69)

* Simplify evil_move_word_impl, fixing bugs

The function `evil_move_word_impl` can be simplified, thereby fixing the
following two bugs in the process:

1. In select mode, the key sequence `wb` would result in a selection,
   instead of being a no-op as in Vim.

2. The functions `evil_next_word_end` and `evil_next_long_word_end`
   (mapped to 'e' and 'E') in normal mode would make the cursor land on
   the space after the word, instead of the last character of the word.

The only problem with this commit is that now the functions
`evil_next_word_start` and `evil_next_long_word_start` (mapped to `w`
and `W`) don't behave correctly anymore, making the cursor land
on the space before the next word. We'll fix it in the next commit.

* Fix `w` and `W`

1. Space before word: when the cursor is on the space before a word, and
   you hit `w`, Vim will move the cursor to this word, but evil-helix
   would skip the word and move to the _next_ word.

2. Punctuation: when the cursor is on the letter 'f' in "foo.bar qux",
   and you hit `w` twice, Vim will move the cursor to the letter 'b',
   but evil-helix would skip to the letter 'q'.

   This bug has the same underlying cause as the previous one, and the
   fix for both is to move the cursor one character to the left before
   doing the word move.

3. Regression: the previous commit, simplifying `evil_move_word_impl`,
   introduced a bug where `w` would make the cursor land on the space
   before the next word, instead of _on_ the next word. Fix it by moving
   the cursor one character to the right again after the word move.

4. Newlines: when the cursor is on the 'f' in "foo\nbar", and you hit
   `w`, Vim will move the cursor to the letter 'b' (so to the next
   line), but evil-helix would move the cursor onto the newline
   character. See the changes in `reached_target` for the fix.

Fixes usagi-flow#44
The configuration option `default-yank-register` was added to Helix in
helix-editor/helix#11430.

Evil helix issue: usagi-flow#53.
* add `same_line` movement commands (#768)

Commands added:
* `move_same_line_char_left`
* `move_same_line_char_right`
* `extend_same_line_char_left`
* `extend_same_line_char_right`
* `append_mode_same_line`

These new commands move cursors, while making them stay in the same
line. So if a cursor would wrap around into another line, instead it
won't move and stay at its current position.

* add `anchored` movement commands

Commands added:
* `move_anchored_line_up`
* `move_anchored_line_down`
* `move_anchored_visual_line_up`
* `move_anchored_visual_line_down`
* `extend_anchored_line_up`
* `extend_anchored_line_down`
* `extend_anchored_visual_line_up`
* `extend_anchored_visual_line_down`

These new commands move cursors vertically. A cursor will move depending
on its position:

* If it is on a newline character of a non-empty line, the cursor will
  stay on newlines (i.e. on a line's last character).

* If it is on a non-newline character of a non-empty line, the cursor
  will try to avoid newline characters. It will move normally, but if
  it would end up on a newline, instead it will be moved one position
  left of it (i.e. the line's second to last character).

* If it is on the newline character of an empty line (that contains
  nothing except the newline character), the cursor will continue to
  move like before: If it stayed on newline before, it will continue to
  do so. Otherwise it will try to avoid them (except on empty lines).

* feat(evil): make the new (vim-like) movement default

* feat(evil): ensure selections are collapsed when appending

---------

Co-authored-by: Pantos <pantos+github@akk.org>
* Squashed commit of the following:

commit b5bf68129b56dc0178a61b7e22151decf82a25da
Merge: d1517c6a 207829e
Author: SoraTenshi <dream@neoncity.dev>
Date:   Thu May 25 19:53:22 2023 +0200

    Merge branch 'master' into colored-indent-guides

commit d1517c6a4b9b09609df03d984f4e890ec1998c26
Author: SoraTenshi <dream@neoncity.dev>
Date:   Sun Feb 12 22:18:41 2023 +0100

    Update to new TextRenderer

    Docs

    fmt

commit 7f47756b6d3d9119e1e426d7df48221d9019265c
Author: Michael Davis <mcarsondavis@gmail.com>
Date:   Mon Jul 11 19:10:57 2022 -0500

    Parse rainbow style array in themes

    This change adds a field to the schema of themes which takes a
    list of styles.

        rainbow = ["red", "orange", "yellow", { modifiers = ["reversed"] }]
        [palette]
        red = "#ff0000"
        orange = "#ffa500"
        yellow = "#fff000"

    Normal style rules apply for each element in `rainbows`: you can
    use definitions from the palette and the full fg/bg/modifiers
    notation.

    Themes written with `rainbow` keys are not backwards compatible.
    Parsing errors will be generated for older versions of Helix
    attempting to use themes with `rainbow` keys.

    A default rainbow is provided with base16 colors.

    This change is made with rainbow pair characters (parens, brackets, etc.)
    in mind but it could also be used for other rainbow cosmetic elements
    like rainbow indent-guides.

* fix: avoid panic, properly set rainbow_length when loading theme

* feat: define a rainbow palette for the catppuccin themes
* Add scaffolding for visual line mode

Doesn't do anything yet.

* Implement visual line mode
* feat(evil): map } and { to ]p and [p without selection

* feat(evil): add } and { vim movements
* feat(evil): add Vim-style * and # key search

* fix(evil): match */# search by word boundaries

Co-authored-by: Thomas Miedema <157521+thomie@users.noreply.github.com>

* feat(evil): stop */# search if selection is empty

If cursor is over an empty string, */# will do nothing except displaying
a message, "No string under cursor".

* fix(evil): */# is case insensitive if smart-case is true

If search.smart-case is true then search is case insensitive (like Vim)
otherwise it's case senstive

* feat(evil): */# searches the nearest non-blank word

If cursor on blank, */# searches for the next closest word in the line.

* feat(evil): */# searches the nearest 'keyword'

Here, a 'keyword' is a helix word that starts with a char, ch, that satisfies:
	ch.is_alphanumeric() || ch == '_' charachter

feat: */# searches the nearest 'keyword'

* fix(evil): */# ignore helix very last line

* refactor(evil): remove redundant movement logic in */#

Clarified that Helix 'word' is used as the equivalent of Vim's default
'keyword'. Also removed the unused Movement parameter.

* fix(evil): */# searches only primary cursor/selection

Multi cursor can cause different unwanted behavior, including panicking
on Helix very last line (~).

* perf(evil): */# test a single char under cursor

* feat(evil): */# exit select mode like Vim

* feat(evil): make */# search always case-insensitive

Achieved by prepending The regex command (?i) to search

* refactor(evil): format code

* refactor(evil): comments

---------

Co-authored-by: Thomas Miedema <157521+thomie@users.noreply.github.com>
Co-authored-by: 兎の流れ <2804556+usagi-flow@users.noreply.github.com>
…(`amd64-linux-musl`) (usagi-flow#113)

* feat(ci): add a release build target for `x86_64-unknown-linux-musl` (`amd64-linux-musl`)

* refactor(ci): cleanup
If the cursor was not at the end of the selection range, but the range
end was a newline, `append_mode_same_line` would cause the cursor to
jump to a wrong position.

See helix-editor/helix#10576 (comment)
for details.
* refactor(evil): move the default evil keymap into a separate module

* chore(evil): take over new upstream key bindings
* fix command `append_mode_same_line`

If the cursor was not at the end of the selection range, but the range
end was a newline, `append_mode_same_line` would cause the cursor to
jump to a wrong position.

See helix-editor/helix#10576 (comment)
for details.

* generate docs for new movement commands
* feat(evil): introduce text objects

* feat(evil): "surrounding char" text objects

* feat(evil): paragraphs, quotes, backticks, tags

* refactor(evil): cleanup, disable unused textobjects
@Kruziikrel13

Copy link
Copy Markdown
Author

I've been using a fork that integrates this PR and some other changes without issues for the past few months.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.