diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index 0cb09d767..ebfdafe7b 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -268,7 +268,7 @@ impl Client { Delete(i) | Retain(i) => *i, Insert(_) => 0, }; - let old_end = old_pos + len; + let mut old_end = old_pos + len; match change { Retain(_) => {} @@ -276,31 +276,32 @@ impl Client { let start = pos_to_lsp_pos(&old_text, old_pos); let end = pos_to_lsp_pos(&old_text, old_end); - // a subsequent ins means a replace, consume it - if let Some(Insert(s)) = iter.peek() { + // deletion + changes.push(lsp::TextDocumentContentChangeEvent { + range: Some(lsp::Range::new(start, end)), + text: "".to_string(), + range_length: None, + }); + } + Insert(s) => { + let start = pos_to_lsp_pos(&old_text, old_pos); + + // a subsequent delete means a replace, consume it + let end = if let Some(Delete(len)) = iter.peek() { + old_end = old_pos + len; + let end = pos_to_lsp_pos(&old_text, old_end); + iter.next(); // replacement - changes.push(lsp::TextDocumentContentChangeEvent { - range: Some(lsp::Range::new(start, end)), - text: s.into(), - range_length: None, - }); + end } else { - // deletion - changes.push(lsp::TextDocumentContentChangeEvent { - range: Some(lsp::Range::new(start, end)), - text: "".to_string(), - range_length: None, - }); + // insert + start }; - } - Insert(s) => { - let start = pos_to_lsp_pos(&old_text, old_pos); - // insert changes.push(lsp::TextDocumentContentChangeEvent { - range: Some(lsp::Range::new(start, start)), + range: Some(lsp::Range::new(start, end)), text: s.into(), range_length: None, });