@@ -250,18 +250,27 @@ pub mod util {
250 /// If the LS did not provide a range for the completion or the range of the
250 /// If the LS did not provide a range for the completion or the range of the
251 /// primary cursor can not be used for the secondary cursor, this function
251 /// primary cursor can not be used for the secondary cursor, this function
252 /// can be used to find the completion range for a cursor
252 /// can be used to find the completion range for a cursor
253− fn find_completion_range(text: RopeSlice, cursor: usize) -> (usize, usize) {
253+ fn find_completion_range(text: RopeSlice, replace_mode: bool, cursor: usize) -> (usize, usize) {
254 let start = cursor
254 let start = cursor
256 .chars_at(cursor)
256 .chars_at(cursor)
257 .reversed()
257 .reversed()
258 .take_while(|ch| chars::char_is_word(*ch))
258 .take_while(|ch| chars::char_is_word(*ch))
259 .count();
259 .count();
260+ let mut end = cursor;
265+ .take_while(|ch| chars::char_is_word(*ch))
260− (start, cursor)
268+ (start, end)
262 fn completion_range(
270 fn completion_range(
263 text: RopeSlice,
271 text: RopeSlice,
264 edit_offset: Option<(i128, i128)>,
272 edit_offset: Option<(i128, i128)>,
265 cursor: usize,
274 cursor: usize,
266 ) -> Option<(usize, usize)> {
275 ) -> Option<(usize, usize)> {
267 let res = match edit_offset {
276 let res = match edit_offset {
@@ -276,7 +285,7 @@ pub mod util {
277 (start_offset as usize, end_offset as usize)
286 (start_offset as usize, end_offset as usize)
279− None => find_completion_range(text, cursor),
288+ None => find_completion_range(text, replace_mode, cursor),
281 Some(res)
290 Some(res)
@@ -287,6 +296,7 @@ pub mod util {
287 doc: &Rope,
296 doc: &Rope,
288 selection: &Selection,
297 selection: &Selection,
289 edit_offset: Option<(i128, i128)>,
298 edit_offset: Option<(i128, i128)>,
290 new_text: String,
300 new_text: String,
291 ) -> Transaction {
301 ) -> Transaction {
292 let replacement: Option<Tendril> = if new_text.is_empty() {
302 let replacement: Option<Tendril> = if new_text.is_empty() {
@@ -296,9 +306,13 @@ pub mod util {
298 let text = doc.slice(..);
308 let text = doc.slice(..);
299− let (removed_start, removed_end) =
309+ let (removed_start, removed_end) = completion_range(
300− completion_range(text, edit_offset, selection.primary().cursor(text))
313+ selection.primary().cursor(text),
301− .expect("transaction must be valid for primary selection");
315+ .expect("transaction must be valid for primary selection");
302 let removed_text = text.slice(removed_start..removed_end);
316 let removed_text = text.slice(removed_start..removed_end);
304 let (transaction, mut selection) = Transaction::change_by_selection_ignore_overlapping(
318 let (transaction, mut selection) = Transaction::change_by_selection_ignore_overlapping(
@@ -306,9 +320,9 @@ pub mod util {
306 selection,
320 selection,
307 |range| {
321 |range| {
308 let cursor = range.cursor(text);
322 let cursor = range.cursor(text);
309− completion_range(text, edit_offset, cursor)
323+ completion_range(text, edit_offset, replace_mode, cursor)
310 .filter(|(start, end)| text.slice(start..end) == removed_text)
324 .filter(|(start, end)| text.slice(start..end) == removed_text)
311− .unwrap_or_else(|| find_completion_range(text, cursor))
325+ .unwrap_or_else(|| find_completion_range(text, replace_mode, cursor))
313 |_, _| replacement.clone(),
327 |_, _| replacement.clone(),
@@ -326,6 +340,7 @@ pub mod util {
326 doc: &Rope,
340 doc: &Rope,
327 selection: &Selection,
341 selection: &Selection,
328 edit_offset: Option<(i128, i128)>,
342 edit_offset: Option<(i128, i128)>,
329 snippet: snippet::Snippet,
344 snippet: snippet::Snippet,
330 line_ending: &str,
345 line_ending: &str,
331 include_placeholder: bool,
346 include_placeholder: bool,
@@ -336,9 +351,13 @@ pub mod util {
336 let mut off = 0i128;
351 let mut off = 0i128;
337 let mut mapped_doc = doc.clone();
352 let mut mapped_doc = doc.clone();
338 let mut selection_tabstops: SmallVec<[_; 1]> = SmallVec::new();
353 let mut selection_tabstops: SmallVec<[_; 1]> = SmallVec::new();
339− let (removed_start, removed_end) =
354+ let (removed_start, removed_end) = completion_range(
340− completion_range(text, edit_offset, selection.primary().cursor(text))
358+ selection.primary().cursor(text),
341− .expect("transaction must be valid for primary selection");
360+ .expect("transaction must be valid for primary selection");
342 let removed_text = text.slice(removed_start..removed_end);
361 let removed_text = text.slice(removed_start..removed_end);
344 let (transaction, selection) = Transaction::change_by_selection_ignore_overlapping(
363 let (transaction, selection) = Transaction::change_by_selection_ignore_overlapping(
@@ -346,9 +365,9 @@ pub mod util {
346 selection,
365 selection,
347 |range| {
366 |range| {
348 let cursor = range.cursor(text);
367 let cursor = range.cursor(text);
349− completion_range(text, edit_offset, cursor)
368+ completion_range(text, edit_offset, replace_mode, cursor)
350 .filter(|(start, end)| text.slice(start..end) == removed_text)
369 .filter(|(start, end)| text.slice(start..end) == removed_text)
351− .unwrap_or_else(|| find_completion_range(text, cursor))
370+ .unwrap_or_else(|| find_completion_range(text, replace_mode, cursor))
353 |replacement_start, replacement_end| {
372 |replacement_start, replacement_end| {
354 let mapped_replacement_start = (replacement_start as i128 + off) as usize;
373 let mapped_replacement_start = (replacement_start as i128 + off) as usize;