mirror of
https://github.com/helix-editor/helix.git
synced 2024-11-22 09:26:19 +04:00
Fix panic from two windows editing the same document (#4570)
* Clamp highlighting range to be within document This fixes a panic possible when two vsplits of the same document exist and enough lines are deleted from the document so that one of the windows focuses past the end of the document. * Ensure cursor is in view on window change If two windows are editing the same document, one may delete enough of the document so that the other window is pointing at a blank page (past the document end). In this change we ensure that the cursor is within view whenever we switch to a new window (for example with `<C-w>w`). * Update helix-term/src/ui/editor.rs Co-authored-by: Blaž Hrastnik <blaz@mxxn.io> Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>
This commit is contained in:
parent
1bed2f3043
commit
ba394dca6d
@ -227,16 +227,16 @@ pub fn doc_syntax_highlights<'doc>(
|
||||
_theme: &Theme,
|
||||
) -> Box<dyn Iterator<Item = HighlightEvent> + 'doc> {
|
||||
let text = doc.text().slice(..);
|
||||
let last_line = std::cmp::min(
|
||||
// Saturating subs to make it inclusive zero indexing.
|
||||
(offset.row + height as usize).saturating_sub(1),
|
||||
doc.text().len_lines().saturating_sub(1),
|
||||
);
|
||||
|
||||
let range = {
|
||||
// calculate viewport byte ranges
|
||||
let start = text.line_to_byte(offset.row);
|
||||
let end = text.line_to_byte(last_line + 1);
|
||||
// Calculate viewport byte ranges:
|
||||
// Saturating subs to make it inclusive zero indexing.
|
||||
let last_line = doc.text().len_lines().saturating_sub(1);
|
||||
let last_visible_line = (offset.row + height as usize)
|
||||
.saturating_sub(1)
|
||||
.min(last_line);
|
||||
let start = text.line_to_byte(offset.row.min(last_line));
|
||||
let end = text.line_to_byte(last_visible_line + 1);
|
||||
|
||||
start..end
|
||||
};
|
||||
|
@ -1223,9 +1223,11 @@ pub fn resize(&mut self, area: Rect) {
|
||||
pub fn focus(&mut self, view_id: ViewId) {
|
||||
let prev_id = std::mem::replace(&mut self.tree.focus, view_id);
|
||||
|
||||
// if leaving the view: mode should reset
|
||||
// if leaving the view: mode should reset and the cursor should be
|
||||
// within view
|
||||
if prev_id != view_id {
|
||||
self.mode = Mode::Normal;
|
||||
self.ensure_cursor_in_view(view_id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1234,9 +1236,11 @@ pub fn focus_next(&mut self) {
|
||||
self.tree.focus_next();
|
||||
let id = self.tree.focus;
|
||||
|
||||
// if leaving the view: mode should reset
|
||||
// if leaving the view: mode should reset and the cursor should be
|
||||
// within view
|
||||
if prev_id != id {
|
||||
self.mode = Mode::Normal;
|
||||
self.ensure_cursor_in_view(id);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user