Experiment with autocompletion on idle

This commit is contained in:
Blaž Hrastnik 2021-08-26 11:14:46 +09:00
parent f99bea404f
commit 40abec80e1
3 changed files with 38 additions and 4 deletions

View file

@ -200,9 +200,9 @@ impl Application {
self.render(); self.render();
} }
_ = &mut self.editor.idle_timer => { _ = &mut self.editor.idle_timer => {
self.editor.clear_idle_timer();
println!("idle!")
// idle timeout // idle timeout
self.editor.clear_idle_timer();
self.handle_idle_timeout();
} }
} }
} }
@ -233,6 +233,40 @@ impl Application {
} }
} }
pub fn handle_idle_timeout(&mut self) {
use helix_view::document::Mode;
use crate::commands::{Context, completion};
if doc_mut!(self.editor).mode != Mode::Insert {
return;
}
let editor_view = self
.compositor
.find(std::any::type_name::<ui::EditorView>())
.expect("expected at least one EditorView");
let editor_view = editor_view
.as_any_mut()
.downcast_mut::<ui::EditorView>()
.unwrap();
if editor_view.completion.is_some() {
return;
}
let mut cx = Context {
selected_register: helix_view::RegisterSelection::default(),
editor: &mut self.editor,
jobs: &mut self.jobs,
count: None,
callback: None,
on_next_key_callback: None,
};
completion(&mut cx);
// TODO: scan backwards for trigger and filter the box
self.render();
}
pub fn handle_terminal_events(&mut self, event: Option<Result<Event, crossterm::ErrorKind>>) { pub fn handle_terminal_events(&mut self, event: Option<Result<Event, crossterm::ErrorKind>>) {
let mut cx = crate::compositor::Context { let mut cx = crate::compositor::Context {
editor: &mut self.editor, editor: &mut self.editor,

View file

@ -4045,7 +4045,7 @@ fn remove_primary_selection(cx: &mut Context) {
doc.set_selection(view.id, selection); doc.set_selection(view.id, selection);
} }
fn completion(cx: &mut Context) { pub fn completion(cx: &mut Context) {
// trigger on trigger char, or if user calls it // trigger on trigger char, or if user calls it
// (or on word char typing??) // (or on word char typing??)
// after it's triggered, if response marked is_incomplete, update on every subsequent keypress // after it's triggered, if response marked is_incomplete, update on every subsequent keypress

View file

@ -33,7 +33,7 @@ pub struct EditorView {
keymaps: Keymaps, keymaps: Keymaps,
on_next_key: Option<Box<dyn FnOnce(&mut commands::Context, KeyEvent)>>, on_next_key: Option<Box<dyn FnOnce(&mut commands::Context, KeyEvent)>>,
last_insert: (commands::Command, Vec<KeyEvent>), last_insert: (commands::Command, Vec<KeyEvent>),
completion: Option<Completion>, pub(crate) completion: Option<Completion>,
spinners: ProgressSpinners, spinners: ProgressSpinners,
autoinfo: Option<Info>, autoinfo: Option<Info>,
} }