Commit Graph

2094 Commits (cf9669f276dc223323d526d3dcf7c1bbc67a3922)

Author SHA1 Message Date
wongjiahau eb9287d816 fix(ci): cargo fmt and windows test 2 years ago
WJH 1108c883c4
Merge branch 'master' into tree_explore 2 years ago
gibbz00 2cf4ce2356
Fix `shrink_selection` with multiple cursors. (#6093)
* Fix #6092

Cause were some incorrect assumptions that missed an edge case in the
`Selection.contains()` calculation. Tests were added accordingly.

* Fix Selection.contains() edge-case handling.

Removing the len check short-circuit was the only thing needed as
pointed out by @dead10ck.
2 years ago
Pascal Kuthe aabc8af95d correctly store snapshots when repeating insert-mode actions
Repeating completions currently crates a savepoint when a completion
popup was triggered (so after the request completed). Just like for
normal completions the savepoint must be created at the request.

The occurrence of the completion request was previously not saved in
`last_insert`. To that end a new `InsertEvent::RequestCompletion`
variant has been added. When replayed this event creates a snapshot
that is "actived" by the `TriggerCompletion` event and subsequently
used during any `InsertEvent::CompletiuonApply` events.
2 years ago
Pascal Kuthe 8cb7cdfd7a discard stale completion requests
Completion requests are computed asynchronously to avoid common micro
freezes while editing. This means that once a completion request
completes, the state of the editor might have changed. Currently,
there is a check to ensure we are still in insert mode. However,
we also need to ensure that the view and document hasn't changed
to avoid accidentally using a savepoint with the wrong view/document.

Furthermore, the editor might request a new completion while the
previous completion request hasn't complemented yet. This can
lead to weird flickering or an outdated completion request replacing
a newer completion that has already completed (the LSP server
is not required to process completion requests in order). This change
also needed to ensure determinism/linear ordering so that completion
popup always correspond to the last completion request.
2 years ago
Pascal Kuthe e8898fd9a8 store multiple snapshots on the document at once
Fixing autocomplete required moving the document savepoint before the
asynchronous completion request. However, this in turn causes new bugs:

If the completion popup is open, the savepoint is restored when the
popup closes (or another entry is selected). However, at that point
a new completion request might already have been created which
would have replaced the new savepoint (therefore leading to incorrectly
applied complies).

This commit fixes that bug by allowing in arbitrary number of
savepoints to be tracked on the document. The savepoints are reference
counted and therefore remain valid as long as any reference to them
remains. Weak reference are stored on the document and any reference
that can not be upgraded anymore (hence no strong reference remain)
are automatically discarded.
2 years ago
Pascal Kuthe 2588fa3710 save selection before completion savepoint
Currently, the selection is not saved/restored when completion
checkpoints are applied. This is usually fine because undoing changes
usually restores maps selections back in insert mode. But this is not
always the case and especially problematic in the presence of
multi-cursor completions (since completions are applied relative to
the selection/cursor) and snippets (which can change the selection)
2 years ago
Pascal Kuthe 4300a3ad05 create savepoint before requesting completion 2 years ago
wongjiahau d043ea4db4 Merge branch 'master' of https://github.com/helix-editor/helix into tree_explore 2 years ago
wongjiahau 10032eb156 fix(ci): cargo fmt 2 years ago
Kyle Smith 44ff8a1df1
LSP: Support textDocument/prepareRename (#6103)
* LSP: Support textDocument/prepareRename

'textDocument/prepareRename' can be used by the client to ask the
server the range of the symbol under the cursor which would be changed
by a subsequent call to 'textDocument/rename' with that position.

We can use this information to fill the prompt with an accurate prefill
which can improve the UX for renaming symbols when the symbol doesn't
align with the "word" textobject. (We currently use the "word"
textobject as a default value for the prompt.)

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>

* clippy fixes

* rustfmt

* Update helix-term/src/commands/lsp.rs

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>

* Update helix-term/src/commands/lsp.rs

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>

* fix clippy from suggestions

* Update helix-term/src/commands/lsp.rs

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>

---------

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
2 years ago
Clément Delafargue 8dd1ab4899
Softwrapping improvements (#5893)
* use max_line_width + 1 during softwrap to account for newline char

Helix softwrap implementation always wraps lines so that the newline
character doesn't get cut off so he line wraps one chars earlier then
in other editors. This is necessary, because newline chars are always
selecatble in helix and must never be hidden.

However That means that `max_line_width` currently wraps one char
earlier than expected. The typical definition of line width does not
include the newline character and other helix commands like `:reflow`
also don't count the newline character here.

This commit makes softwrap use `max_line_width + 1` instead of
`max_line_width` to correct the impedance missmatch.

* fix typos

Co-authored-by: Jonathan Lebon <jonathan@jlebon.com>

* Add text-width to config.toml

* text-width: update setting documentation

* rename leftover config item

* remove leftover max-line-length occurrences

* Make `text-width` optional in editor config

When it was only used for `:reflow` it made sense to have a default
value set to `80`, but now that soft-wrapping uses this setting, keeping
a default set to `80` would make soft-wrapping behave more aggressively.

* Allow softwrapping to ignore `text-width`

Softwrapping wraps by default to the viewport width or a configured
`text-width` (whichever's smaller). In some cases we only want to set
`text-width` to use for hard-wrapping and let longer lines flow if they
have enough space. This setting allows that.

* Revert "Make `text-width` optional in editor config"

This reverts commit b247d526d69adf41434b6fd9c4983369c785aa22.

* soft-wrap: allow per-language overrides

* Update book/src/configuration.md

Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>

* Update book/src/languages.md

Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>

* Update book/src/configuration.md

Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>

---------

Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>
Co-authored-by: Jonathan Lebon <jonathan@jlebon.com>
Co-authored-by: Alex Boehm <alexb@ozrunways.com>
Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>
2 years ago
Kyle Smith f4bdbe4674
Do not add intermediate lines to jumplist with :<linenum> command. (#5751)
* Do not add intermediate lines to jumplist with :<linenum> command.

* Revert jumplist index changes.

* Reduce calculations during update cycle.

* Use jumplist for undo, set jumplist before preview.

* remove some debug logging

* Revert "remove some debug logging"

This reverts commit 5772c4327e7121c53ea0726a4d7333ae1c413ffb.

* Revert "Use jumplist for undo, set jumplist before preview."

This reverts commit f73a1b29824feaf16477b9df547fb28d9db81923.

* Add last_selection, update implementation.

* @pascalkuthe initial feedback

* Ensure ":goto 123" keybinding works as expected.

* fix clippies, prefer expect() for expect last_selection state
2 years ago
Michael Davis 0c6d25acae
DynamicPicker: Recalculate column widths for new options (#6004)
This fixes blank row text in a DynamicPicker which is initially given
no options. This can happen for language servers which respond to
the workspace symbol request for an empty query with an empty list
of symbols, and that behavior is somewhat common since returning all
symbols as the spec suggests is very expensive.

For empty options, `Picker::new` calculated the widths of each column
as 0. We can recalculate the column widths when the new options are
set to fix this. This refactor is also a good opportunity to formalize
setting new options on a picker: besides setting the new options and
calculating column widths we also want to reset the cursor and rescore
the options.
2 years ago
Michael Davis 6dc017b9e2
Jump to symbol ranges in LSP goto commands (#5986)
This follows prior changes like 42ad1a9e: we select the range given
by the language server rather than the starting point.
2 years ago
Michael Davis 170593161c
LSP: Send replies for malformed and unhandled RPC requests (#6058)
Previously we did not respond to malformed or unhandled LSP requests.
The JSONRPC spec says that all non-notification requests must have
responses:

> When a rpc call is made, the Server MUST reply with a Response,
> except for in the case of Notifications

(Note that Helix is the "Server" in this case. Also from the spec:
"The Server is defined as the origin of Response objects and the
handler of Request objects.")

So this change sends error replies for requests which can't be parsed
or handled. Request IDs are also now added to the log messages for
unhandled requests.
2 years ago
Michael Davis 3d85024717 Move terminal claim/restore code to helix-tui
This moves the `Application::claim_term` and
`helix-term::application::restore_term` functions into the helix-tui
crate. How the terminal should be claimed and restored is a TUI concern
and is implemented differently through different TUI backends.

This cleans out a lot of crossterm and TUI code in Application and
makes it easier to modify claim/restore based on information we query
from the terminal host. The child commit will take advantage of this
to cache the check for whether the host terminal supports the keyboard
enhancement protocol. Without this change, caching that information
takes much more code which is not easily reusable for anything else.

The code to restore the terminal is somewhat duplicated by this patch:
we want to restore the terminal in cases of panics. Panic handler hooks
must live for `'static` and the Application's terminal does not.
2 years ago
Pascal Kuthe 48b6aa9a69
Add command for resetting diff hunks (#5736) 2 years ago
Andrii Grynenko 8c2e447b16 Handle snippets for LSPs not providing offsets for completion 2 years ago
Andrii Grynenko 1866b43cd3 Render every LSP snippets for every cursor
This refactors the snippet logic to be largely unaware of the rest of
the document. The completion application logic is moved into
generate_transaction_from_snippet which is extended to support
dynamically computing replacement text.
2 years ago
Pascal Kuthe ba24cfe912 Delete snippet placeholders when accepting completion
When accepting a snippet completion we automatically delete the
placeholders for now as doing so manual is quite cumbersome. In the
future we should keep these as a mark + virtual text that is
automatically removed once the cursor moves there.
2 years ago
Michael Davis b9b1ec2208 Apply snippets as transactions 2 years ago
Davide Galassi f976c004e2
Allow LSP server to be stopped (#5964) 2 years ago
wongjiahau 9726ae7dbb fix(ci/test): failing on Windows 2 years ago
wongjiahau d1e6a21016 Merge branch 'master' of https://github.com/helix-editor/helix into tree_explore 2 years ago
wongjiahau d62b487321 feat(ui/tree): undo breaking changes
- bind tree-based movements to other keys, namely J,K,H,L
2 years ago
wongjiahau aa6780e149 feat(ui/tree): tree-based movements 2 years ago
dependabot[bot] 84be5cd52c
build(deps): bump grep-regex from 0.1.10 to 0.1.11 (#6215)
Bumps [grep-regex](https://github.com/BurntSushi/ripgrep) from 0.1.10 to 0.1.11.
- [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/grep-regex-0.1.10...0.1.11)

---
updated-dependencies:
- dependency-name: grep-regex
  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>
2 years ago
dependabot[bot] c00baf7da6
build(deps): bump grep-searcher from 0.1.10 to 0.1.11 (#6213)
Bumps [grep-searcher](https://github.com/BurntSushi/ripgrep) from 0.1.10 to 0.1.11.
- [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/grep-searcher-0.1.10...0.1.11)

---
updated-dependencies:
- dependency-name: grep-searcher
  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>
2 years ago
Filip Dutescu 376c19e06b
feat(dap): implement Restart request (#5651)
Add a restart debug session command, which would issue a
[Restart Request][1], if the debugger supports it and a session is
running. It uses the same arguments and requests used to start the
initial session, when recreating it.

It builds upon #5532, making use of the changes to the termination
workflow of a session.

[1]: https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Restart

Closes: #5594

Signed-off-by: Filip Dutescu <filip.dutescu@gmail.com>
2 years ago
wongjiahau bc62b7615d fix(ci): failing windows test & clippy 2 years ago
wongjiahau d3db1b6204 style(tree): improve ancestor contrast 2 years ago
wongjiahau 8ef95ee56a Merge branch 'master' of https://github.com/helix-editor/helix into tree_explore 2 years ago
Santiago Vrancovich 39d5fb0e59
Remove centering view from Unimpaired commands (#6193)
Remove `align_view` calls from `goto_*_diag` as per issue #6177
2 years ago
nuid32 def26966d2
Fix lacking space panic (#6109)
* Fix lack of space for popup crash

* Fix saturating -> wrapping

* Fix wrapping -> saturating (I am an idiot)

* Remove useless "mut" in helix-tui/src/buffer.rs

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>

* Remove redundant bound-check

* Return bound-check back

* Add bound-check for set_style

* Remove set_style bound-check

* Revert bound-check

---------

Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
2 years ago
Pascal Kuthe ccdb144665 update MSRV to 1.65 2 years ago
Alexander Brevig a2e54167d8
fix: Handle signals before crossterm events (#6170)
This is a workaround for a freeze when suspending Helix with C-z on
non-Windows systems. The check for the keyboard enhancement protocol
locks up crossterm's internal event reading/polling system by trying to
set up multiple concurrent readers. `input_stream.next()` sets up one
reader looking for regular crossterm events while the
`supports_keyboard_enhancement` query sets up another looking for
internal events. The latter hangs for two seconds or until the former
yields an event. By handling signals first we don't lock up the mutex
by trying to read keyboard events.
2 years ago
nuid32 ddc5bf4e60
Fix 'attempt to divide by zero' panic (#6155) 2 years ago
wongjiahau a4943a7226 fix(explorer/overlay): prompt overflow
- Previously the prompt appears within the float, which has very limited
  space
- Now, the prompt will be rendered at the editor command area
2 years ago
wongjiahau c2e2f050da feat(explorer/delete): no need to press Enter, just press y
Reference: https://github.com/helix-editor/helix/pull/5768#issuecomment-1449536275
2 years ago
wongjiahau 43b226a2ab feat(explorer/keymap): combine 'a' with 'A'
Reference: https://github.com/helix-editor/helix/pull/5768#issuecomment-1449536275
2 years ago
NomisIV c082ef2863
Fix indentation lines (#6134) (#6136) 2 years ago
Michael Davis 27211abf06
Ignore key-release keyboard events (#6139)
Since crossterm 0.26.x, we receive press/release keyboard events on
Windows always. We can ignore the release events though to emulate
the behavior of keyboard input on Windows on crossterm 0.25.x.
2 years ago
wongjiahau 19d436ee56 Merge branch 'master' of https://github.com/helix-editor/helix into tree_explore 2 years ago
wongjiahau b18a9746e9 fix(explorer): go to previous root does not update state.current_root 2 years ago
lesleyrs 8dab8a0a03 Add shift-backspace keybind alias for backspace (#4937)
When the Kitty Keyboard Protocol is enabled, S-backspace is
distinguished from backspace with no modifiers. This is awkward when
typing because it's very easy to accidentally hold shift and press
backspace temporarily when typing capital letters.

Kakoune (which is also a Kitty Keyboard Protocol application) treats
S-backspace as backspace too:
3150e9b3cd/src/input_handler.cc (L1275)
2 years ago
Michael Davis a066815833 Enable the enhanced keyboard protocol if supported 2 years ago
Michael Davis 79bf5e3094 Update crossterm to 0.26.1
Crossterm 0.26.x includes a breaking change for the command to set the
cursor shape. This commit includes a change which uses the new type.
2 years ago
wongjiahau 8379669742 Merge branch 'master' of https://github.com/helix-editor/helix into tree_explore 2 years ago
wongjiahau fae4990444 test(tree): search prompt and filter prompt 2 years ago
dependabot[bot] f02fdd2f73
build(deps): bump tempfile from 3.3.0 to 3.4.0 (#6128)
Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.3.0 to 3.4.0.
- [Release notes](https://github.com/Stebalien/tempfile/releases)
- [Changelog](https://github.com/Stebalien/tempfile/blob/master/NEWS)
- [Commits](https://github.com/Stebalien/tempfile/commits)

---
updated-dependencies:
- dependency-name: tempfile
  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>
2 years ago
wongjiahau 7e4feb02ef fix(explore): search using previous search word after filter does not work
- Also implemented restore_saved_view for filter and search
2 years ago
wongjiahau 4a0c620b77 fix(explorer/filter): not working for newly opened folder 2 years ago
WJH c3b8be978e
fix(ci): clippy + failure on Windows 2 years ago
wongjiahau 5d600fef0f doc(helix-term/.gitignore): document purpose of test-explorer 2 years ago
wongjiahau 601f2c4e5f chore(ui/tree): remove useless comments 2 years ago
wongjiahau ba00a80037 fix(tree): shouldn't use patched font 2 years ago
wongjiahau 24b50bb525 feat(explorer): toggle preview 2 years ago
wongjiahau 38ef079099 feat(tree): jump forward 2 years ago
wongjiahau b5d92aca45 chore: fix clippy warnings 2 years ago
wongjiahau 36769cb3f6 fix(explorer/keymap): change 'b' to 'B'
- to not clash with Tree 'zb'
2 years ago
wongjiahau dffbc15067 refactor(explorer,tree): remove unwrap to avoid panics 2 years ago
wongjiahau cf9b60a3d1 feat(tree): sticky ancestors 2 years ago
Yusuf Bera Ertan e5af0f1d49
build(nix): update flake to use flake-parts and nci flake-parts module 2 years ago
wongjiahau 9205117505 fix: failing tests 2 years ago
wongjiahau 6af9a06e74 feat(explorer): bind "="/"_" to "Zoom in"/"Zoom out" 2 years ago
wongjiahau 899491ba25 feat(tree): add C-n/C-p keybinding 2 years ago
wongjiahau f9ff01dd9c chore(ui/tree): bind 'o' to Toggle 2 years ago
wongjiahau 7b63fda7d2 test(explorer): add integration tests 2 years ago
wongjiahau 6321dc9ade chore: rename explore to explorer 2 years ago
wongjiahau 78bb29732a Merge branch 'master' of https://github.com/helix-editor/helix into add-integration-test 2 years ago
wongjiahau bcb1672378 fix(explore):
- preview panics when term height becomes too small
- preview content not sorted
2 years ago
wongjiahau a259c205c0 fix(explore): help overflow
- render with Info
2 years ago
wongjiahau 2e7709e505 MULTI
- refactor(explore):Move filter to Tree
- feat(explore): Implement mkdir -p (but not tested yet)
- feat(ui/tree): Implement jump backward
- test(ui/tree): Refresh
2 years ago
Filip Dutescu 44729fbaf9
fix(dap): validate key and index exist when requesting vars (#5628)
Check if the stack frames contain the thread id and the frame before
trying to get the frame id. If case any of the two fails to be
found, provide the user with messages to inform them of the issue and
gracefully return.

Closes: #5625

Signed-off-by: Filip Dutescu <filip.dutescu@gmail.com>
2 years ago
Filip Dutescu e3765ac6d2
feat(dap): send Disconnect if Terminated event received (#5532)
Send a `Disconnect` DAP request if the `Terminated` event is received.
According to the specification, if the debugging session was started by
as `launch`, the debuggee should be terminated alongside the session. If
instead the session was started as `attach`, it should not be disposed of.

This default behaviour can be overriden if the `supportTerminateDebuggee`
capability is supported by the adapter, through the `Disconnect` request
`terminateDebuggee` argument, as described in
[the specification][discon-spec].

This also implies saving the starting command for a debug sessions, in
order to decide which behaviour should be used, as well as validating the
capabilities of the adapter, in order to decide what the disconnect should
do.

An additional change made is handling of the `Exited` event, showing a
message if the exit code is different than `0`, for the user to be aware
off the termination failure.

[discon-spec]: https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Disconnect

Closes: #4674

Signed-off-by: Filip Dutescu <filip.dutescu@gmail.com>
2 years ago
wongjiahau 2e654a0775 refactor(explore): move search function to Tree 2 years ago
wongjiahau 2a60662e8b feat(explore): add focus indicator 2 years ago
wongjiahau 64059fba47 feat(tree): move left/right 2 years ago
Guillaume 78a1e2db60
feat: show current language when no argument is provided (#5895) 2 years ago
Triton171 a1a6d5f334
Replace incorrect usages of tab_width with indent_width. (#5918) 2 years ago
Erasin b7fb52d0e4
fix: decode lsp url for workspace_diagnostics_picker (#6016) 2 years ago
Jonathan LEI 9368ac76b3
Ignore invalid file URIs from LSP (#6000) 2 years ago
wongjiahau c88164f2fa feat(tree-view): add unit tests 2 years ago
wongjiahau 4dfa8696bd style(tree): increase indentation 2 years ago
Pascal Kuthe c332b16855
ignore case while filtering completions (#6008) 2 years ago
Michael Davis d8526a752c
Use Popup::ignore_escape_key helper for completion (#6006)
The completion component has a separate branch for handling the
Escape key but it can use the `ignore_escape_key` helper added for
signature-help instead.

This should not cause a behavior change - it's just cleaning up the
completion component.
2 years ago
wongjiahau 70984fd148 Merge branch 'master' of https://github.com/helix-editor/helix into refactor-tree-explorer 2 years ago
wongjiahau ef73559a8e fix(explore): cannot focus explorer if no opened document 2 years ago
wongjiahau c8578ba3cc fix: warnings 2 years ago
wongjiahau 94e2c2989b fix(command): space e does not focus explorer when no files are opened 2 years ago
Pascal Kuthe 715c4b24d9
Fix crash in goto_window_center at EOF (#5987) 2 years ago
wongjiahau 72495363f1 fix(explore): 'h' does not realign preview properly 2 years ago
wongjiahau 9bd534bb6f fix(explore): filter 2 years ago
wongjiahau 85fa1c56b7 feat(explore):
- filter
- close document if the file is deleted or renamed
2 years ago
wongjiahau a079477a23 fix(compile): warnings 2 years ago
wongjiahau 56056e8556 fix(explore): increase size will cause panic 2 years ago
wongjiahau b38a941955 feat(explore): close without clearing previous state 2 years ago
wongjiahau 2c221f0af1 fix(explore): help page overflow 2 years ago
wongjiahau 35ffc6036d feat(explore): increase/decrease explorer size 2 years ago