-
-
Notifications
You must be signed in to change notification settings - Fork 2.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
readline style insert mode #1039
Changes from 7 commits
0d1dd46
9e45827
6871d5b
cb47f94
3b9dc0c
44601d4
9fb0d40
b521c04
83c696e
69e0f8f
8569dcf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -185,6 +185,7 @@ impl Command { | |||||||||||||||||||||||||||||||
copy_selection_on_prev_line, "Copy selection on previous line", | ||||||||||||||||||||||||||||||||
move_next_word_start, "Move to beginning of next word", | ||||||||||||||||||||||||||||||||
move_prev_word_start, "Move to beginning of previous word", | ||||||||||||||||||||||||||||||||
move_prev_word_end, "Move to end of previous word", | ||||||||||||||||||||||||||||||||
move_next_word_end, "Move to end of next word", | ||||||||||||||||||||||||||||||||
move_next_long_word_start, "Move to beginning of next long word", | ||||||||||||||||||||||||||||||||
move_prev_long_word_start, "Move to beginning of previous long word", | ||||||||||||||||||||||||||||||||
|
@@ -279,6 +280,9 @@ impl Command { | |||||||||||||||||||||||||||||||
delete_char_backward, "Delete previous char", | ||||||||||||||||||||||||||||||||
delete_char_forward, "Delete next char", | ||||||||||||||||||||||||||||||||
delete_word_backward, "Delete previous word", | ||||||||||||||||||||||||||||||||
delete_word_forward, "Delete next word", | ||||||||||||||||||||||||||||||||
kill_to_line_start, "Delete content till the start of the line", | ||||||||||||||||||||||||||||||||
kill_to_line_end, "Delete content till the end of the line", | ||||||||||||||||||||||||||||||||
undo, "Undo change", | ||||||||||||||||||||||||||||||||
redo, "Redo change", | ||||||||||||||||||||||||||||||||
yank, "Yank selection", | ||||||||||||||||||||||||||||||||
|
@@ -321,6 +325,7 @@ impl Command { | |||||||||||||||||||||||||||||||
vsplit, "Vertical right split", | ||||||||||||||||||||||||||||||||
wclose, "Close window", | ||||||||||||||||||||||||||||||||
select_register, "Select register", | ||||||||||||||||||||||||||||||||
insert_register, "Insert register", | ||||||||||||||||||||||||||||||||
align_view_middle, "Align view middle", | ||||||||||||||||||||||||||||||||
align_view_top, "Align view top", | ||||||||||||||||||||||||||||||||
align_view_center, "Align view center", | ||||||||||||||||||||||||||||||||
|
@@ -563,6 +568,16 @@ fn extend_to_line_start(cx: &mut Context) { | |||||||||||||||||||||||||||||||
goto_line_start_impl(view, doc, Movement::Extend) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn kill_to_line_start(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
extend_to_line_start(cx); | ||||||||||||||||||||||||||||||||
delete_selection_insert_mode(cx); | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn kill_to_line_end(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
extend_to_line_end(cx); | ||||||||||||||||||||||||||||||||
delete_selection_insert_mode(cx); | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn goto_first_nonwhitespace(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
let (view, doc) = current!(cx.editor); | ||||||||||||||||||||||||||||||||
let text = doc.text().slice(..); | ||||||||||||||||||||||||||||||||
|
@@ -639,6 +654,10 @@ fn move_prev_word_start(cx: &mut Context) { | |||||||||||||||||||||||||||||||
move_word_impl(cx, movement::move_prev_word_start) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn move_prev_word_end(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
move_word_impl(cx, movement::move_prev_word_end) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn move_next_word_end(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
move_word_impl(cx, movement::move_next_word_end) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
@@ -1541,6 +1560,21 @@ fn delete_selection_impl(reg: &mut Register, doc: &mut Document, view_id: ViewId | |||||||||||||||||||||||||||||||
doc.apply(&transaction, view_id); | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn delete_selection_insert_mode(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
let (view, doc) = current!(cx.editor); | ||||||||||||||||||||||||||||||||
let view_id = view.id; | ||||||||||||||||||||||||||||||||
let selection = doc.selection(view_id); | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
// then delete | ||||||||||||||||||||||||||||||||
let transaction = Transaction::change_by_selection(doc.text(), selection, |range| { | ||||||||||||||||||||||||||||||||
(range.from(), range.to(), None) | ||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||
doc.apply(&transaction, view_id); | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
// exit select mode, if currently in select mode | ||||||||||||||||||||||||||||||||
exit_select_mode(cx); | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn delete_selection(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
let reg_name = cx.register.unwrap_or('"'); | ||||||||||||||||||||||||||||||||
let (view, doc) = current!(cx.editor); | ||||||||||||||||||||||||||||||||
|
@@ -3830,7 +3864,20 @@ pub mod insert { | |||||||||||||||||||||||||||||||
.clone() | ||||||||||||||||||||||||||||||||
.transform(|range| movement::move_prev_word_start(text, range, count)); | ||||||||||||||||||||||||||||||||
doc.set_selection(view.id, selection); | ||||||||||||||||||||||||||||||||
delete_selection(cx) | ||||||||||||||||||||||||||||||||
delete_selection_insert_mode(cx) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
pub fn delete_word_forward(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
let count = cx.count(); | ||||||||||||||||||||||||||||||||
let (view, doc) = current!(cx.editor); | ||||||||||||||||||||||||||||||||
let text = doc.text().slice(..); | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
let selection = doc | ||||||||||||||||||||||||||||||||
.selection(view.id) | ||||||||||||||||||||||||||||||||
.clone() | ||||||||||||||||||||||||||||||||
.transform(|range| movement::move_next_word_start(text, range, count)); | ||||||||||||||||||||||||||||||||
doc.set_selection(view.id, selection); | ||||||||||||||||||||||||||||||||
delete_selection_insert_mode(cx) | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah you still need to build a selection, but rather than use
Suggested change
You can just inline the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the suggestions, updated the code. |
||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
|
@@ -4731,6 +4778,15 @@ fn select_register(cx: &mut Context) { | |||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn insert_register(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
cx.on_next_key(move |cx, event| { | ||||||||||||||||||||||||||||||||
if let Some(ch) = event.char() { | ||||||||||||||||||||||||||||||||
cx.editor.selected_register = Some(ch); | ||||||||||||||||||||||||||||||||
paste_before(cx); | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
sudormrfbin marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
fn align_view_top(cx: &mut Context) { | ||||||||||||||||||||||||||||||||
let (view, doc) = current!(cx.editor); | ||||||||||||||||||||||||||||||||
align_view(doc, view, Align::Top); | ||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please just use delete_selection_impl. In insert mode we don't want to do any logic related to exiting select mode.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The delete_selection_impl would yank the text to a register, is there a
_
register for this? And I think we need create a selection to usedelete_selection_impl
too, does it mean that we already touch selection data?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, maybe use
directly in your implementations then?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's still need to make a selection to pass in change_by_selection, right? So I just need remove the
exit_select_mode(cx);
?