@@ -3308,7 +3308,26 @@ pub mod insert {
33083308 pub type Hook = fn(&Rope, &Selection, char) -> Option<Transaction>;
33093309 pub type PostHook = fn(&mut Context, char);
33103310
3311− fn completion(cx: &mut Context, ch: 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);
3317+
3318+ use helix_core::chars::char_is_word;
3319+ let mut iter = text.chars_at(cursor);
3320+ iter.reverse();
3321+ for _ in 0..cx.editor.config.completion_trigger_len {
3322+ match iter.next() {
3323+ Some(c) if char_is_word(c) => {}
3324+ _ => return,
3325+ }
3326+ }
3327+ super::completion(cx);
3328+ }
3329+
3330+ fn language_server_completion(cx: &mut Context, ch: char) {
33123331 // if ch matches completion char, trigger completion
33133332 let doc = doc_mut!(cx.editor);
33143333 let language_server = match doc.language_server() {
@@ -3318,19 +3337,14 @@ pub mod insert {
33183337
33193338 let capabilities = language_server.capabilities();
33203339
3321− if let lsp::ServerCapabilities {
3322− completion_provider:
3323− Some(lsp::CompletionOptions {
3324− trigger_characters: Some(triggers),
3325− ..
3326− }),
3340+ if let Some(lsp::CompletionOptions {
3341+ trigger_characters: Some(triggers),
33273342 ..
3328− } = capabilities
3343+ }) = &capabilities.completion_provider
33293344 {
33303345 // TODO: what if trigger is multiple chars long
3331− let is_trigger = triggers.iter().any(|trigger| trigger.contains(ch));
3332−
3333− if is_trigger {
3346+ if triggers.iter().any(|trigger| trigger.contains(ch)) {
3347+ cx.editor.clear_idle_timer();
33343348 super::completion(cx);
33353349 }
33363350 }
@@ -3412,7 +3426,8 @@ pub mod insert {
34123426 // TODO: need a post insert hook too for certain triggers (autocomplete, signature help, etc)
34133427 // this could also generically look at Transaction, but it's a bit annoying to look at
34143428 // 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] {
34163431 hook(cx, c);
34173432 }
34183433 }