@@ -3308,7 +3308,26 @@ pub mod insert {
3308 pub type Hook = fn(&Rope, &Selection, char) -> Option<Transaction>;
3308 pub type Hook = fn(&Rope, &Selection, char) -> Option<Transaction>;
3309 pub type PostHook = fn(&mut Context, char);
3309 pub type PostHook = fn(&mut Context, char);
3311+ // It trigger completion when idle timer reaches deadline
3312+ // Only trigger completion if the word under cursor is longer than n characters
3313+ pub fn idle_completion(cx: &mut Context) {
3314+ let (view, doc) = current!(cx.editor);
3315+ let text = doc.text().slice(..);
3316+ let cursor = doc.selection(view.id).primary().cursor(text);
3318+ use helix_core::chars::char_is_word;
3319+ let mut iter = text.chars_at(cursor);
3321+ for _ in 0..cx.editor.config.completion_trigger_len {
3322+ match iter.next() {
3323+ Some(c) if char_is_word(c) => {}
3311− fn completion(cx: &mut Context, ch: char) {
3327+ super::completion(cx);
3330+ fn language_server_completion(cx: &mut Context, ch: char) {
3312 // if ch matches completion char, trigger completion
3331 // if ch matches completion char, trigger completion
3313 let doc = doc_mut!(cx.editor);
3332 let doc = doc_mut!(cx.editor);
3314 let language_server = match doc.language_server() {
3333 let language_server = match doc.language_server() {
@@ -3318,19 +3337,14 @@ pub mod insert {
3319 let capabilities = language_server.capabilities();
3338 let capabilities = language_server.capabilities();
3321− if let lsp::ServerCapabilities {
3340+ if let Some(lsp::CompletionOptions {
3322− completion_provider:
3323− Some(lsp::CompletionOptions {
3324− trigger_characters: Some(triggers),
3341+ trigger_characters: Some(triggers),
3328− } = capabilities
3343+ }) = &capabilities.completion_provider
3330 // TODO: what if trigger is multiple chars long
3345 // TODO: what if trigger is multiple chars long
3331− let is_trigger = triggers.iter().any(|trigger| trigger.contains(ch));
3346+ if triggers.iter().any(|trigger| trigger.contains(ch)) {
3332−
3347+ cx.editor.clear_idle_timer();
3334 super::completion(cx);
3348 super::completion(cx);
@@ -3412,7 +3426,8 @@ pub mod insert {
3412 // TODO: need a post insert hook too for certain triggers (autocomplete, signature help, etc)
3426 // TODO: need a post insert hook too for certain triggers (autocomplete, signature help, etc)
3413 // this could also generically look at Transaction, but it's a bit annoying to look at
3427 // this could also generically look at Transaction, but it's a bit annoying to look at
3414 // Operation instead of Change.
3428 // Operation instead of Change.
3415− for hook in &[completion, signature_help] {
3429+ for hook in &[language_server_completion, signature_help] {
3430+ // for hook in &[signature_help] {
3416 hook(cx, c);
3431 hook(cx, c);