Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Git) diff gutter implementation #3890

Merged
merged 5 commits into from
Dec 1, 2022

Conversation

pascalkuthe
Copy link
Member

@pascalkuthe pascalkuthe commented Sep 18, 2022

Supercedes #1623.

I took this PR up as the original PR was tagged as waiting-for-author/inactive.

This PR is rebased on the current master to avoid conflicts.
Additionally, I have updated the PR with some improvements.
The design is now much more similar to the design suggested by @p-e-w.

The original author already did most of the work by implementing incremental diffing.
However, I have now streamlined the git interface.
The incremental diff only requires that git provides the head state of a file while the rest is handled by helix.
Therefore, I have simplified the git interface down to one function: get_file_head.
This interface is now provided by a trait, that is implemented for git but is trivial to implement for other diff sources as well and could be exposed to the plugin system in the future.

The original PR cached the git repositories in memory.
This has been removed because it did not handle nested repositories correctly (example: $HOME as git repo for dotfile management).
It's also not required anymore as the git repo is only accessed when a file is open instead of every keystroke.

Finally, I have improved the git implementation by switching to gitoxide (as suggested in the original PR).
During this switch, I found a few edge cases that were not handled correctly by the previous implementation:

  • Non utf-8 encoded files were not supported (now uses document encoding)
  • Directories/symlinks that were replaced by files would use the directory children/link path as the diff base (now the diff is not shown)

I have purposefully not added more features to this PR to keep it somewhat small and reviewable.
In the future, I would like to expand on this PR.
In particular, I would like to implement a mechanism to reload the diff base after a file is first opened.
This avoids having to call :reload helix after every commit, to continue receiving correct diffs.
However, this feature is more complex (requires watching .git) so I choose not to include it here.

Currently, all commits are separate to make review easier.
I would like to squash the commits before this is merged, as the implementation changed quite a bit.

Note that there is currently one test failing in helix-core but that seems completely unrelated as the PR does not touch anything in helix-core

@pascalkuthe
Copy link
Member Author

pascalkuthe commented Sep 18, 2022

It seems the pipeline is failing because gitoxide has MSVR of 1.59 but helix currently targets 1.57. Gitoxide has been targeting newer versions for quite a while so downgrading doesn't seem like an option. I am not sure what the policy on MSRV is for helix, perhaps a MSVR bump to 1.59 could be possible. Even Ubuntu has updated to 1.59 at this point so it seems a reasonable requirement

@the-mikedavis
Copy link
Member

the-mikedavis commented Sep 18, 2022

We set the MSRV a while back, we're probably ok to update now (though that should be done separately from this PR). I think we set it to 1.57 on account of Void linux.

Is gitoxide really necessary though? It adds a very significant number of transitive dependencies (285 crates to build where master has 179 and with git2 we have 189) and compile time. The transitive dependencies also seem to add new compile-time dependencies on cmake and make (libz-sys).

@kirawi kirawi added A-helix-term Area: Helix term improvements S-waiting-on-review Status: Awaiting review from a maintainer. labels Sep 18, 2022
@pascalkuthe
Copy link
Member Author

Whether gitoxide or git2-rs is used doesn't make too much difference for this PR.
I was able to convert my implementation to git2-rs fairly quickly

I was able to remove the zlib-ng native dependency by disabling the gitoxide default features (this costs some performance but is hardly relevant for our use-case), git2-rs can be compiled in vendored mode. This means no matter what implementation we use, no dependency on system libraries is introduced.
In that case the compile times are similar (clean debug build 27s git2-rs vs 27.5s gitoxide on my machine).

I think compile times are the main concern here, because both projects are currently used in cargo/will be used in cargo in the near future and are maintained by trusted members of the rust community so supply/maintenance concerns should not be a problem. Furthermore comparing number of dependencies between the project does not really make sense because git2-rs contains 350k LOC of C in a single crate, while gitoxide simply spreads its functionality across multiple crates.

I believe gitoxide is preferable because its development is much more active and its written in rust.
Contributing to libgit2 is more difficult than contributing to gitoxide, because contributing to such a large C project is very difficult (the usual problems with C) compared to rust.

I hope that git support is expanded upon in helix in the future.
If we run into issues with gi2 in during that process, we can not do much about it because even longstanding issues of much larger projects (like cargo) are undressed. By comparison contributing to gitoxide is much easier.

I personally believe that trading 0,5 seconds of compile time for a cleaner/easier to fix git implementation is worth but for this PR it doesn't make a difference so I could easily change the git implementation if that is preferred.

@pascalkuthe
Copy link
Member Author

I have discovered that the current diffing implementation I reused from #1623 has major shortcomings. I am working on improving this but it will take a while

@poliorcetics
Copy link
Contributor

Very much in support of gitoxide too, because 1) it would help @Byron know if there are any missing features that would be useful for helix and have more real-life testing 2) it's very easy to contribute to 3) less C to build means users will have much less unexpected problems because of unrelated-to-helix causes

@Byron
Copy link
Contributor

Byron commented Sep 19, 2022

Thanks for pinging me! It's exciting to see gitoxide in helix, the editor 'of the new kind' that I liked most thus far and want to use ❤️!

Just now I was thinking about adding a line-counter to ein tool hours -p (now 15% faster than git at 1/10th of the peak memory) which would probably be the moment where this plumbing-level implementation of diffing I did when switching crates-index-diff (powering docs.rs) to gitoxide would turn into an easy-to-use API for consumption by everyone without sacrificing performance. I wanted to move on and postpone once again as to me this is 'candy' even though I have a lot of cargo related work to do… but now I think it's worth to see how fast I can put a higher-level API around the plumbing code that would hopefully also work here one day.

@pascalkuthe Thanks for this PR and for running the numbers, I never did and was positively surprised the compile times are only marginally different. I also took a look at the code and understand gitoxide is currently used to pull the base-object bytes to compare to out of the object database, with the diffing happening on top of that.
I also hope that in future iterations it will be possible to re-use the Repository instance as discovering a git repository is costly in terms of IOps.
Additionally I recommend to set a ceiling-directory for the discovery to assure that files that aren't in a git-repo don't cause it to look up to the root of the filesystem, if that such a ceiling is known at all - maybe the CWD could work initially? Since only the ODB is required here, one should probably adjust the open-options to not load global git configuration, but rely only on the repository-local one to avoid waste. The code for that is a bit cumbersome, but starship already went through the trouble and the result could be copied from there. Also note how it uses the git:: namespace to access many of the types, which helps to see more meaningful type names.

That said, I think it's safe to say that if helix-editor chooses to use gitoxide, I'd be there for instant-support as far as my sleep-cycle permits :D, and would make sure you get the fastest and most efficient git implementation available.

@pascalkuthe pascalkuthe force-pushed the git-diff-sign branch 3 times, most recently from 58e4ace to 402a59a Compare September 19, 2022 22:52
helix-vcs/Cargo.toml Outdated Show resolved Hide resolved
helix-vcs/src/git.rs Outdated Show resolved Hide resolved
helix-vcs/src/git/test.rs Show resolved Hide resolved
@pascalkuthe
Copy link
Member Author

In the previous PR diffing was implemented using the helix internal changeset after a suggestion by @archseer.
While using this PR in practice I noticed that this approach does not work well.
The helix internal diffs are meant to allow helix to efficiently apply edits to the text and not to produce a human readable diff.
It is possible to fix this up somewhat (as the original PR did) but the fixup in the original PR was pretty naive and did not produce good results.
For example removing a character produced a removed line symbol, adding it back did not change that, inserting new test after that character adds more removed line symbols.

I have invested quite a bit of effort into improving this and have fixed the most horrible cases.
However this still does not work well. The problem essentially boils down to the fact that a linediff is fundamentally different from a character diff and trying to construct one from the other doesn't really work.

Therefore I decided to abandon this approach and instead use a more traditional async diff approach that is used in other editors (I looked at nvim-gitsgins and micro mainly).
This implementation simply spawns an async task for each file that computes the diff on each file change.
I have spend quite a bit of time optimizing this to address to comment made in the original PR regarding duplicate allocations.
While this approach might not scale as-well to huge files as the other approach it is still plenty fast enough for any reasonable sized file. I have added a check that disables the diffing in case files get too huge to ensure helix is still able to deal large files.

The implementation (even with optimizations) is much simpler and more maintainable than the UI fixup code I had developed for the changset based approach while providing much better results. I did not notice any significant different between the async-diff and changset implementation for normal-sized files. Furthermore the performance could be improved further by optimizing the line iterator cessen/ropey#25 and potentially using a different diffing algorithm (histogram diffs should outperform patience and mayer for sourcecode: mitsuhiko/similar#9).

@Byron thanks for reaching out/the review/the support. I had my hands full with this and work today but I will take a look at the git implementation again tomorrow :)

book/src/configuration.md Outdated Show resolved Hide resolved
helix-vcs/src/git.rs Outdated Show resolved Hide resolved
helix-vcs/Cargo.toml Outdated Show resolved Hide resolved
helix-vcs/Cargo.toml Outdated Show resolved Hide resolved
helix-vcs/Cargo.toml Outdated Show resolved Hide resolved
@kirawi
Copy link
Member

kirawi commented Sep 20, 2022

There are quite a few grammar mistakes in the comments. Should these be addressed in a follow-up PR so as to not clog up this one?

@pascalkuthe
Copy link
Member Author

There are quite a few grammar mistakes in the comments. Should these be addressed in a follow-up PR so as to not clog up this one?

I am still working on incorporating the suggestions from @Byron, once that is done I will quickly go trough all my comments again with a spellchecker. I hope that catches most things. I also think that further grammer fixes might then be better bundeled into a follow up PRs.

helix-view/src/document.rs Outdated Show resolved Hide resolved
Comment on lines 22 to 24
Async,
SyncWithTimeout,
Sync,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need all the strategies? If not I'd rather just keep a single one to simplify the code

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think they are all still required, as they serve different orhogonal usecases:

  • SyncWithTimeout: Is the standard strategy used in apply_impl this will perform the diff in parallel and block the rendering until it is completed or the timout is expired. If the timeout expires before the diff completes a new redraw will be requsted
  • Sync: Same as SyncWithTimeout but without the timeout (so the rendering always waits for the diff to complete). This will be required for side by side diffing where it would look extremely jarring if the the virtual text updates asynchronously and used instead of SyncWithTimeout in apply_impl.
  • Async: An update of the diff_base trigger by something externally (for example when something is staged/a commit is updated). This strategy is required because it will not be triggered during the rendering. Therefore it always needs to request a new redraw event.

Note that I found a slight shortcoming in the locking code that required some small refactors (explained below) and removed this enum in the process but the three cases remain

helix-vcs/src/diff.rs Outdated Show resolved Hide resolved
helix-vcs/src/diff.rs Outdated Show resolved Hide resolved
helix-vcs/src/diff.rs Outdated Show resolved Hide resolved
pascalkuthe and others added 4 commits November 28, 2022 20:00
Avoid string allocation when git diffing

Incrementally diff using changesets

refactor diffs to be provider indepndent and improve git implementation

remove dependency on zlib-ng

switch to asynchronus diffing with similar

Update helix-vcs/Cargo.toml

fix toml formatting

Co-authored-by: Ivan Tham <[email protected]>

fix typo in documentation

use ropey reexpors from helix-core

fix crash when creating new file

remove useless use if io::Cursor

fix spelling mistakes

implement suggested improvement to repository loading

improve git test isolation

remove lefover comments

Co-authored-by: univerz <[email protected]>

fixed spelling mistake

minor cosmetic changes

fix: set self.differ to None if decoding the diff_base fails

fixup formatting

Co-authored-by: Ivan Tham <[email protected]>

reload diff_base when file is reloaded from disk

switch to imara-diff

Fixup formatting

Co-authored-by: Blaž Hrastnik <[email protected]>

Redraw buffer whenever a diff is updated.

Only store hunks instead of changes for individual lines to easily allow
jumping between them

Update to latest gitoxide version

Change default diff gutter position

Only update gutter after timeout
Co-authored-by: Blaž Hrastnik <[email protected]>
Co-authored-by: Michael Davis <[email protected]>
@pascalkuthe
Copy link
Member Author

pascalkuthe commented Nov 28, 2022

I tested how often a delay of 12 is actually reached.
It turns out that the even if the timeout is reached there is rarely noticable delay on my PC with treesitter enabled because for files that are large enough to slow down the diff, the treesittter parser is often slower then the diff anyway (in that case the async redraw request is automatically canceled) so I had to test with :lang text.

However on my machine the rendering then happened so fast that the render occurs before the DiffWorker was scheduled by tokio and aquired the lock. I have refactored the code a bit so that the lock is acquired synchronously to prevent that.

All changes were included in a separate commit so you don't need to re-review the existing commits (I only force pushed because I rebased on master to resolve the Cargo.lock conflict)). Ideally this branch should be squashed before it's merged.

@pascalkuthe pascalkuthe requested a review from archseer November 28, 2022 19:13
@@ -149,6 +153,14 @@ pub struct Config {
deserialize_with = "deserialize_duration_millis"
)]
pub idle_timeout: Duration,
/// Time in milliseconds since last keypress before a redraws trigger.
/// Used for redrawing asynchronously computed UI components, set to 0 for instant.
/// Defaults to 100ms.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Says it defaults to 100 but the code uses 200. We should set this to DIFF_DEBOUNCE_TIME_ASYNC maybe? Or double that.

I also think this shouldn't be configurable by end users because it's easy to misconfigure (same as idle-timeout which really shouldn't be 0 but it's set to 0 by a lot of users). If complaints come in we can always make it smarter or configurable at that point.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes a lot of sense. I was trying to follow the precedent of the idle-timeout.
I hard-coded this to 96ms (DIFF_DEBOUNCE_TIME_ASYNC)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for hijacking with something unrelated to this PR. I want to mention that the current documentation explicitly states “set to 0 for instant” so if 0 is a bad idea that section could be altered to explain why 0 ought to be avoided and what’d be recommended instead

@archseer archseer merged commit 5a3ff74 into helix-editor:master Dec 1, 2022
@archseer
Copy link
Member

archseer commented Dec 1, 2022

Merged! 🎉 Thanks for all the hard work on this, including patching ropey and developing imara-diff!

@poliorcetics
Copy link
Contributor

I concur, incredible work, thanks for this a lot !

@Proful
Copy link

Proful commented Dec 1, 2022

Looking great. Thank you!
image

@PORTALSURFER
Copy link
Contributor

PORTALSURFER commented Dec 3, 2022

this features does not work well on windows where line endings use crlf
#4989

@xJonathanLEI
Copy link
Contributor

Maybe submit a separate issue instead?

netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Dec 7, 2022
Rework the pkgsrc infrastructure to simplify tree-sitter-depends.mk, rewrite
the awk script to simplify things and support regular awk, and put it in the
usual place.  Also add support for Darwin (where this was tested).

# 22.12 (2022-12-06)

This is a great big release filled with changes from a 99 contributors. A big _thank you_ to you all!

As usual, the following is a summary of each of the changes since the last release.
For the full log, check out the [git log](https://github.com/helix-editor/helix/compare/22.08.1..22.12).

Breaking changes:

- Remove readline-like navigation bindings from the default insert mode keymap ([e12690e](helix-editor/helix@e12690e), [#3811](helix-editor/helix#3811), [#3827](helix-editor/helix#3827), [#3915](helix-editor/helix#3915), [#4088](helix-editor/helix#4088))
- Rename `append_to_line` as `insert_at_line_end` and `prepend_to_line` as `insert_at_line_start` ([#3753](helix-editor/helix#3753))
- Swap diagnostic picker and debug mode bindings in the space keymap ([#4229](helix-editor/helix#4229))
- Select newly inserted text on paste or from shell commands ([#4458](helix-editor/helix#4458), [#4608](helix-editor/helix#4608), [#4619](helix-editor/helix#4619), [#4824](helix-editor/helix#4824))
- Select newly inserted surrounding characters on `ms<char>` ([#4752](helix-editor/helix#4752))
- Exit select-mode after executing `replace_*` commands ([#4554](helix-editor/helix#4554))
- Exit select-mode after executing surround commands ([#4858](helix-editor/helix#4858))
- Change tree-sitter text-object keys ([#3782](helix-editor/helix#3782))
- Rename `fleetish` theme to `fleet_dark` ([#4997](helix-editor/helix#4997))

Features:

- Bufferline ([#2759](helix-editor/helix#2759))
- Support underline styles and colors ([#4061](helix-editor/helix#4061), [98c121c](helix-editor/helix@98c121c))
- Inheritance for themes ([#3067](helix-editor/helix#3067), [#4096](helix-editor/helix#4096))
- Cursorcolumn ([#4084](helix-editor/helix#4084))
- Overhauled system for writing files and quiting ([#2267](helix-editor/helix#2267), [#4397](helix-editor/helix#4397))
- Autosave when terminal loses focus ([#3178](helix-editor/helix#3178))
- Use OSC52 as a fallback for the system clipboard ([#3220](helix-editor/helix#3220))
- Show git diffs in the gutter ([#3890](helix-editor/helix#3890), [#5012](helix-editor/helix#5012), [#4995](helix-editor/helix#4995))
- Add a logo ([dc1ec56](helix-editor/helix@dc1ec56))
- Multi-cursor completion ([#4496](helix-editor/helix#4496))

Commands:

- `file_picker_in_current_directory` (`<space>F`) ([#3701](helix-editor/helix#3701))
- `:lsp-restart` to restart the current document's language server ([#3435](helix-editor/helix#3435), [#3972](helix-editor/helix#3972))
- `join_selections_space` (`A-j`) which joins selections and selects the joining whitespace ([#3549](helix-editor/helix#3549))
- `:update` to write the current file if it is modified ([#4426](helix-editor/helix#4426))
- `:lsp-workspace-command` for picking LSP commands to execute ([#3140](helix-editor/helix#3140))
- `extend_prev_word_end` - the extend variant for `move_prev_word_end` ([7468fa2](helix-editor/helix@7468fa2))
- `make_search_word_bounded` which adds regex word boundaries to the current search register value ([#4322](helix-editor/helix#4322))
- `:reload-all` - `:reload` for all open buffers ([#4663](helix-editor/helix#4663), [#4901](helix-editor/helix#4901))
- `goto_next_change` (`]g`), `goto_prev_change` (`[g`), `goto_first_change` (`[G`), `goto_last_change` (`]G`) textobjects for jumping between VCS changes ([#4650](helix-editor/helix#4650))

Usability improvements and fixes:

- Don't log 'LSP not defined' errors in the logfile ([1caba2d](helix-editor/helix@1caba2d))
- Look for the external formatter program before invoking it ([#3670](helix-editor/helix#3670))
- Don't send LSP didOpen events for documents without URLs ([44b4479](helix-editor/helix@44b4479))
- Fix off-by-one in `extend_line_above` command ([#3689](helix-editor/helix#3689))
- Use the original scroll offset when opening a split ([1acdfaa](helix-editor/helix@1acdfaa))
- Handle auto-formatting failures and save the file anyway ([#3684](helix-editor/helix#3684))
- Ensure the cursor is in view after `:reflow` ([#3733](helix-editor/helix#3733))
- Add default rulers and reflow config for git commit messages ([#3738](helix-editor/helix#3738))
- Improve grammar fetching and building output ([#3773](helix-editor/helix#3773))
- Add a `text` language to language completion ([cc47d3f](helix-editor/helix@cc47d3f))
- Improve error handling for `:set-language` ([e8add6f](helix-editor/helix@e8add6f))
- Improve error handling for `:config-reload` ([#3668](helix-editor/helix#3668))
- Improve error handling when passing improper ranges to syntax highlighting ([#3826](helix-editor/helix#3826))
- Render `<code>` tags as raw markup in markdown ([#3425](helix-editor/helix#3425))
- Remove border around the LSP code-actions popup ([#3444](helix-editor/helix#3444))
- Canonicalize the path to the runtime directory ([#3794](helix-editor/helix#3794))
- Add a `themelint` xtask for linting themes ([#3234](helix-editor/helix#3234))
- Re-sort LSP diagnostics after applying transactions ([#3895](helix-editor/helix#3895), [#4319](helix-editor/helix#4319))
- Add a command-line flag to specify the log file ([#3807](helix-editor/helix#3807))
- Track source and tag information in LSP diagnostics ([#3898](helix-editor/helix#3898), [1df32c9](helix-editor/helix@1df32c9))
- Fix theme returning to normal when exiting the `:theme` completion ([#3644](helix-editor/helix#3644))
- Improve error messages for invalid commands in the keymap ([#3931](helix-editor/helix#3931))
- Deduplicate regexs in `search_selection` command ([#3941](helix-editor/helix#3941))
- Split the finding of LSP root and config roots ([#3929](helix-editor/helix#3929))
- Ensure that the cursor is within view after auto-formatting ([#4047](helix-editor/helix#4047))
- Add pseudo-pending to commands with on-next-key callbacks ([#4062](helix-editor/helix#4062), [#4077](helix-editor/helix#4077))
- Add live preview to `:goto` ([#2982](helix-editor/helix#2982))
- Show regex compilation failure in a popup ([#3049](helix-editor/helix#3049))
- Add 'cycled to end' and 'no more matches' for search ([#3176](helix-editor/helix#3176), [#4101](helix-editor/helix#4101))
- Add extending behavior to tree-sitter textobjects ([#3266](helix-editor/helix#3266))
- Add `ui.gutter.selected` option for themes ([#3303](helix-editor/helix#3303))
- Make statusline mode names configurable ([#3311](helix-editor/helix#3311))
- Add a statusline element for total line count ([#3960](helix-editor/helix#3960))
- Add extending behavior to `goto_window_*` commands ([#3985](helix-editor/helix#3985))
- Fix a panic in signature help when the preview is too large ([#4030](helix-editor/helix#4030))
- Add command names to the command palette ([#4071](helix-editor/helix#4071), [#4223](helix-editor/helix#4223), [#4495](helix-editor/helix#4495))
- Find the LSP workspace root from the current document's path ([#3553](helix-editor/helix#3553))
- Add an option to skip indent-guide levels ([#3819](helix-editor/helix#3819), [2c36e33](helix-editor/helix@2c36e33))
- Change focus to modified docs on quit ([#3872](helix-editor/helix#3872))
- Respond to `USR1` signal by reloading config ([#3952](helix-editor/helix#3952))
- Exit gracefully when the close operation fails ([#4081](helix-editor/helix#4081))
- Fix goto/view center mismatch ([#4135](helix-editor/helix#4135))
- Highlight the current file picker document on idle-timeout ([#3172](helix-editor/helix#3172), [a85e386](helix-editor/helix@a85e386))
- Apply transactions to jumplist selections ([#4186](helix-editor/helix#4186), [#4227](helix-editor/helix#4227), [#4733](helix-editor/helix#4733), [#4865](helix-editor/helix#4865), [#4912](helix-editor/helix#4912), [#4965](helix-editor/helix#4965), [#4981](helix-editor/helix#4981))
- Use space as a separator for fuzzy matcher ([#3969](helix-editor/helix#3969))
- Overlay all diagnostics with highest severity on top ([#4113](helix-editor/helix#4113))
- Avoid re-parsing unmodified tree-sitter injections ([#4146](helix-editor/helix#4146))
- Add extending captures for indentation, re-enable python indentation ([#3382](helix-editor/helix#3382), [3e84434](helix-editor/helix@3e84434))
- Only allow either `--vsplit` or `--hsplit` CLI flags at once ([#4202](helix-editor/helix#4202))
- Fix append cursor location when selection anchor is at the end of the document ([#4147](helix-editor/helix#4147))
- Improve selection yanking message ([#4275](helix-editor/helix#4275))
- Log failures to load tree-sitter grammars as errors ([#4315](helix-editor/helix#4315))
- Fix rendering of lines longer than 65,536 columns ([#4172](helix-editor/helix#4172))
- Skip searching `.git` in `global_search` ([#4334](helix-editor/helix#4334))
- Display tree-sitter scopes in a popup ([#4337](helix-editor/helix#4337))
- Fix deleting a word from the end of the buffer ([#4328](helix-editor/helix#4328))
- Pretty print the syntax tree in `:tree-sitter-subtree` ([#4295](helix-editor/helix#4295), [#4606](helix-editor/helix#4606))
- Allow specifying suffixes for file-type detection ([#2455](helix-editor/helix#2455), [#4414](helix-editor/helix#4414))
- Fix multi-byte auto-pairs ([#4024](helix-editor/helix#4024))
- Improve sort scoring for LSP code-actions and completions ([#4134](helix-editor/helix#4134))
- Fix the handling of quotes within shellwords ([#4098](helix-editor/helix#4098))
- Fix `delete_word_backward` and `delete_word_forward` on newlines ([#4392](helix-editor/helix#4392))
- Fix 'no entry found for key' crash on `:write-all` ([#4384](helix-editor/helix#4384))
- Remove lowercase requirement for tree-sitter grammars ([#4346](helix-editor/helix#4346))
- Resolve LSP completion items on idle-timeout ([#4406](helix-editor/helix#4406), [#4797](helix-editor/helix#4797))
- Render diagnostics in the file picker preview ([#4324](helix-editor/helix#4324))
- Fix terminal freezing on `shell_insert_output` ([#4156](helix-editor/helix#4156))
- Allow use of the count in the repeat operator (`.`) ([#4450](helix-editor/helix#4450))
- Show the current theme name on `:theme` with no arguments ([#3740](helix-editor/helix#3740))
- Fix rendering in very large terminals ([#4318](helix-editor/helix#4318))
- Sort LSP preselected items to the top of the completion menu ([#4480](helix-editor/helix#4480))
- Trim braces and quotes from paths in goto-file ([#4370](helix-editor/helix#4370))
- Prevent automatic signature help outside of insert mode ([#4456](helix-editor/helix#4456))
- Fix freezes with external programs that process stdin and stdout concurrently ([#4180](helix-editor/helix#4180))
- Make `scroll` aware of tabs and wide characters ([#4519](helix-editor/helix#4519))
- Correctly handle escaping in `command_mode` completion ([#4316](helix-editor/helix#4316), [#4587](helix-editor/helix#4587), [#4632](helix-editor/helix#4632))
- Fix `delete_char_backward` for paired characters ([#4558](helix-editor/helix#4558))
- Fix crash from two windows editing the same document ([#4570](helix-editor/helix#4570))
- Fix pasting from the blackhole register ([#4497](helix-editor/helix#4497))
- Support LSP insertReplace completion items ([1312682](helix-editor/helix@1312682))
- Dynamically resize the line number gutter width ([#3469](helix-editor/helix#3469))
- Fix crash for unknown completion item kinds ([#4658](helix-editor/helix#4658))
- Re-enable `format_selections` for single selection ranges ([d4f5cab](helix-editor/helix@d4f5cab))
- Limit the number of in-progress tree-sitter query matches ([#4707](helix-editor/helix#4707), [#4830](helix-editor/helix#4830))
- Use the special `#` register with `increment`/`decrement` to change by range number ([#4418](helix-editor/helix#4418))
- Add a statusline element to show number of selected chars ([#4682](helix-editor/helix#4682))
- Add a statusline element showing global LSP diagnostic warning and error counts ([#4569](helix-editor/helix#4569))
- Add a scrollbar to popups ([#4449](helix-editor/helix#4449))
- Prefer shorter matches in fuzzy matcher scoring ([#4698](helix-editor/helix#4698))
- Use key-sequence format for command palette keybinds ([#4712](helix-editor/helix#4712))
- Remove prefix filtering from autocompletion menu ([#4578](helix-editor/helix#4578))
- Focus on the parent buffer when closing a split ([#4766](helix-editor/helix#4766))
- Handle language server termination ([#4797](helix-editor/helix#4797), [#4852](helix-editor/helix#4852))
- Allow `r`/`t`/`f` to work on tab characters ([#4817](helix-editor/helix#4817))
- Show a preview for scratch buffers in the buffer picker ([#3454](helix-editor/helix#3454))
- Set a limit of entries in the jumplist ([#4750](helix-editor/helix#4750))
- Re-use shell outputs when inserting or appending shell output ([#3465](helix-editor/helix#3465))
- Check LSP server provider capabilities ([#3554](helix-editor/helix#3554))
- Improve tree-sitter parsing performance on files with many language layers ([#4716](helix-editor/helix#4716))
- Move indentation to the next line when using `<ret>` on a line with only whitespace ([#4854](helix-editor/helix#4854))
- Remove selections for closed views from all documents ([#4888](helix-editor/helix#4888))
- Improve performance of the `:reload` command ([#4457](helix-editor/helix#4457))
- Properly handle media keys ([#4887](helix-editor/helix#4887))
- Support LSP diagnostic data field ([#4935](helix-editor/helix#4935))
- Handle C-i keycode as tab ([#4961](helix-editor/helix#4961))
- Fix view alignment for jumplist picker jumps ([#3743](helix-editor/helix#3743))
- Use OSC52 for tmux clipboard provider ([#5027](helix-editor/helix#5027))

Themes:

- Add `varua` ([#3610](helix-editor/helix#3610), [#4964](helix-editor/helix#4964))
- Update `boo_berry` ([#3653](helix-editor/helix#3653))
- Add `rasmus` ([#3728](helix-editor/helix#3728))
- Add `papercolor_dark` ([#3742](helix-editor/helix#3742))
- Update `monokai_pro_spectrum` ([#3814](helix-editor/helix#3814))
- Update `nord` ([#3792](helix-editor/helix#3792))
- Update `fleetish` ([#3844](helix-editor/helix#3844), [#4487](helix-editor/helix#4487), [#4813](helix-editor/helix#4813))
- Update `flatwhite` ([#3843](helix-editor/helix#3843))
- Add `darcula` ([#3739](helix-editor/helix#3739))
- Update `papercolor` ([#3938](helix-editor/helix#3938), [#4317](helix-editor/helix#4317))
- Add bufferline colors to multiple themes ([#3881](helix-editor/helix#3881))
- Add `gruvbox_dark_hard` ([#3948](helix-editor/helix#3948))
- Add `onedarker` ([#3980](helix-editor/helix#3980), [#4060](helix-editor/helix#4060))
- Add `dark_high_contrast` ([#3312](helix-editor/helix#3312))
- Update `bogster` ([#4121](helix-editor/helix#4121), [#4264](helix-editor/helix#4264))
- Update `sonokai` ([#4089](helix-editor/helix#4089))
- Update `ayu_*` themes ([#4140](helix-editor/helix#4140), [#4109](helix-editor/helix#4109), [#4662](helix-editor/helix#4662), [#4764](helix-editor/helix#4764))
- Update `everforest` ([#3998](helix-editor/helix#3998))
- Update `monokai_pro_octagon` ([#4247](helix-editor/helix#4247))
- Add `heisenberg` ([#4209](helix-editor/helix#4209))
- Add `bogster_light` ([#4265](helix-editor/helix#4265))
- Update `pop-dark` ([#4323](helix-editor/helix#4323))
- Update `rose_pine` ([#4221](helix-editor/helix#4221))
- Add `kanagawa` ([#4300](helix-editor/helix#4300))
- Add `hex_steel`, `hex_toxic` and `hex_lavendar` ([#4367](helix-editor/helix#4367), [#4990](helix-editor/helix#4990))
- Update `tokyonight` and `tokyonight_storm` ([#4415](helix-editor/helix#4415))
- Update `gruvbox` ([#4626](helix-editor/helix#4626))
- Update `dark_plus` ([#4661](helix-editor/helix#4661), [#4678](helix-editor/helix#4678))
- Add `zenburn` ([#4613](helix-editor/helix#4613), [#4977](helix-editor/helix#4977))
- Update `monokai_pro` ([#4789](helix-editor/helix#4789))
- Add `mellow` ([#4770](helix-editor/helix#4770))
- Add `nightfox` ([#4769](helix-editor/helix#4769), [#4966](helix-editor/helix#4966))
- Update `doom_acario_dark` ([#4979](helix-editor/helix#4979))
- Update `autumn` ([#4996](helix-editor/helix#4996))
- Update `acme` ([#4999](helix-editor/helix#4999))
- Update `nord_light` ([#4999](helix-editor/helix#4999))
- Update `serika_*` ([#5015](helix-editor/helix#5015))

LSP configurations:

- Switch to `openscad-lsp` for OpenScad ([#3750](helix-editor/helix#3750))
- Support Jsonnet ([#3748](helix-editor/helix#3748))
- Support Markdown ([#3499](helix-editor/helix#3499))
- Support Bass ([#3771](helix-editor/helix#3771))
- Set roots configuration for Elixir and HEEx ([#3917](helix-editor/helix#3917), [#3959](helix-editor/helix#3959))
- Support Purescript ([#4242](helix-editor/helix#4242))
- Set roots configuration for Julia ([#4361](helix-editor/helix#4361))
- Support D ([#4372](helix-editor/helix#4372))
- Increase default language server timeout for Julia ([#4575](helix-editor/helix#4575))
- Use ElixirLS for HEEx ([#4679](helix-editor/helix#4679))
- Support Bicep ([#4403](helix-editor/helix#4403))
- Switch to `nil` for Nix ([433ccef](helix-editor/helix@433ccef))
- Support QML ([#4842](helix-editor/helix#4842))
- Enable auto-format for CSS ([#4987](helix-editor/helix#4987))
- Support CommonLisp ([4176769](helix-editor/helix@4176769))

New languages:

- SML ([#3692](helix-editor/helix#3692))
- Jsonnet ([#3714](helix-editor/helix#3714))
- Godot resource ([#3759](helix-editor/helix#3759))
- Astro ([#3829](helix-editor/helix#3829))
- SSH config ([#2455](helix-editor/helix#2455), [#4538](helix-editor/helix#4538))
- Bass ([#3771](helix-editor/helix#3771))
- WAT (WebAssembly text format) ([#4040](helix-editor/helix#4040), [#4542](helix-editor/helix#4542))
- Purescript ([#4242](helix-editor/helix#4242))
- D ([#4372](helix-editor/helix#4372), [#4562](helix-editor/helix#4562))
- VHS ([#4486](helix-editor/helix#4486))
- KDL ([#4481](helix-editor/helix#4481))
- XML ([#4518](helix-editor/helix#4518))
- WIT ([#4525](helix-editor/helix#4525))
- ENV ([#4536](helix-editor/helix#4536))
- INI ([#4538](helix-editor/helix#4538))
- Bicep ([#4403](helix-editor/helix#4403), [#4751](helix-editor/helix#4751))
- QML ([#4842](helix-editor/helix#4842))
- CommonLisp ([4176769](helix-editor/helix@4176769))

Updated languages and queries:

- Zig ([#3621](helix-editor/helix#3621), [#4745](helix-editor/helix#4745))
- Rust ([#3647](helix-editor/helix#3647), [#3729](helix-editor/helix#3729), [#3927](helix-editor/helix#3927), [#4073](helix-editor/helix#4073), [#4510](helix-editor/helix#4510), [#4659](helix-editor/helix#4659), [#4717](helix-editor/helix#4717))
- Solidity ([20ed8c2](helix-editor/helix@20ed8c2))
- Fish ([#3704](helix-editor/helix#3704))
- Elixir ([#3645](helix-editor/helix#3645), [#4333](helix-editor/helix#4333), [#4821](helix-editor/helix#4821))
- Diff ([#3708](helix-editor/helix#3708))
- Nix ([665e27f](helix-editor/helix@665e27f), [1fe3273](helix-editor/helix@1fe3273))
- Markdown ([#3749](helix-editor/helix#3749), [#4078](helix-editor/helix#4078), [#4483](helix-editor/helix#4483), [#4478](helix-editor/helix#4478))
- GDScript ([#3760](helix-editor/helix#3760))
- JSX and TSX ([#3853](helix-editor/helix#3853), [#3973](helix-editor/helix#3973))
- Ruby ([#3976](helix-editor/helix#3976), [#4601](helix-editor/helix#4601))
- R ([#4031](helix-editor/helix#4031))
- WGSL ([#3996](helix-editor/helix#3996), [#4079](helix-editor/helix#4079))
- C# ([#4118](helix-editor/helix#4118), [#4281](helix-editor/helix#4281), [#4213](helix-editor/helix#4213))
- Twig ([#4176](helix-editor/helix#4176))
- Lua ([#3552](helix-editor/helix#3552))
- C/C++ ([#4079](helix-editor/helix#4079), [#4278](helix-editor/helix#4278), [#4282](helix-editor/helix#4282))
- Cairo ([17488f1](helix-editor/helix@17488f1), [431f9c1](helix-editor/helix@431f9c1), [09a6df1](helix-editor/helix@09a6df1))
- Rescript ([#4356](helix-editor/helix#4356))
- Zig ([#4409](helix-editor/helix#4409))
- Scala ([#4353](helix-editor/helix#4353), [#4697](helix-editor/helix#4697), [#4701](helix-editor/helix#4701))
- LaTeX ([#4528](helix-editor/helix#4528), [#4922](helix-editor/helix#4922))
- SQL ([#4529](helix-editor/helix#4529))
- Python ([#4560](helix-editor/helix#4560))
- Bash/Zsh ([#4582](helix-editor/helix#4582))
- Nu ([#4583](helix-editor/helix#4583))
- Julia ([#4588](helix-editor/helix#4588))
- Typescript ([#4703](helix-editor/helix#4703))
- Meson ([#4572](helix-editor/helix#4572))
- Haskell ([#4800](helix-editor/helix#4800))
- CMake ([#4809](helix-editor/helix#4809))
- HTML ([#4829](helix-editor/helix#4829), [#4881](helix-editor/helix#4881))
- Java ([#4886](helix-editor/helix#4886))
- Go ([#4906](helix-editor/helix#4906), [#4969](helix-editor/helix#4969), [#5010](helix-editor/helix#5010))
- CSS ([#4882](helix-editor/helix#4882))
- Racket ([#4915](helix-editor/helix#4915))
- SCSS ([#5003](helix-editor/helix#5003))

Packaging:

- Filter relevant source files in the Nix flake ([#3657](helix-editor/helix#3657))
- Build a binary for `aarch64-linux` in the release CI ([038a91d](helix-editor/helix@038a91d))
- Build an AppImage for `aarch64-linux` in the release CI ([b738031](helix-editor/helix@b738031))
- Enable CI builds for `riscv64-linux` ([#3685](helix-editor/helix#3685))
- Support preview releases in CI ([0090a2d](helix-editor/helix@0090a2d))
- Strip binaries built in CI ([#3780](helix-editor/helix#3780))
- Fix the development shell for the Nix Flake on `aarch64-darwin` ([#3810](helix-editor/helix#3810))
- Raise the MSRV and create an MSRV policy ([#3896](helix-editor/helix#3896), [#3913](helix-editor/helix#3913), [#3961](helix-editor/helix#3961))
- Fix Fish completions for `--config` and `--log` flags ([#3912](helix-editor/helix#3912))
- Use builtin filenames option in Bash completion ([#4648](helix-editor/helix#4648))
herkhinah pushed a commit to herkhinah/helix that referenced this pull request Dec 11, 2022
* Show (git) diff signs in gutter (helix-editor#3890)

Avoid string allocation when git diffing

Incrementally diff using changesets

refactor diffs to be provider indepndent and improve git implementation

remove dependency on zlib-ng

switch to asynchronus diffing with similar

Update helix-vcs/Cargo.toml

fix toml formatting

Co-authored-by: Ivan Tham <[email protected]>

fix typo in documentation

use ropey reexpors from helix-core

fix crash when creating new file

remove useless use if io::Cursor

fix spelling mistakes

implement suggested improvement to repository loading

improve git test isolation

remove lefover comments

Co-authored-by: univerz <[email protected]>

fixed spelling mistake

minor cosmetic changes

fix: set self.differ to None if decoding the diff_base fails

fixup formatting

Co-authored-by: Ivan Tham <[email protected]>

reload diff_base when file is reloaded from disk

switch to imara-diff

Fixup formatting

Co-authored-by: Blaž Hrastnik <[email protected]>

Redraw buffer whenever a diff is updated.

Only store hunks instead of changes for individual lines to easily allow
jumping between them

Update to latest gitoxide version

Change default diff gutter position

Only update gutter after timeout

* update diff gutter synchronously, with a timeout

* Apply suggestions from code review

Co-authored-by: Blaž Hrastnik <[email protected]>
Co-authored-by: Michael Davis <[email protected]>

* address review comments and ensure lock is always aquired

* remove configuration for redraw timeout

Co-authored-by: Blaž Hrastnik <[email protected]>
Co-authored-by: Michael Davis <[email protected]>
freqmod pushed a commit to freqmod/helix that referenced this pull request Feb 8, 2023
* Show (git) diff signs in gutter (helix-editor#3890)

Avoid string allocation when git diffing

Incrementally diff using changesets

refactor diffs to be provider indepndent and improve git implementation

remove dependency on zlib-ng

switch to asynchronus diffing with similar

Update helix-vcs/Cargo.toml

fix toml formatting

Co-authored-by: Ivan Tham <[email protected]>

fix typo in documentation

use ropey reexpors from helix-core

fix crash when creating new file

remove useless use if io::Cursor

fix spelling mistakes

implement suggested improvement to repository loading

improve git test isolation

remove lefover comments

Co-authored-by: univerz <[email protected]>

fixed spelling mistake

minor cosmetic changes

fix: set self.differ to None if decoding the diff_base fails

fixup formatting

Co-authored-by: Ivan Tham <[email protected]>

reload diff_base when file is reloaded from disk

switch to imara-diff

Fixup formatting

Co-authored-by: Blaž Hrastnik <[email protected]>

Redraw buffer whenever a diff is updated.

Only store hunks instead of changes for individual lines to easily allow
jumping between them

Update to latest gitoxide version

Change default diff gutter position

Only update gutter after timeout

* update diff gutter synchronously, with a timeout

* Apply suggestions from code review

Co-authored-by: Blaž Hrastnik <[email protected]>
Co-authored-by: Michael Davis <[email protected]>

* address review comments and ensure lock is always aquired

* remove configuration for redraw timeout

Co-authored-by: Blaž Hrastnik <[email protected]>
Co-authored-by: Michael Davis <[email protected]>
@7ombie
Copy link
Contributor

7ombie commented Aug 21, 2024

Do I have to do something to trigger an update after a commit?

I have a simple repo, and Helix correctly indicates the status while I'm working on the files. However, if I move to different terminal window, add the changes, commit them and push them, Helix does not seem to notice.

If I keep editing after a commit, Helix shows the new changes along with the old (pre-commit) state, as if no commit was made. However, if I quit Helix (after the commit), and restart it, everything works correctly from there.

@pascalkuthe pascalkuthe deleted the git-diff-sign branch August 21, 2024 22:10
@kirawi
Copy link
Member

kirawi commented Aug 21, 2024

You have to do :reload. This will be fixed once the file watcher is implemented.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-helix-term Area: Helix term improvements S-waiting-on-review Status: Awaiting review from a maintainer.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Show git status near line number