@@ -325,140 +325,111 @@ impl PartialEq for Command {
325325fn move_char_left(cx: &mut Context) {
326326 let count = cx.count();
327327 let (view, doc) = current!(cx.editor);
328− doc.set_selection(
329− view.id,
330− doc.selection(view.id).clone().transform(|range| {
331− movement::move_horizontally(
332− doc.text().slice(..),
333− range,
334− Direction::Backward,
335− count,
336− Movement::Move,
337− )
338− }),
339− );
328+ let text = doc.text().slice(..);
329+
330+ let selection = doc.selection(view.id).clone().transform(|range| {
331+ movement::move_horizontally(text, range, Direction::Backward, count, Movement::Move)
332+ });
333+ doc.set_selection(view.id, selection);
340334}
341335
342336fn move_char_right(cx: &mut Context) {
343337 let count = cx.count();
344338 let (view, doc) = current!(cx.editor);
345− doc.set_selection(
346− view.id,
347− doc.selection(view.id).clone().transform(|range| {
348− movement::move_horizontally(
349− doc.text().slice(..),
350− range,
351− Direction::Forward,
352− count,
353− Movement::Move,
354− )
355− }),
356− );
339+ let text = doc.text().slice(..);
340+
341+ let selection = doc.selection(view.id).clone().transform(|range| {
342+ movement::move_horizontally(text, range, Direction::Forward, count, Movement::Move)
343+ });
344+ doc.set_selection(view.id, selection);
357345}
358346
359347fn move_line_up(cx: &mut Context) {
360348 let count = cx.count();
361349 let (view, doc) = current!(cx.editor);
362− doc.set_selection(
363− view.id,
364− doc.selection(view.id).clone().transform(|range| {
365− movement::move_vertically(
366− doc.text().slice(..),
367− range,
368− Direction::Backward,
369− count,
370− Movement::Move,
371− )
372− }),
373− );
350+ let text = doc.text().slice(..);
351+
352+ let selection = doc.selection(view.id).clone().transform(|range| {
353+ movement::move_vertically(text, range, Direction::Backward, count, Movement::Move)
354+ });
355+ doc.set_selection(view.id, selection);
374356}
375357
376358fn move_line_down(cx: &mut Context) {
377359 let count = cx.count();
378360 let (view, doc) = current!(cx.editor);
379− doc.set_selection(
380− view.id,
381− doc.selection(view.id).clone().transform(|range| {
382− movement::move_vertically(
383− doc.text().slice(..),
384− range,
385− Direction::Forward,
386− count,
387− Movement::Move,
388− )
389− }),
390− );
361+ let text = doc.text().slice(..);
362+
363+ let selection = doc.selection(view.id).clone().transform(|range| {
364+ movement::move_vertically(text, range, Direction::Forward, count, Movement::Move)
365+ });
366+ doc.set_selection(view.id, selection);
391367}
392368
393369fn goto_line_end(cx: &mut Context) {
394370 let (view, doc) = current!(cx.editor);
395− doc.set_selection(
396− view.id,
397− doc.selection(view.id).clone().transform(|range| {
398− let text = doc.text().slice(..);
399− let line = range.head_line(text);
371+ let text = doc.text().slice(..);
400372
401− let mut pos = line_end_char_index(&text, line);
402− if doc.mode != Mode::Select {
403− pos = graphemes::prev_grapheme_boundary(text, pos);
404− }
373+ let selection = doc.selection(view.id).clone().transform(|range| {
374+ let line = range.head_line(text);
405375
406− pos = range.head.max(pos).max(text.line_to_char(line));
376+ let mut pos = line_end_char_index(&text, line);
377+ if doc.mode != Mode::Select {
378+ pos = graphemes::prev_grapheme_boundary(text, pos);
379+ }
407380
408− range.put(text, pos, doc.mode == Mode::Select)
409− }),
410− );
381+ pos = range.head.max(pos).max(text.line_to_char(line));
382+
383+ range.put(text, pos, doc.mode == Mode::Select)
384+ });
385+ doc.set_selection(view.id, selection);
411386}
412387
413388fn goto_line_end_newline(cx: &mut Context) {
414389 let (view, doc) = current!(cx.editor);
390+ let text = doc.text().slice(..);
415391
416− doc.set_selection(
417− view.id,
418− doc.selection(view.id).clone().transform(|range| {
419− let text = doc.text().slice(..);
420− let line = range.head_line(text);
392+ let selection = doc.selection(view.id).clone().transform(|range| {
393+ let line = range.head_line(text);
421394
422− let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
423− if doc.mode != Mode::Select {
424− pos = graphemes::prev_grapheme_boundary(text, pos);
425− }
426− range.put(text, pos, doc.mode == Mode::Select)
427− }),
428− );
395+ let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
396+ if doc.mode != Mode::Select {
397+ pos = graphemes::prev_grapheme_boundary(text, pos);
398+ }
399+ range.put(text, pos, doc.mode == Mode::Select)
400+ });
401+ doc.set_selection(view.id, selection);
429402}
430403
431404fn goto_line_start(cx: &mut Context) {
432405 let (view, doc) = current!(cx.editor);
433− doc.set_selection(
434− view.id,
435− doc.selection(view.id).clone().transform(|range| {
436− let text = doc.text().slice(..);
437− let line = range.head_line(text);
406+ let text = doc.text().slice(..);
438407
439− // adjust to start of the line
440− let pos = text.line_to_char(line);
441− range.put(text, pos, doc.mode == Mode::Select)
442− }),
443− );
408+ let selection = doc.selection(view.id).clone().transform(|range| {
409+ let line = range.head_line(text);
410+
411+ // adjust to start of the line
412+ let pos = text.line_to_char(line);
413+ range.put(text, pos, doc.mode == Mode::Select)
414+ });
415+ doc.set_selection(view.id, selection);
444416}
445417
446418fn goto_first_nonwhitespace(cx: &mut Context) {
447419 let (view, doc) = current!(cx.editor);
448− doc.set_selection(
449− view.id,
450− doc.selection(view.id).clone().transform(|range| {
451− let text = doc.text().slice(..);
452− let line = range.head_line(text);
420+ let text = doc.text().slice(..);
453421
454− if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
455− let pos = pos + text.line_to_char(line);
456− range.put(text, pos, doc.mode == Mode::Select)
457− } else {
458− range
459− }
460− }),
461− );
422+ let selection = doc.selection(view.id).clone().transform(|range| {
423+ let line = range.head_line(text);
424+
425+ if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
426+ let pos = pos + text.line_to_char(line);
427+ range.put(text, pos, doc.mode == Mode::Select)
428+ } else {
429+ range
430+ }
431+ });
432+ doc.set_selection(view.id, selection);
462433}
463434
464435fn goto_window(cx: &mut Context, align: Align) {
@@ -499,80 +470,79 @@ fn goto_window_bottom(cx: &mut Context) {
499470fn move_next_word_start(cx: &mut Context) {
500471 let count = cx.count();
501472 let (view, doc) = current!(cx.editor);
473+ let text = doc.text().slice(..);
502474
503− doc.set_selection(
504− view.id,
505− doc.selection(view.id)
506− .clone()
507− .min_width_1(doc.text().slice(..))
508− .transform(|range| movement::move_next_word_start(doc.text().slice(..), range, count)),
509− );
475+ let selection = doc
476+ .selection(view.id)
477+ .clone()
478+ .min_width_1(text)
479+ .transform(|range| movement::move_next_word_start(text, range, count));
480+ doc.set_selection(view.id, selection);
510481}
511482
512483fn move_prev_word_start(cx: &mut Context) {
513484 let count = cx.count();
514485 let (view, doc) = current!(cx.editor);
515− doc.set_selection(
516− view.id,
517− doc.selection(view.id)
518− .clone()
519− .min_width_1(doc.text().slice(..))
520− .transform(|range| movement::move_prev_word_start(doc.text().slice(..), range, count)),
521− );
486+ let text = doc.text().slice(..);
487+
488+ let selection = doc
489+ .selection(view.id)
490+ .clone()
491+ .min_width_1(text)
492+ .transform(|range| movement::move_prev_word_start(text, range, count));
493+ doc.set_selection(view.id, selection);
522494}
523495
524496fn move_next_word_end(cx: &mut Context) {
525497 let count = cx.count();
526498 let (view, doc) = current!(cx.editor);
527− doc.set_selection(
528− view.id,
529− doc.selection(view.id)
530− .clone()
531− .min_width_1(doc.text().slice(..))
532− .transform(|range| movement::move_next_word_end(doc.text().slice(..), range, count)),
533− );
499+ let text = doc.text().slice(..);
500+
501+ let selection = doc
502+ .selection(view.id)
503+ .clone()
504+ .min_width_1(text)
505+ .transform(|range| movement::move_next_word_end(text, range, count));
506+ doc.set_selection(view.id, selection);
534507}
535508
536509fn move_next_long_word_start(cx: &mut Context) {
537510 let count = cx.count();
538511 let (view, doc) = current!(cx.editor);
539− doc.set_selection(
540− view.id,
541− doc.selection(view.id)
542− .clone()
543− .min_width_1(doc.text().slice(..))
544− .transform(|range| {
545− movement::move_next_long_word_start(doc.text().slice(..), range, count)
546− }),
547− );
512+ let text = doc.text().slice(..);
513+
514+ let selection = doc
515+ .selection(view.id)
516+ .clone()
517+ .min_width_1(text)
518+ .transform(|range| movement::move_next_long_word_start(text, range, count));
519+ doc.set_selection(view.id, selection);
548520}
549521
550522fn move_prev_long_word_start(cx: &mut Context) {
551523 let count = cx.count();
552524 let (view, doc) = current!(cx.editor);
553− doc.set_selection(
554− view.id,
555− doc.selection(view.id)
556− .clone()
557− .min_width_1(doc.text().slice(..))
558− .transform(|range| {
559− movement::move_prev_long_word_start(doc.text().slice(..), range, count)
560− }),
561− );
525+ let text = doc.text().slice(..);
526+
527+ let selection = doc
528+ .selection(view.id)
529+ .clone()
530+ .min_width_1(text)
531+ .transform(|range| movement::move_prev_long_word_start(text, range, count));
532+ doc.set_selection(view.id, selection);
562533}
563534
564535fn move_next_long_word_end(cx: &mut Context) {
565536 let count = cx.count();
566537 let (view, doc) = current!(cx.editor);
567− doc.set_selection(
568− view.id,
569− doc.selection(view.id)
570− .clone()
571− .min_width_1(doc.text().slice(..))
572− .transform(|range| {
573− movement::move_next_long_word_end(doc.text().slice(..), range, count)
574− }),
575− );
538+ let text = doc.text().slice(..);
539+
540+ let selection = doc
541+ .selection(view.id)
542+ .clone()
543+ .min_width_1(text)
544+ .transform(|range| movement::move_next_long_word_end(text, range, count));
545+ doc.set_selection(view.id, selection);
576546}
577547
578548fn goto_file_start(cx: &mut Context) {
@@ -590,52 +560,52 @@ fn goto_file_end(cx: &mut Context) {
590560fn extend_next_word_start(cx: &mut Context) {
591561 let count = cx.count();
592562 let (view, doc) = current!(cx.editor);
593− doc.set_selection(
594− view.id,
595− doc.selection(view.id)
596− .clone()
597− .min_width_1(doc.text().slice(..))
598− .transform(|range| {
599− let text = doc.text().slice(..);
600− let word = movement::move_next_word_start(text, range, count);
601− let pos = word.head;
602− range.put(text, pos, true)
603− }),
604− );
563+ let text = doc.text().slice(..);
564+
565+ let selection = doc
566+ .selection(view.id)
567+ .clone()
568+ .min_width_1(text)
569+ .transform(|range| {
570+ let word = movement::move_next_word_start(text, range, count);
571+ let pos = word.head;
572+ range.put(text, pos, true)
573+ });
574+ doc.set_selection(view.id, selection);
605575}
606576
607577fn extend_prev_word_start(cx: &mut Context) {
608578 let count = cx.count();
609579 let (view, doc) = current!(cx.editor);
610− doc.set_selection(
611− view.id,
612− doc.selection(view.id)
613− .clone()
614− .min_width_1(doc.text().slice(..))
615− .transform(|range| {
616− let text = doc.text().slice(..);
617− let word = movement::move_prev_word_start(text, range, count);
618− let pos = word.head;
619− range.put(text, pos, true)
620− }),
621− );
580+ let text = doc.text().slice(..);
581+
582+ let selection = doc
583+ .selection(view.id)
584+ .clone()
585+ .min_width_1(text)
586+ .transform(|range| {
587+ let word = movement::move_prev_word_start(text, range, count);
588+ let pos = word.head;
589+ range.put(text, pos, true)
590+ });
591+ doc.set_selection(view.id, selection);
622592}
623593
624594fn extend_next_word_end(cx: &mut Context) {
625595 let count = cx.count();
626596 let (view, doc) = current!(cx.editor);
627− doc.set_selection(
628− view.id,
629− doc.selection(view.id)
630− .clone()
631− .min_width_1(doc.text().slice(..))
632− .transform(|range| {
633− let text = doc.text().slice(..);
634− let word = movement::move_next_word_end(text, range, count);
635− let pos = word.head;
636− range.put(text, pos, true)
637− }),
638− );
597+ let text = doc.text().slice(..);
598+
599+ let selection = doc
600+ .selection(view.id)
601+ .clone()
602+ .min_width_1(text)
603+ .transform(|range| {
604+ let word = movement::move_next_word_end(text, range, count);
605+ let pos = word.head;
606+ range.put(text, pos, true)
607+ });
608+ doc.set_selection(view.id, selection);
639609}
640610
641611#[inline]
@@ -678,15 +648,13 @@ where
678648 };
679649
680650 let (view, doc) = current!(cx.editor);
651+ let text = doc.text().slice(..);
681652
682− doc.set_selection(
683− view.id,
684− doc.selection(view.id).clone().transform(|range| {
685− let text = doc.text().slice(..);
686− search_fn(text, ch, range.head, count, inclusive)
687− .map_or(range, |pos| range.put(text, pos, extend))
688− }),
689− );
653+ let selection = doc.selection(view.id).clone().transform(|range| {
654+ search_fn(text, ch, range.head, count, inclusive)
655+ .map_or(range, |pos| range.put(text, pos, extend))
656+ });
657+ doc.set_selection(view.id, selection);
690658 })
691659}
692660
@@ -939,69 +907,45 @@ fn half_page_down(cx: &mut Context) {
939907fn extend_char_left(cx: &mut Context) {
940908 let count = cx.count();
941909 let (view, doc) = current!(cx.editor);
942− doc.set_selection(
943− view.id,
944− doc.selection(view.id).clone().transform(|range| {
945− movement::move_horizontally(
946− doc.text().slice(..),
947− range,
948− Direction::Backward,
949− count,
950− Movement::Extend,
951− )
952− }),
953− );
910+ let text = doc.text().slice(..);
911+
912+ let selection = doc.selection(view.id).clone().transform(|range| {
913+ movement::move_horizontally(text, range, Direction::Backward, count, Movement::Extend)
914+ });
915+ doc.set_selection(view.id, selection);
954916}
955917
956918fn extend_char_right(cx: &mut Context) {
957919 let count = cx.count();
958920 let (view, doc) = current!(cx.editor);
959− doc.set_selection(
960− view.id,
961− doc.selection(view.id).clone().transform(|range| {
962− movement::move_horizontally(
963− doc.text().slice(..),
964− range,
965− Direction::Forward,
966− count,
967− Movement::Extend,
968− )
969− }),
970− );
921+ let text = doc.text().slice(..);
922+
923+ let selection = doc.selection(view.id).clone().transform(|range| {
924+ movement::move_horizontally(text, range, Direction::Forward, count, Movement::Extend)
925+ });
926+ doc.set_selection(view.id, selection);
971927}
972928
973929fn extend_line_up(cx: &mut Context) {
974930 let count = cx.count();
975931 let (view, doc) = current!(cx.editor);
976− doc.set_selection(
977− view.id,
978− doc.selection(view.id).clone().transform(|range| {
979− movement::move_vertically(
980− doc.text().slice(..),
981− range,
982− Direction::Backward,
983− count,
984− Movement::Extend,
985− )
986− }),
987− );
932+ let text = doc.text().slice(..);
933+
934+ let selection = doc.selection(view.id).clone().transform(|range| {
935+ movement::move_vertically(text, range, Direction::Backward, count, Movement::Extend)
936+ });
937+ doc.set_selection(view.id, selection);
988938}
989939
990940fn extend_line_down(cx: &mut Context) {
991941 let count = cx.count();
992942 let (view, doc) = current!(cx.editor);
993− doc.set_selection(
994− view.id,
995− doc.selection(view.id).clone().transform(|range| {
996− movement::move_vertically(
997− doc.text().slice(..),
998− range,
999− Direction::Forward,
1000− count,
1001− Movement::Extend,
1002− )
1003− }),
1004− );
943+ let text = doc.text().slice(..);
944+
945+ let selection = doc.selection(view.id).clone().transform(|range| {
946+ movement::move_vertically(text, range, Direction::Forward, count, Movement::Extend)
947+ });
948+ doc.set_selection(view.id, selection);
1005949}
1006950
1007951fn select_all(cx: &mut Context) {
@@ -1222,30 +1166,28 @@ fn change_selection(cx: &mut Context) {
12221166
12231167fn collapse_selection(cx: &mut Context) {
12241168 let (view, doc) = current!(cx.editor);
1169+ let text = doc.text().slice(..);
12251170
1226− doc.set_selection(
1227− view.id,
1228− doc.selection(view.id).clone().transform(|range| {
1229− let pos = if range.head > range.anchor {
1230− // For 1-width cursor semantics.
1231− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.head)
1232− } else {
1233− range.head
1234− };
1235− Range::new(pos, pos)
1236− }),
1237− );
1171+ let selection = doc.selection(view.id).clone().transform(|range| {
1172+ let pos = if range.head > range.anchor {
1173+ // For 1-width cursor semantics.
1174+ graphemes::prev_grapheme_boundary(text, range.head)
1175+ } else {
1176+ range.head
1177+ };
1178+ Range::new(pos, pos)
1179+ });
1180+ doc.set_selection(view.id, selection);
12381181}
12391182
12401183fn flip_selections(cx: &mut Context) {
12411184 let (view, doc) = current!(cx.editor);
12421185
1243− doc.set_selection(
1244− view.id,
1245− doc.selection(view.id)
1246− .clone()
1247− .transform(|range| Range::new(range.head, range.anchor)),
1248− );
1186+ let selection = doc
1187+ .selection(view.id)
1188+ .clone()
1189+ .transform(|range| Range::new(range.head, range.anchor));
1190+ doc.set_selection(view.id, selection);
12491191}
12501192
12511193fn enter_insert_mode(doc: &mut Document) {
@@ -1257,12 +1199,11 @@ fn insert_mode(cx: &mut Context) {
12571199 let (view, doc) = current!(cx.editor);
12581200 enter_insert_mode(doc);
12591201
1260− doc.set_selection(
1261− view.id,
1262− doc.selection(view.id)
1263− .clone()
1264− .transform(|range| Range::new(range.to(), range.from())),
1265− );
1202+ let selection = doc
1203+ .selection(view.id)
1204+ .clone()
1205+ .transform(|range| Range::new(range.to(), range.from()));
1206+ doc.set_selection(view.id, selection);
12661207}
12671208
12681209// inserts at the end of each selection
@@ -1286,15 +1227,13 @@ fn append_mode(cx: &mut Context) {
12861227 doc.apply(&transaction, view.id);
12871228 }
12881229
1289− doc.set_selection(
1290− view.id,
1291− selection.clone().transform(|range| {
1292− Range::new(
1293− range.from(),
1294− graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()),
1295− )
1296− }),
1297− );
1230+ let selection = selection.transform(|range| {
1231+ Range::new(
1232+ range.from(),
1233+ graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()),
1234+ )
1235+ });
1236+ doc.set_selection(view.id, selection);
12981237}
12991238
13001239mod cmd {
@@ -2200,15 +2139,13 @@ fn append_to_line(cx: &mut Context) {
22002139 let (view, doc) = current!(cx.editor);
22012140 enter_insert_mode(doc);
22022141
2203− doc.set_selection(
2204− view.id,
2205− doc.selection(view.id).clone().transform(|range| {
2206− let text = doc.text().slice(..);
2207− let line = range.head_line(text);
2208− let pos = line_end_char_index(&text, line);
2209− Range::new(pos, pos)
2210− }),
2211− );
2142+ let selection = doc.selection(view.id).clone().transform(|range| {
2143+ let text = doc.text().slice(..);
2144+ let line = range.head_line(text);
2145+ let pos = line_end_char_index(&text, line);
2146+ Range::new(pos, pos)
2147+ });
2148+ doc.set_selection(view.id, selection);
22122149}
22132150
22142151/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
@@ -2338,15 +2275,14 @@ fn normal_mode(cx: &mut Context) {
23382275
23392276 // if leaving append mode, move cursor back by 1
23402277 if doc.restore_cursor {
2341− doc.set_selection(
2342− view.id,
2343− doc.selection(view.id).clone().transform(|range| {
2344− Range::new(
2345− range.from(),
2346− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.to()),
2347− )
2348− }),
2349− );
2278+ let text = doc.text().slice(..);
2279+ let selection = doc.selection(view.id).clone().transform(|range| {
2280+ Range::new(
2281+ range.from(),
2282+ graphemes::prev_grapheme_boundary(text, range.to()),
2283+ )
2284+ });
2285+ doc.set_selection(view.id, selection);
23502286
23512287 doc.restore_cursor = false;
23522288 }
@@ -2370,22 +2306,21 @@ fn goto_last_accessed_file(cx: &mut Context) {
23702306
23712307fn select_mode(cx: &mut Context) {
23722308 let (view, doc) = current!(cx.editor);
2309+ let text = doc.text().slice(..);
23732310
23742311 // Make sure all selections are at least 1-wide.
23752312 // (With the exception of being in an empty document, of course.)
2376− doc.set_selection(
2377− view.id,
2378− doc.selection(view.id).clone().transform(|range| {
2379− if range.is_empty() && range.head == doc.text().len_chars() {
2380− Range::new(
2381− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.anchor),
2382− range.head,
2383− )
2384− } else {
2385− range.min_width_1(doc.text().slice(..))
2386− }
2387− }),
2388− );
2313+ let selection = doc.selection(view.id).clone().transform(|range| {
2314+ if range.is_empty() && range.head == text.len_chars() {
2315+ Range::new(
2316+ graphemes::prev_grapheme_boundary(text, range.anchor),
2317+ range.head,
2318+ )
2319+ } else {
2320+ range.min_width_1(text)
2321+ }
2322+ });
2323+ doc.set_selection(view.id, selection);
23892324
23902325 doc_mut!(cx.editor).mode = Mode::Select;
23912326}
@@ -2964,13 +2899,13 @@ pub mod insert {
29642899 pub fn delete_word_backward(cx: &mut Context) {
29652900 let count = cx.count();
29662901 let (view, doc) = current!(cx.editor);
2902+ let text = doc.text().slice(..);
29672903
2968− doc.set_selection(
2969− view.id,
2970− doc.selection(view.id).clone().transform(|range| {
2971− movement::move_prev_word_start(doc.text().slice(..), range, count)
2972− }),
2973− );
2904+ let selection = doc
2905+ .selection(view.id)
2906+ .clone()
2907+ .transform(|range| movement::move_prev_word_start(text, range, count));
2908+ doc.set_selection(view.id, selection);
29742909 delete_selection(cx)
29752910 }
29762911}
@@ -3721,21 +3656,19 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
37213656 } = event
37223657 {
37233658 let (view, doc) = current!(cx.editor);
3659+ let text = doc.text().slice(..);
37243660
3725− doc.set_selection(
3726− view.id,
3727− doc.selection(view.id).clone().transform(|range| {
3728− let text = doc.text().slice(..);
3729− match ch {
3730− 'w' => textobject::textobject_word(text, range, objtype, count),
3731− // TODO: cancel new ranges if inconsistent surround matches across lines
3732− ch if !ch.is_ascii_alphanumeric() => {
3733− textobject::textobject_surround(text, range, objtype, ch, count)
3734− }
3735− _ => range,
3661+ let selection = doc.selection(view.id).clone().transform(|range| {
3662+ match ch {
3663+ 'w' => textobject::textobject_word(text, range, objtype, count),
3664+ // TODO: cancel new ranges if inconsistent surround matches across lines
3665+ ch if !ch.is_ascii_alphanumeric() => {
3666+ textobject::textobject_surround(text, range, objtype, ch, count)
37363667 }
3737− }),
3738− );
3668+ _ => range,
3669+ }
3670+ });
3671+ doc.set_selection(view.id, selection);
37393672 }
37403673 })
37413674}