mirror of
https://github.com/zed-industries/zed.git
synced 2024-12-28 20:01:33 +00:00
Hide completions when {un,re}doing past initial insertion boundaries
This commit is contained in:
parent
efcbf2714c
commit
f41f1e51a8
1 changed files with 42 additions and 36 deletions
|
@ -3810,7 +3810,6 @@ impl Editor {
|
||||||
T: ToOffset + ToPoint + Ord + std::marker::Copy + std::fmt::Debug,
|
T: ToOffset + ToPoint + Ord + std::marker::Copy + std::fmt::Debug,
|
||||||
{
|
{
|
||||||
let buffer = self.buffer.read(cx).snapshot(cx);
|
let buffer = self.buffer.read(cx).snapshot(cx);
|
||||||
let old_cursor_position = self.newest_anchor_selection().map(|s| s.head());
|
|
||||||
selections.sort_unstable_by_key(|s| s.start);
|
selections.sort_unstable_by_key(|s| s.start);
|
||||||
|
|
||||||
// Merge overlapping selections.
|
// Merge overlapping selections.
|
||||||
|
@ -3829,28 +3828,9 @@ impl Editor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.pending_selection = None;
|
|
||||||
self.add_selections_state = None;
|
|
||||||
self.select_next_state = None;
|
|
||||||
self.select_larger_syntax_node_stack.clear();
|
|
||||||
self.autoclose_stack.invalidate(&selections, &buffer);
|
|
||||||
self.snippet_stack.invalidate(&selections, &buffer);
|
|
||||||
|
|
||||||
let new_cursor_position = selections.iter().max_by_key(|s| s.id).map(|s| s.head());
|
|
||||||
if let Some(old_cursor_position) = old_cursor_position {
|
|
||||||
if let Some(new_cursor_position) = new_cursor_position {
|
|
||||||
self.push_to_nav_history(
|
|
||||||
old_cursor_position,
|
|
||||||
Some(new_cursor_position.to_point(&buffer)),
|
|
||||||
cx,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(autoscroll) = autoscroll {
|
if let Some(autoscroll) = autoscroll {
|
||||||
self.request_autoscroll(autoscroll, cx);
|
self.request_autoscroll(autoscroll, cx);
|
||||||
}
|
}
|
||||||
self.pause_cursor_blinking(cx);
|
|
||||||
|
|
||||||
self.set_selections(
|
self.set_selections(
|
||||||
Arc::from_iter(selections.into_iter().map(|selection| {
|
Arc::from_iter(selections.into_iter().map(|selection| {
|
||||||
|
@ -3869,22 +3849,6 @@ impl Editor {
|
||||||
})),
|
})),
|
||||||
cx,
|
cx,
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some((completion_state, cursor_position)) =
|
|
||||||
self.completion_state.as_mut().zip(new_cursor_position)
|
|
||||||
{
|
|
||||||
let cursor_position = cursor_position.to_offset(&buffer);
|
|
||||||
let (word_range, kind) =
|
|
||||||
buffer.surrounding_word(completion_state.initial_position.clone());
|
|
||||||
if kind == Some(CharKind::Word) && word_range.to_inclusive().contains(&cursor_position)
|
|
||||||
{
|
|
||||||
let query = Self::completion_query(&buffer, cursor_position);
|
|
||||||
smol::block_on(completion_state.filter(query.as_deref(), cx.background().clone()));
|
|
||||||
self.show_completions(&ShowCompletions, cx);
|
|
||||||
} else {
|
|
||||||
self.hide_completions(cx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compute new ranges for any selections that were located in excerpts that have
|
/// Compute new ranges for any selections that were located in excerpts that have
|
||||||
|
@ -3937,12 +3901,54 @@ impl Editor {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_selections(&mut self, selections: Arc<[Selection<Anchor>]>, cx: &mut ViewContext<Self>) {
|
fn set_selections(&mut self, selections: Arc<[Selection<Anchor>]>, cx: &mut ViewContext<Self>) {
|
||||||
|
let old_cursor_position = self.newest_anchor_selection().map(|s| s.head());
|
||||||
self.selections = selections;
|
self.selections = selections;
|
||||||
if self.focused {
|
if self.focused {
|
||||||
self.buffer.update(cx, |buffer, cx| {
|
self.buffer.update(cx, |buffer, cx| {
|
||||||
buffer.set_active_selections(&self.selections, cx)
|
buffer.set_active_selections(&self.selections, cx)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let buffer = self.buffer.read(cx).snapshot(cx);
|
||||||
|
self.pending_selection = None;
|
||||||
|
self.add_selections_state = None;
|
||||||
|
self.select_next_state = None;
|
||||||
|
self.select_larger_syntax_node_stack.clear();
|
||||||
|
self.autoclose_stack.invalidate(&self.selections, &buffer);
|
||||||
|
self.snippet_stack.invalidate(&self.selections, &buffer);
|
||||||
|
|
||||||
|
let new_cursor_position = self
|
||||||
|
.selections
|
||||||
|
.iter()
|
||||||
|
.max_by_key(|s| s.id)
|
||||||
|
.map(|s| s.head());
|
||||||
|
if let Some(old_cursor_position) = old_cursor_position {
|
||||||
|
if let Some(new_cursor_position) = new_cursor_position.as_ref() {
|
||||||
|
self.push_to_nav_history(
|
||||||
|
old_cursor_position,
|
||||||
|
Some(new_cursor_position.to_point(&buffer)),
|
||||||
|
cx,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some((completion_state, cursor_position)) =
|
||||||
|
self.completion_state.as_mut().zip(new_cursor_position)
|
||||||
|
{
|
||||||
|
let cursor_position = cursor_position.to_offset(&buffer);
|
||||||
|
let (word_range, kind) =
|
||||||
|
buffer.surrounding_word(completion_state.initial_position.clone());
|
||||||
|
if kind == Some(CharKind::Word) && word_range.to_inclusive().contains(&cursor_position)
|
||||||
|
{
|
||||||
|
let query = Self::completion_query(&buffer, cursor_position);
|
||||||
|
smol::block_on(completion_state.filter(query.as_deref(), cx.background().clone()));
|
||||||
|
self.show_completions(&ShowCompletions, cx);
|
||||||
|
} else {
|
||||||
|
self.hide_completions(cx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.pause_cursor_blinking(cx);
|
||||||
cx.emit(Event::SelectionsChanged);
|
cx.emit(Event::SelectionsChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue