Commit Graph

30 Commits (ac0e677fae088ef4ccf252411857346c649656cd)

Author SHA1 Message Date
Nik Revenco 7478d9e688 refactor: extract as variable 2025-03-25 11:55:05 +00:00
Nik Revenco f54fdef099 refactor: remove extra layer of sync 2025-03-25 11:46:36 +00:00
Nik Revenco 07c69c1e74 fix: update blame when editing config 2025-03-24 04:00:02 +00:00
Nik Revenco 29f442887a feat: Inline Git Blame
fix: use relative path when finding file

style: cargo fmt

_

chore: better error message

refactor: rename to `blame_line`

fix: use line of primary cursor for git blame

feat: basic implementation of blocking Blame handler

feat: implement basic virtual text (end of line blame)

feat: figure out how to draw stuff at the end of lines

feat: implement end of line virtual text for the current line

feat: implement inline git blame

chore: clean up

chore: remove unused import

_

chore: set `blame` to `false` by default

docs: document `[editor.vcs.blame]`

chore: add progress

perf: use background task for worker

_

chore: remove unnecessary panic!s

chore: remove commented code

refactor: remove some layers of abstraction

refactor: remove nesting

feat: [editor.vcs] -> [editor.version-control]

fix: account for inserted and deleted lines

_

refactor: extract into a `blame` module

feat: allow using custom commit format

feat: allow more customizability for inline blame

test: add tests for custom inline commit parsser

refactor: rename `blame` -> `blame_line`

_

_

test: create helper macros for tests

test: make test syntax more expressive. Allow specifying line numbers
that just got added

test: with interspersed lines

feat: add `line_blame` static command

_

test: add an extra test case

test: add ability to have `delete`d lines

test: fix on windows (?)

test: `delete` test case

test: add extra step to test case

test: add documentation for macro

refactor: use `hashmap!` macro

refactor: collapse match arm

fix: remove panic

perf: update inline git blame every 150 milliseconds instead of on each
command

test: add attributes on blocks

style: move function earlier in the file

perf: cache blame results in a hashma

chore: remove log statements

chore: clean up.

ALSO: removes checking for inline blame every N seconds.

_

perf: use mspc instead of busy-wait

docs: add information why we don't optimize the repo

_

test: add back the commented out tests

chore: comment out cfg(not(windows))

test: add extra history to blame test

docs: remove incorrect static command

_

test: disable test on windows

feat: send inline blame event update when reloading or saving the
document

feat: rename `version-control` -> `inline-blame`

feat: update theme key used for inline-blame

chore: remove unused #![allow]

chore:

style: remove accidental formatting

docs: remove incorrect key

perf: Use a single `ThreadSafeRepository` instead of re-constructing it
each time

feat: add `inline_blame` static command bound to `space + B`

style: revert formatting in keymap.md

chore: do not compute blame for document when changing config option

This isn't needed anymore because the inline-blame will be computed
regardless if `inline_blame.enable` is set or not

style: remove newline

refactor: use `fold` instead of loop

chore: clean up

feat: log error forl line blame when it happens

feat: improve message when we don't have the blame

We know that we don't have it because we're still calculating it.

feat: do not render inline blame for empty lines

_

feat: do not show blame output when we are on a hunk that was added

refactor: remove additional wrapper methods

fix

_

feat: more readable time for git blame

chr

feat:

feat: improved error handling

fix: path separator on Windows

test: disable on windows

refactor: move pretty date function formatter into `helix-stdx`

perf: do not use a syscall on each render

chore: add TODO comment to update gix version

chore: use `gix::path` conversion from Path -> BString

_

_

chore: do not update file blame on document save

This is not needed because when we write the file, we don't make a new
commit so the blame will not change.

refactor: use statics to get time elapsed instead of editor state

refactor: do not use custom event, use handler instead

fix: do not spawn a new handler

docs: correct examples for `editor.inline-blame.format`

docs: correct static command name

refactor: add comments, and improve variable names

I didn't really understand this function when I made it. Was just
copy-pasted from end of line diagnostics

I wanted to know what this is actually doing, so I investigated and
while doing this also added comments and improved names of variables
so others can understand too

fix: time in future is accounted for

perf: inline some functions that are called in only 1 place, during a
render loop

perf: add option to disable requesting inline blame in the background

fix: request blame again when document is reloaded

chore: inline blame is disabled with request on demand

feat: when requesting line blame with "blame on demand", show blame in
status

perf: use less allocations

perf: less allocations in `format_relative_time`

_

_

_

_

docs: correct name of command

_

feat: improve error message

_

feat: rename enum variants for inline blame behaviour

docs: improve description of behaviour field
2025-03-24 00:32:29 +00:00
Nik Revenco 0ee5850016
Color swatches ( 🟩 green 🟥 #ffaaaa ) (#12308) 2025-03-23 16:07:02 -05:00
Michael Davis 7e7a98560e
LSP: Eagerly decode request results in the client
Previously the `call` helper (and its related functions) returned a
`serde_json::Value` which was then decoded either later in the client
(see signature help and hover) or by the client's caller. This led to
some unnecessary boilerplate in the client:

    let resp = self.call::<MyRequest>(params);
    Some(async move { Ok(serde_json::from_value(resp.await?)?) })

and in the caller. It also allowed for mistakes with the types. The
workspace symbol request's calling code for example mistakenly decoded a
`lsp::WorkspaceSymbolResponse` as `Vec<lsp::SymbolInformation>` - one of
the untagged enum members (so it parsed successfully) but not the
correct type.

With this change, the `call` helper eagerly decodes the response to a
request as the `lsp::request::Request::Result` trait item. This is
similar to the old helper `request` (which has become redundant and has
been eliminated) but all work is done within the same async block which
avoids some awkward lifetimes. The return types of functions like
`Client::text_document_range_inlay_hints` are now more verbose but it is
no longer possible to accidentally decode as an incorrect type.

Additionally `Client::resolve_code_action` now uses the `call_with_ref`
helper to avoid an unnecessary clone.
2025-03-22 14:40:29 -04:00
Michael Davis ab56f9e26b
minor: Tweak some verbose LSP logs
The info log within `process_request_response` duplicated the body of
the JSON message printed earlier by the transport which was confusing.

The error log in the completion handler was easy to hit during normal
use and is not actually an error - dropping is the graceful way to
handle changes occurring while completion requests are in flight.
2025-03-04 11:25:11 -05:00
Harishankar G df752bbd45
Prevent auto-format in auto-save (#12817)
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
2025-02-12 12:11:01 -06:00
Michael Davis 70d452db3e
core: Make completion item documentation optional
Path completion items always have documentation but future core (i.e.
non-LSP) completions may not always have documentation - for example
word completion from the current buffer.
2025-02-01 21:24:25 -05:00
Pascal Kuthe 5c1f3f814f
implement incomplete completion requests 2025-02-01 19:36:10 -05:00
Michael Davis 1ab35ade2d
minor: Move `CompletionEvent` to a new completion handler module
Completions are not specific to LSP anymore. In the child commits we
will expand on the types in this module so this refactor is done
eagerly to minimize changes later.
2025-02-01 19:32:37 -05:00
Pascal Kuthe 018081a5b1
core: Add a provider type to track the origin of a completion 2025-02-01 19:32:37 -05:00
Michael Davis c9dc940428
Fix byte/char indexing mix-up in path completion
The positions passed to `Transaction::change_by_selection` should be
character indexes. `edit_diff` is meant to track the number of
characters that should be deleted to erase the file name that has been
typed so far (if any). Mistakenly this was using `str::len` which is
the byte count. This fixes a bug that could cause more text to be
deleted than intended or a panic when completing a directory with
multi-byte characters like 'éclair'.

This change also moves the `edit_diff` binding out of the loop since
it's now performing some non-trivial work (counting characters, where
before it was just accessing the pre-computed number of bytes).
2025-01-29 10:05:21 -05:00
kyfanc 9829ac0c02
Cycle through hover results from multiple language servers (#10122)
Co-authored-by: Vladyslav Karasov <36513243+cotneit@users.noreply.github.com>
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
2025-01-26 11:24:50 -06:00
TornaxO7 fa27ae16a7
Add path completion for multiple cursors (#12550) 2025-01-23 14:31:12 -06:00
Pascal Kuthe 1badd9e434
implement snippet tabstop support 2024-12-17 13:34:40 -05:00
Pascal Kuthe 5537e68b5e
add `changes` and `ghost_transaction` to DocumentDidChange events 2024-12-17 13:34:40 -05:00
RoloEdits cbbeca6c52
fix(clippy): suppress `unused` lint on windows (#12107) 2024-11-22 08:10:11 -06:00
Philipp Mildenberger dc941d6d24
Add support for path completion (#2608)
Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
Co-authored-by: Pascal Kuthe <pascalkuthe@pm.me>
2024-11-21 21:12:36 -06:00
Pascal Kuthe 7283ef881f
only show inline diagnostics after a delay 2024-07-15 16:36:29 +02:00
Michael Davis dca952c03a
Delay auto-save until exiting insert mode (#11047)
Saving while in insert mode causes issues with the modification
indicator and this is very easy to reproduce with the current state of
the auto-save hook. We can tweak the hook slightly to await the mode
switch out of insert mode to perform the save.

The debounce is preserved: if you save and then immediately exit insert
mode the debounce will be respected. If the debounce lapses while you
are in insert mode, the save occurs as you switch out of insert mode
immediately.
2024-06-29 11:08:21 +09:00
Hendrik Wolff 265608a3d8
Auto Save All Buffers After A Delay (#10899)
* auto save after delay

* configable

* clearer names

* init

* working with some odd behaviour

* working with greater consistency

* Apply reviewer suggestions

- Remove unneccessary field
- Remove blocking save

* Improve auto-save configuration

Auto save can be configured to trigger on focus loss:
```toml
auto-save.focus-lost = true|false
```

and after a time delay (in milli seconds) since last keypress:
```toml
auto-save.after-delay.enable = true|false
auto-save.after-delay.timeout = [0, u64::MAX] # default: 3000
```

* Remove boilerplate and unnecessary types

* Remove more useless types

* Update docs for auto-save.after-delay

* Fix wording of (doc) comments relating to auto-save

* book: Move auto-save descriptions to separate section

---------

Co-authored-by: Miguel Perez <miguelvojito@gmail.com>
Co-authored-by: Miguel Perez <perezoji@cs.fsu.edu>
2024-06-11 00:39:06 +02:00
Michael Davis 6f1437e9f3
LSP: Resolve completion items when any info is missing (#10873) 2024-06-06 13:28:10 +09:00
Michael Davis 5c11af1479 `cargo fmt` 2024-05-07 15:15:52 -04:00
Hichem cfca30887c
signature: use the suggested LSP signature when changed (#10655)
some LSPs does update the active signature and some not. To make both
worlds happy, make the active signature more intelligent.

1. SignatureHelp store now the suggested lsp_signature
2. if the lsp_signature changes then use it
3. otherwise use the last signature from the old popup
4. in case the old signature doesn't exist anymore, show the last signature

Signed-off-by: Ben Fekih, Hichem <hichem.f@live.de>
2024-05-03 03:53:07 +02:00
Pascal Kuthe 38ee845b05 don't overload LS with completion resolve requests
While moving completion resolve to the event system in #9668 we introduced what
is essentially a "DOS attack" on slow LSPs. Completion resolve requests were
made in the render loop and debounced with a timeout. Once the timeout expired
the resolve request was made. The problem is the next frame would immediately
request a new completion resolve request (and mark the old one as obsolete but
because LSP has no notion of cancelation the server would still process it). So
we were in essence sending one completion request to the server every 150ms and
only stopped if the server managed to respond before we rendered a new frame.
This caused overload on slower machines/with slower LS.

In this PR I revamped the resolve handler so that a request is only ever
resolved once. Both by checking if a request is already in-flight and by marking
failed resolve requests as resolved.
2024-04-22 12:27:47 +09:00
Pascal Kuthe b834806dbc use newtype parttern for langauge server id 2024-04-22 12:27:47 +09:00
Hichem 69e08d9e91
allow cycling through function signatures/overloads (#9974)
implement handle_event to cycle through the function signatures.

To change the signature press alt+p/n .

Signed-off-by: Ben Fekih, Hichem <hichem.f@live.de>
2024-04-16 20:57:22 +02:00
nkitsaini 787cc36092
fix LSP ComplitionTriggerKind value for `TriggerKind::Auto` (#9660) 2024-02-19 13:58:17 +01:00
Pascal Kuthe 8e592a151f refactor completion and signature help using hooks 2024-01-23 11:20:19 +09:00