@@ -325,140 +325,111 @@ impl PartialEq for Command {
325fn move_char_left(cx: &mut Context) {
325fn move_char_left(cx: &mut Context) {
326 let count = cx.count();
326 let count = cx.count();
327 let (view, doc) = current!(cx.editor);
327 let (view, doc) = current!(cx.editor);
328− doc.set_selection(
328+ let text = doc.text().slice(..);
330− doc.selection(view.id).clone().transform(|range| {
330+ let selection = doc.selection(view.id).clone().transform(|range| {
331− movement::move_horizontally(
331+ movement::move_horizontally(text, range, Direction::Backward, count, Movement::Move)
332− doc.text().slice(..),
334− Direction::Backward,
339− );
333+ doc.set_selection(view.id, selection);
342fn move_char_right(cx: &mut Context) {
336fn move_char_right(cx: &mut Context) {
343 let count = cx.count();
337 let count = cx.count();
344 let (view, doc) = current!(cx.editor);
338 let (view, doc) = current!(cx.editor);
345− doc.set_selection(
339+ let text = doc.text().slice(..);
347− doc.selection(view.id).clone().transform(|range| {
341+ let selection = doc.selection(view.id).clone().transform(|range| {
348− movement::move_horizontally(
342+ movement::move_horizontally(text, range, Direction::Forward, count, Movement::Move)
349− doc.text().slice(..),
356− );
344+ doc.set_selection(view.id, selection);
359fn move_line_up(cx: &mut Context) {
347fn move_line_up(cx: &mut Context) {
360 let count = cx.count();
348 let count = cx.count();
361 let (view, doc) = current!(cx.editor);
349 let (view, doc) = current!(cx.editor);
362− doc.set_selection(
350+ let text = doc.text().slice(..);
364− doc.selection(view.id).clone().transform(|range| {
352+ let selection = doc.selection(view.id).clone().transform(|range| {
365− movement::move_vertically(
353+ movement::move_vertically(text, range, Direction::Backward, count, Movement::Move)
366− doc.text().slice(..),
368− Direction::Backward,
373− );
355+ doc.set_selection(view.id, selection);
376fn move_line_down(cx: &mut Context) {
358fn move_line_down(cx: &mut Context) {
377 let count = cx.count();
359 let count = cx.count();
378 let (view, doc) = current!(cx.editor);
360 let (view, doc) = current!(cx.editor);
379− doc.set_selection(
361+ let text = doc.text().slice(..);
381− doc.selection(view.id).clone().transform(|range| {
363+ let selection = doc.selection(view.id).clone().transform(|range| {
382− movement::move_vertically(
364+ movement::move_vertically(text, range, Direction::Forward, count, Movement::Move)
383− doc.text().slice(..),
390− );
366+ doc.set_selection(view.id, selection);
393fn goto_line_end(cx: &mut Context) {
369fn goto_line_end(cx: &mut Context) {
394 let (view, doc) = current!(cx.editor);
370 let (view, doc) = current!(cx.editor);
397− doc.selection(view.id).clone().transform(|range| {
398− let text = doc.text().slice(..);
371+ let text = doc.text().slice(..);
399− let line = range.head_line(text);
401− let mut pos = line_end_char_index(&text, line);
373+ let selection = doc.selection(view.id).clone().transform(|range| {
402− if doc.mode != Mode::Select {
374+ let line = range.head_line(text);
403− pos = graphemes::prev_grapheme_boundary(text, pos);
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);
381+ pos = range.head.max(pos).max(text.line_to_char(line));
408− range.put(text, pos, doc.mode == Mode::Select)
383+ range.put(text, pos, doc.mode == Mode::Select)
410− );
385+ doc.set_selection(view.id, selection);
413fn goto_line_end_newline(cx: &mut Context) {
388fn goto_line_end_newline(cx: &mut Context) {
414 let (view, doc) = current!(cx.editor);
389 let (view, doc) = current!(cx.editor);
390+ let text = doc.text().slice(..);
418− doc.selection(view.id).clone().transform(|range| {
392+ let selection = doc.selection(view.id).clone().transform(|range| {
419− let text = doc.text().slice(..);
420− let line = range.head_line(text);
393+ let line = range.head_line(text);
422− let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
395+ let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
423− if doc.mode != Mode::Select {
396+ if doc.mode != Mode::Select {
424− pos = graphemes::prev_grapheme_boundary(text, pos);
397+ pos = graphemes::prev_grapheme_boundary(text, pos);
426− range.put(text, pos, doc.mode == Mode::Select)
399+ range.put(text, pos, doc.mode == Mode::Select)
428− );
401+ doc.set_selection(view.id, selection);
431fn goto_line_start(cx: &mut Context) {
404fn goto_line_start(cx: &mut Context) {
432 let (view, doc) = current!(cx.editor);
405 let (view, doc) = current!(cx.editor);
435− doc.selection(view.id).clone().transform(|range| {
436− let text = doc.text().slice(..);
406+ let text = doc.text().slice(..);
437− let line = range.head_line(text);
408+ let selection = doc.selection(view.id).clone().transform(|range| {
409+ let line = range.head_line(text);
439− // adjust to start of the line
411+ // adjust to start of the line
440− let pos = text.line_to_char(line);
412+ let pos = text.line_to_char(line);
441− range.put(text, pos, doc.mode == Mode::Select)
413+ range.put(text, pos, doc.mode == Mode::Select)
443− );
415+ doc.set_selection(view.id, selection);
446fn goto_first_nonwhitespace(cx: &mut Context) {
418fn goto_first_nonwhitespace(cx: &mut Context) {
447 let (view, doc) = current!(cx.editor);
419 let (view, doc) = current!(cx.editor);
450− doc.selection(view.id).clone().transform(|range| {
451− let text = doc.text().slice(..);
420+ let text = doc.text().slice(..);
452− let line = range.head_line(text);
422+ let selection = doc.selection(view.id).clone().transform(|range| {
423+ let line = range.head_line(text);
454− if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
425+ if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
455− let pos = pos + text.line_to_char(line);
426+ let pos = pos + text.line_to_char(line);
456− range.put(text, pos, doc.mode == Mode::Select)
427+ range.put(text, pos, doc.mode == Mode::Select)
457− } else {
428+ } else {
461− );
432+ doc.set_selection(view.id, selection);
464fn goto_window(cx: &mut Context, align: Align) {
435fn goto_window(cx: &mut Context, align: Align) {
@@ -499,80 +470,79 @@ fn goto_window_bottom(cx: &mut Context) {
499fn move_next_word_start(cx: &mut Context) {
470fn move_next_word_start(cx: &mut Context) {
500 let count = cx.count();
471 let count = cx.count();
501 let (view, doc) = current!(cx.editor);
472 let (view, doc) = current!(cx.editor);
473+ let text = doc.text().slice(..);
503− doc.set_selection(
475+ let selection = doc
505− doc.selection(view.id)
476+ .selection(view.id)
506− .clone()
477+ .clone()
507− .min_width_1(doc.text().slice(..))
478+ .min_width_1(text)
508− .transform(|range| movement::move_next_word_start(doc.text().slice(..), range, count)),
479+ .transform(|range| movement::move_next_word_start(text, range, count));
509− );
480+ doc.set_selection(view.id, selection);
512fn move_prev_word_start(cx: &mut Context) {
483fn move_prev_word_start(cx: &mut Context) {
513 let count = cx.count();
484 let count = cx.count();
514 let (view, doc) = current!(cx.editor);
485 let (view, doc) = current!(cx.editor);
515− doc.set_selection(
486+ let text = doc.text().slice(..);
517− doc.selection(view.id)
489+ .selection(view.id)
518− .clone()
490+ .clone()
519− .min_width_1(doc.text().slice(..))
491+ .min_width_1(text)
520− .transform(|range| movement::move_prev_word_start(doc.text().slice(..), range, count)),
492+ .transform(|range| movement::move_prev_word_start(text, range, count));
521− );
493+ doc.set_selection(view.id, selection);
524fn move_next_word_end(cx: &mut Context) {
496fn move_next_word_end(cx: &mut Context) {
525 let count = cx.count();
497 let count = cx.count();
526 let (view, doc) = current!(cx.editor);
498 let (view, doc) = current!(cx.editor);
527− doc.set_selection(
499+ let text = doc.text().slice(..);
529− doc.selection(view.id)
502+ .selection(view.id)
530− .clone()
503+ .clone()
531− .min_width_1(doc.text().slice(..))
504+ .min_width_1(text)
532− .transform(|range| movement::move_next_word_end(doc.text().slice(..), range, count)),
505+ .transform(|range| movement::move_next_word_end(text, range, count));
533− );
506+ doc.set_selection(view.id, selection);
536fn move_next_long_word_start(cx: &mut Context) {
509fn move_next_long_word_start(cx: &mut Context) {
537 let count = cx.count();
510 let count = cx.count();
538 let (view, doc) = current!(cx.editor);
511 let (view, doc) = current!(cx.editor);
539− doc.set_selection(
512+ let text = doc.text().slice(..);
541− doc.selection(view.id)
515+ .selection(view.id)
542− .clone()
516+ .clone()
543− .min_width_1(doc.text().slice(..))
517+ .min_width_1(text)
544− .transform(|range| {
545− movement::move_next_long_word_start(doc.text().slice(..), range, count)
518+ .transform(|range| movement::move_next_long_word_start(text, range, count));
546− }),
519+ doc.set_selection(view.id, selection);
550fn move_prev_long_word_start(cx: &mut Context) {
522fn move_prev_long_word_start(cx: &mut Context) {
551 let count = cx.count();
523 let count = cx.count();
552 let (view, doc) = current!(cx.editor);
524 let (view, doc) = current!(cx.editor);
553− doc.set_selection(
525+ let text = doc.text().slice(..);
555− doc.selection(view.id)
528+ .selection(view.id)
556− .clone()
529+ .clone()
557− .min_width_1(doc.text().slice(..))
530+ .min_width_1(text)
558− .transform(|range| {
559− movement::move_prev_long_word_start(doc.text().slice(..), range, count)
531+ .transform(|range| movement::move_prev_long_word_start(text, range, count));
560− }),
532+ doc.set_selection(view.id, selection);
564fn move_next_long_word_end(cx: &mut Context) {
535fn move_next_long_word_end(cx: &mut Context) {
565 let count = cx.count();
536 let count = cx.count();
566 let (view, doc) = current!(cx.editor);
537 let (view, doc) = current!(cx.editor);
567− doc.set_selection(
538+ let text = doc.text().slice(..);
569− doc.selection(view.id)
541+ .selection(view.id)
570− .clone()
542+ .clone()
571− .min_width_1(doc.text().slice(..))
543+ .min_width_1(text)
572− .transform(|range| {
573− movement::move_next_long_word_end(doc.text().slice(..), range, count)
544+ .transform(|range| movement::move_next_long_word_end(text, range, count));
574− }),
545+ doc.set_selection(view.id, selection);
578fn goto_file_start(cx: &mut Context) {
548fn goto_file_start(cx: &mut Context) {
@@ -590,52 +560,52 @@ fn goto_file_end(cx: &mut Context) {
590fn extend_next_word_start(cx: &mut Context) {
560fn extend_next_word_start(cx: &mut Context) {
591 let count = cx.count();
561 let count = cx.count();
592 let (view, doc) = current!(cx.editor);
562 let (view, doc) = current!(cx.editor);
593− doc.set_selection(
563+ let text = doc.text().slice(..);
595− doc.selection(view.id)
566+ .selection(view.id)
596− .clone()
567+ .clone()
597− .min_width_1(doc.text().slice(..))
568+ .min_width_1(text)
598− .transform(|range| {
569+ .transform(|range| {
599− let text = doc.text().slice(..);
600− let word = movement::move_next_word_start(text, range, count);
570+ let word = movement::move_next_word_start(text, range, count);
601− let pos = word.head;
571+ let pos = word.head;
602− range.put(text, pos, true)
572+ range.put(text, pos, true)
604− );
574+ doc.set_selection(view.id, selection);
607fn extend_prev_word_start(cx: &mut Context) {
577fn extend_prev_word_start(cx: &mut Context) {
608 let count = cx.count();
578 let count = cx.count();
609 let (view, doc) = current!(cx.editor);
579 let (view, doc) = current!(cx.editor);
610− doc.set_selection(
580+ let text = doc.text().slice(..);
612− doc.selection(view.id)
583+ .selection(view.id)
613− .clone()
584+ .clone()
614− .min_width_1(doc.text().slice(..))
585+ .min_width_1(text)
615− .transform(|range| {
586+ .transform(|range| {
616− let text = doc.text().slice(..);
617− let word = movement::move_prev_word_start(text, range, count);
587+ let word = movement::move_prev_word_start(text, range, count);
618− let pos = word.head;
588+ let pos = word.head;
619− range.put(text, pos, true)
589+ range.put(text, pos, true)
621− );
591+ doc.set_selection(view.id, selection);
624fn extend_next_word_end(cx: &mut Context) {
594fn extend_next_word_end(cx: &mut Context) {
625 let count = cx.count();
595 let count = cx.count();
626 let (view, doc) = current!(cx.editor);
596 let (view, doc) = current!(cx.editor);
627− doc.set_selection(
597+ let text = doc.text().slice(..);
629− doc.selection(view.id)
600+ .selection(view.id)
630− .clone()
601+ .clone()
631− .min_width_1(doc.text().slice(..))
602+ .min_width_1(text)
632− .transform(|range| {
603+ .transform(|range| {
633− let text = doc.text().slice(..);
634− let word = movement::move_next_word_end(text, range, count);
604+ let word = movement::move_next_word_end(text, range, count);
635− let pos = word.head;
605+ let pos = word.head;
636− range.put(text, pos, true)
606+ range.put(text, pos, true)
638− );
608+ doc.set_selection(view.id, selection);
@@ -678,15 +648,13 @@ where
680 let (view, doc) = current!(cx.editor);
650 let (view, doc) = current!(cx.editor);
651+ let text = doc.text().slice(..);
684− doc.selection(view.id).clone().transform(|range| {
653+ let selection = doc.selection(view.id).clone().transform(|range| {
685− let text = doc.text().slice(..);
686− search_fn(text, ch, range.head, count, inclusive)
654+ search_fn(text, ch, range.head, count, inclusive)
687− .map_or(range, |pos| range.put(text, pos, extend))
655+ .map_or(range, |pos| range.put(text, pos, extend))
689− );
657+ doc.set_selection(view.id, selection);
@@ -939,69 +907,45 @@ fn half_page_down(cx: &mut Context) {
939fn extend_char_left(cx: &mut Context) {
907fn extend_char_left(cx: &mut Context) {
940 let count = cx.count();
908 let count = cx.count();
941 let (view, doc) = current!(cx.editor);
909 let (view, doc) = current!(cx.editor);
942− doc.set_selection(
910+ let text = doc.text().slice(..);
944− doc.selection(view.id).clone().transform(|range| {
912+ let selection = doc.selection(view.id).clone().transform(|range| {
945− movement::move_horizontally(
913+ movement::move_horizontally(text, range, Direction::Backward, count, Movement::Extend)
946− doc.text().slice(..),
948− Direction::Backward,
953− );
915+ doc.set_selection(view.id, selection);
956fn extend_char_right(cx: &mut Context) {
918fn extend_char_right(cx: &mut Context) {
957 let count = cx.count();
919 let count = cx.count();
958 let (view, doc) = current!(cx.editor);
920 let (view, doc) = current!(cx.editor);
959− doc.set_selection(
921+ let text = doc.text().slice(..);
961− doc.selection(view.id).clone().transform(|range| {
923+ let selection = doc.selection(view.id).clone().transform(|range| {
962− movement::move_horizontally(
924+ movement::move_horizontally(text, range, Direction::Forward, count, Movement::Extend)
963− doc.text().slice(..),
970− );
926+ doc.set_selection(view.id, selection);
973fn extend_line_up(cx: &mut Context) {
929fn extend_line_up(cx: &mut Context) {
974 let count = cx.count();
930 let count = cx.count();
975 let (view, doc) = current!(cx.editor);
931 let (view, doc) = current!(cx.editor);
976− doc.set_selection(
932+ let text = doc.text().slice(..);
978− doc.selection(view.id).clone().transform(|range| {
934+ let selection = doc.selection(view.id).clone().transform(|range| {
979− movement::move_vertically(
935+ movement::move_vertically(text, range, Direction::Backward, count, Movement::Extend)
980− doc.text().slice(..),
982− Direction::Backward,
987− );
937+ doc.set_selection(view.id, selection);
990fn extend_line_down(cx: &mut Context) {
940fn extend_line_down(cx: &mut Context) {
991 let count = cx.count();
941 let count = cx.count();
992 let (view, doc) = current!(cx.editor);
942 let (view, doc) = current!(cx.editor);
993− doc.set_selection(
943+ let text = doc.text().slice(..);
995− doc.selection(view.id).clone().transform(|range| {
945+ let selection = doc.selection(view.id).clone().transform(|range| {
996− movement::move_vertically(
946+ movement::move_vertically(text, range, Direction::Forward, count, Movement::Extend)
997− doc.text().slice(..),
1004− );
948+ doc.set_selection(view.id, selection);
1007fn select_all(cx: &mut Context) {
951fn select_all(cx: &mut Context) {
@@ -1222,30 +1166,28 @@ fn change_selection(cx: &mut Context) {
1223fn collapse_selection(cx: &mut Context) {
1167fn collapse_selection(cx: &mut Context) {
1224 let (view, doc) = current!(cx.editor);
1168 let (view, doc) = current!(cx.editor);
1169+ let text = doc.text().slice(..);
1228− doc.selection(view.id).clone().transform(|range| {
1171+ let selection = doc.selection(view.id).clone().transform(|range| {
1229− let pos = if range.head > range.anchor {
1172+ let pos = if range.head > range.anchor {
1230− // For 1-width cursor semantics.
1173+ // For 1-width cursor semantics.
1231− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.head)
1174+ graphemes::prev_grapheme_boundary(text, range.head)
1232− } else {
1175+ } else {
1233− range.head
1176+ range.head
1235− Range::new(pos, pos)
1178+ Range::new(pos, pos)
1237− );
1180+ doc.set_selection(view.id, selection);
1240fn flip_selections(cx: &mut Context) {
1183fn flip_selections(cx: &mut Context) {
1241 let (view, doc) = current!(cx.editor);
1184 let (view, doc) = current!(cx.editor);
1243− doc.set_selection(
1186+ let selection = doc
1245− doc.selection(view.id)
1187+ .selection(view.id)
1246− .clone()
1188+ .clone()
1247− .transform(|range| Range::new(range.head, range.anchor)),
1189+ .transform(|range| Range::new(range.head, range.anchor));
1248− );
1190+ doc.set_selection(view.id, selection);
1251fn enter_insert_mode(doc: &mut Document) {
1193fn enter_insert_mode(doc: &mut Document) {
@@ -1257,12 +1199,11 @@ fn insert_mode(cx: &mut Context) {
1257 let (view, doc) = current!(cx.editor);
1199 let (view, doc) = current!(cx.editor);
1258 enter_insert_mode(doc);
1200 enter_insert_mode(doc);
1260− doc.set_selection(
1202+ let selection = doc
1262− doc.selection(view.id)
1203+ .selection(view.id)
1263− .clone()
1204+ .clone()
1264− .transform(|range| Range::new(range.to(), range.from())),
1205+ .transform(|range| Range::new(range.to(), range.from()));
1265− );
1206+ doc.set_selection(view.id, selection);
1268// inserts at the end of each selection
1209// inserts at the end of each selection
@@ -1286,15 +1227,13 @@ fn append_mode(cx: &mut Context) {
1286 doc.apply(&transaction, view.id);
1227 doc.apply(&transaction, view.id);
1291− selection.clone().transform(|range| {
1230+ let selection = selection.transform(|range| {
1292− Range::new(
1231+ Range::new(
1293− range.from(),
1232+ range.from(),
1294− graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()),
1233+ graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()),
1297− );
1236+ doc.set_selection(view.id, selection);
1300mod cmd {
1239mod cmd {
@@ -2200,15 +2139,13 @@ fn append_to_line(cx: &mut Context) {
2200 let (view, doc) = current!(cx.editor);
2139 let (view, doc) = current!(cx.editor);
2201 enter_insert_mode(doc);
2140 enter_insert_mode(doc);
2205− doc.selection(view.id).clone().transform(|range| {
2142+ let selection = doc.selection(view.id).clone().transform(|range| {
2206− let text = doc.text().slice(..);
2143+ let text = doc.text().slice(..);
2207− let line = range.head_line(text);
2144+ let line = range.head_line(text);
2208− let pos = line_end_char_index(&text, line);
2145+ let pos = line_end_char_index(&text, line);
2209− Range::new(pos, pos)
2146+ Range::new(pos, pos)
2211− );
2148+ doc.set_selection(view.id, selection);
2214/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
2151/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
@@ -2338,15 +2275,14 @@ fn normal_mode(cx: &mut Context) {
2339 // if leaving append mode, move cursor back by 1
2276 // if leaving append mode, move cursor back by 1
2340 if doc.restore_cursor {
2277 if doc.restore_cursor {
2341− doc.set_selection(
2278+ let text = doc.text().slice(..);
2343− doc.selection(view.id).clone().transform(|range| {
2279+ let selection = doc.selection(view.id).clone().transform(|range| {
2344− Range::new(
2280+ Range::new(
2345− range.from(),
2281+ range.from(),
2346− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.to()),
2282+ graphemes::prev_grapheme_boundary(text, range.to()),
2349− );
2285+ doc.set_selection(view.id, selection);
2351 doc.restore_cursor = false;
2287 doc.restore_cursor = false;
@@ -2370,22 +2306,21 @@ fn goto_last_accessed_file(cx: &mut Context) {
2371fn select_mode(cx: &mut Context) {
2307fn select_mode(cx: &mut Context) {
2372 let (view, doc) = current!(cx.editor);
2308 let (view, doc) = current!(cx.editor);
2309+ let text = doc.text().slice(..);
2374 // Make sure all selections are at least 1-wide.
2311 // Make sure all selections are at least 1-wide.
2375 // (With the exception of being in an empty document, of course.)
2312 // (With the exception of being in an empty document, of course.)
2378− doc.selection(view.id).clone().transform(|range| {
2313+ let selection = doc.selection(view.id).clone().transform(|range| {
2379− if range.is_empty() && range.head == doc.text().len_chars() {
2314+ if range.is_empty() && range.head == text.len_chars() {
2380− Range::new(
2315+ Range::new(
2381− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.anchor),
2316+ graphemes::prev_grapheme_boundary(text, range.anchor),
2382− range.head,
2317+ range.head,
2384− } else {
2319+ } else {
2385− range.min_width_1(doc.text().slice(..))
2320+ range.min_width_1(text)
2388− );
2323+ doc.set_selection(view.id, selection);
2390 doc_mut!(cx.editor).mode = Mode::Select;
2325 doc_mut!(cx.editor).mode = Mode::Select;
@@ -2964,13 +2899,13 @@ pub mod insert {
2964 pub fn delete_word_backward(cx: &mut Context) {
2899 pub fn delete_word_backward(cx: &mut Context) {
2965 let count = cx.count();
2900 let count = cx.count();
2966 let (view, doc) = current!(cx.editor);
2901 let (view, doc) = current!(cx.editor);
2902+ let text = doc.text().slice(..);
2968− doc.set_selection(
2904+ let selection = doc
2970− doc.selection(view.id).clone().transform(|range| {
2905+ .selection(view.id)
2971− movement::move_prev_word_start(doc.text().slice(..), range, count)
2907+ .transform(|range| movement::move_prev_word_start(text, range, count));
2972− }),
2908+ doc.set_selection(view.id, selection);
2974 delete_selection(cx)
2909 delete_selection(cx)
@@ -3721,21 +3656,19 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
3721 } = event
3656 } = event
3723 let (view, doc) = current!(cx.editor);
3658 let (view, doc) = current!(cx.editor);
3659+ let text = doc.text().slice(..);
3727− doc.selection(view.id).clone().transform(|range| {
3661+ let selection = doc.selection(view.id).clone().transform(|range| {
3728− let text = doc.text().slice(..);
3729− match ch {
3662+ match ch {
3730− 'w' => textobject::textobject_word(text, range, objtype, count),
3663+ 'w' => textobject::textobject_word(text, range, objtype, count),
3731− // TODO: cancel new ranges if inconsistent surround matches across lines
3664+ // TODO: cancel new ranges if inconsistent surround matches across lines
3732− ch if !ch.is_ascii_alphanumeric() => {
3665+ ch if !ch.is_ascii_alphanumeric() => {
3733− textobject::textobject_surround(text, range, objtype, ch, count)
3666+ textobject::textobject_surround(text, range, objtype, ch, count)
3671+ doc.set_selection(view.id, selection);