on master help sign in
Add command to extend to line start or end (#717)
7a9db95Kangwook Lee (이강욱)
helix-term/src/commands.rs+33−6
@@ -252,6 +252,9 @@ impl Command {
252 // TODO: different description ?
252 // TODO: different description ?
253 goto_line_end_newline, "Goto line end",
253 goto_line_end_newline, "Goto line end",
254 goto_first_nonwhitespace, "Goto first non-blank in line",
254 goto_first_nonwhitespace, "Goto first non-blank in line",
255+ extend_to_line_start, "Extend to line start",
256+ extend_to_line_end, "Extend to line end",
257+ extend_to_line_end_newline, "Extend to line end",
255 signature_help, "Show signature help",
258 signature_help, "Show signature help",
256 insert_tab, "Insert tab char",
259 insert_tab, "Insert tab char",
257 insert_newline, "Insert newline char",
260 insert_newline, "Insert newline char",
@@ -407,7 +410,7 @@ fn extend_line_down(cx: &mut Context) {
407 move_impl(cx, move_vertically, Direction::Forward, Movement::Extend)
410 move_impl(cx, move_vertically, Direction::Forward, Movement::Extend)
408}
411}
409
412
410−fn goto_line_end(cx: &mut Context) {
413+fn goto_line_end_impl(cx: &mut Context, movement: Movement) {
411 let (view, doc) = current!(cx.editor);
414 let (view, doc) = current!(cx.editor);
412 let text = doc.text().slice(..);
415 let text = doc.text().slice(..);
413
416
@@ -418,12 +421,20 @@ fn goto_line_end(cx: &mut Context) {
418 let pos = graphemes::prev_grapheme_boundary(text, line_end_char_index(&text, line))
421 let pos = graphemes::prev_grapheme_boundary(text, line_end_char_index(&text, line))
419 .max(line_start);
422 .max(line_start);
420
423
421− range.put_cursor(text, pos, doc.mode == Mode::Select)
424+ range.put_cursor(text, pos, movement == Movement::Extend)
422 });
425 });
423 doc.set_selection(view.id, selection);
426 doc.set_selection(view.id, selection);
424}
427}
425
428
426−fn goto_line_end_newline(cx: &mut Context) {
429+fn goto_line_end(cx: &mut Context) {
430+ goto_line_end_impl(cx, Movement::Move)
431+}
432+
433+fn extend_to_line_end(cx: &mut Context) {
434+ goto_line_end_impl(cx, Movement::Extend)
435+}
436+
437+fn goto_line_end_newline_impl(cx: &mut Context, movement: Movement) {
427 let (view, doc) = current!(cx.editor);
438 let (view, doc) = current!(cx.editor);
428 let text = doc.text().slice(..);
439 let text = doc.text().slice(..);
429
440
@@ -431,12 +442,20 @@ fn goto_line_end_newline(cx: &mut Context) {
431 let line = range.cursor_line(text);
442 let line = range.cursor_line(text);
432 let pos = line_end_char_index(&text, line);
443 let pos = line_end_char_index(&text, line);
433
444
434− range.put_cursor(text, pos, doc.mode == Mode::Select)
445+ range.put_cursor(text, pos, movement == Movement::Extend)
435 });
446 });
436 doc.set_selection(view.id, selection);
447 doc.set_selection(view.id, selection);
437}
448}
438
449
439−fn goto_line_start(cx: &mut Context) {
450+fn goto_line_end_newline(cx: &mut Context) {
451+ goto_line_end_newline_impl(cx, Movement::Move)
452+}
453+
454+fn extend_to_line_end_newline(cx: &mut Context) {
455+ goto_line_end_newline_impl(cx, Movement::Extend)
456+}
457+
458+fn goto_line_start_impl(cx: &mut Context, movement: Movement) {
440 let (view, doc) = current!(cx.editor);
459 let (view, doc) = current!(cx.editor);
441 let text = doc.text().slice(..);
460 let text = doc.text().slice(..);
442
461
@@ -445,11 +464,19 @@ fn goto_line_start(cx: &mut Context) {
445
464
446 // adjust to start of the line
465 // adjust to start of the line
447 let pos = text.line_to_char(line);
466 let pos = text.line_to_char(line);
448− range.put_cursor(text, pos, doc.mode == Mode::Select)
467+ range.put_cursor(text, pos, movement == Movement::Extend)
449 });
468 });
450 doc.set_selection(view.id, selection);
469 doc.set_selection(view.id, selection);
451}
470}
452
471
472+fn goto_line_start(cx: &mut Context) {
473+ goto_line_start_impl(cx, Movement::Move)
474+}
475+
476+fn extend_to_line_start(cx: &mut Context) {
477+ goto_line_start_impl(cx, Movement::Extend)
478+}
479+
453fn goto_first_nonwhitespace(cx: &mut Context) {
480fn goto_first_nonwhitespace(cx: &mut Context) {
454 let (view, doc) = current!(cx.editor);
481 let (view, doc) = current!(cx.editor);
455 let text = doc.text().slice(..);
482 let text = doc.text().slice(..);
helix-term/src/keymap.rs+2−2
@@ -592,8 +592,8 @@ impl Default for Keymaps {
592 "T" => extend_till_prev_char,
592 "T" => extend_till_prev_char,
593 "F" => extend_prev_char,
593 "F" => extend_prev_char,
594
594
595− "home" => goto_line_start,
595+ "home" => extend_to_line_start,
596− "end" => goto_line_end,
596+ "end" => extend_to_line_end,
597 "esc" => exit_select_mode,
597 "esc" => exit_select_mode,
598
598
599 "v" => normal_mode,
599 "v" => normal_mode,