Skip to content
242 changes: 221 additions & 21 deletions src/core_editor/editor.rs

Large diffs are not rendered by default.

385 changes: 371 additions & 14 deletions src/core_editor/line_buffer.rs

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions src/edit_mode/emacs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@ pub fn default_emacs_keybindings() -> Keybindings {
KC::Char('y'),
edit_bind(EC::PasteCutBufferBefore),
);
kb.add_binding(KM::CONTROL, KC::Char('w'), edit_bind(EC::CutWordLeft));
kb.add_binding(KM::CONTROL, KC::Char('w'), edit_bind(EC::CutEmacsWordLeft));
kb.add_binding(KM::CONTROL, KC::Char('k'), edit_bind(EC::KillLine));
kb.add_binding(KM::CONTROL, KC::Char('u'), edit_bind(EC::CutFromStart));
kb.add_binding(KM::ALT, KC::Char('d'), edit_bind(EC::CutWordRight));
kb.add_binding(KM::ALT, KC::Char('d'), edit_bind(EC::CutEmacsWordRight));
// Edits
kb.add_binding(KM::CONTROL, KC::Char('t'), edit_bind(EC::SwapGraphemes));

Expand All @@ -63,27 +63,27 @@ pub fn default_emacs_keybindings() -> Keybindings {
kb.add_binding(
KM::ALT,
KC::Left,
edit_bind(EC::MoveWordLeft { select: false }),
edit_bind(EC::MoveEmacsWordLeft { select: false }),
);
kb.add_binding(
KM::ALT,
KC::Right,
ReedlineEvent::UntilFound(vec![
ReedlineEvent::HistoryHintWordComplete,
edit_bind(EC::MoveWordRight { select: false }),
edit_bind(EC::MoveEmacsWordRight { select: false }),
]),
);
kb.add_binding(
KM::ALT,
KC::Char('b'),
edit_bind(EC::MoveWordLeft { select: false }),
edit_bind(EC::MoveEmacsWordLeft { select: false }),
);
kb.add_binding(
KM::ALT,
KC::Char('f'),
ReedlineEvent::UntilFound(vec![
ReedlineEvent::HistoryHintWordComplete,
edit_bind(EC::MoveWordRight { select: false }),
edit_bind(EC::MoveEmacsWordRight { select: false }),
]),
);
// Edits
Expand Down
8 changes: 4 additions & 4 deletions src/edit_mode/keybindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,14 @@ pub fn add_common_navigation_bindings(kb: &mut Keybindings) {
kb.add_binding(
KM::CONTROL,
KC::Left,
edit_bind(EC::MoveWordLeft { select: false }),
edit_bind(EC::MoveEmacsWordLeft { select: false }),
);
kb.add_binding(
KM::CONTROL,
KC::Right,
ReedlineEvent::UntilFound(vec![
ReedlineEvent::HistoryHintWordComplete,
edit_bind(EC::MoveWordRight { select: false }),
edit_bind(EC::MoveEmacsWordRight { select: false }),
]),
);
// Home/End & ctrl+a/ctrl+e
Expand Down Expand Up @@ -272,12 +272,12 @@ pub fn add_common_selection_bindings(kb: &mut Keybindings) {
kb.add_binding(
KM::SHIFT | KM::CONTROL,
KC::Left,
edit_bind(EC::MoveWordLeft { select: true }),
edit_bind(EC::MoveEmacsWordLeft { select: true }),
);
kb.add_binding(
KM::SHIFT | KM::CONTROL,
KC::Right,
edit_bind(EC::MoveWordRight { select: true }),
edit_bind(EC::MoveEmacsWordRight { select: true }),
);
kb.add_binding(
KM::SHIFT,
Expand Down
54 changes: 32 additions & 22 deletions src/edit_mode/vi/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -329,17 +329,21 @@ impl Command {
Self::Delete => match motion {
Motion::End => Some(vec![ReedlineOption::Edit(EditCommand::CutToLineEnd)]),
Motion::Line => Some(vec![ReedlineOption::Edit(EditCommand::CutCurrentLine)]),
Motion::NextWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutWordRightToNext)])
}
Motion::NextWord => Some(vec![ReedlineOption::Edit(
EditCommand::CutEmacsWordRightToNext,
)]),
Motion::NextBigWord => Some(vec![ReedlineOption::Edit(
EditCommand::CutBigWordRightToNext,
)]),
Motion::NextWordEnd => Some(vec![ReedlineOption::Edit(EditCommand::CutWordRight)]),
Motion::NextBigWordEnd => {
Some(vec![ReedlineOption::Edit(EditCommand::CutBigWordRight)])
Motion::NextWordEnd => {
Some(vec![ReedlineOption::Edit(EditCommand::CutViWordRightEnd)])
}
Motion::NextBigWordEnd => Some(vec![ReedlineOption::Edit(
EditCommand::CutViBigWordRightEnd,
)]),
Motion::PreviousWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutViWordLeft)])
}
Motion::PreviousWord => Some(vec![ReedlineOption::Edit(EditCommand::CutWordLeft)]),
Motion::PreviousBigWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutBigWordLeft)])
}
Expand Down Expand Up @@ -393,18 +397,20 @@ impl Command {
ReedlineOption::Edit(EditCommand::MoveToLineStart { select: false }),
ReedlineOption::Edit(EditCommand::CutToLineEnd),
]),
Motion::NextWord => Some(vec![ReedlineOption::Edit(EditCommand::CutWordRight)]),
Motion::NextBigWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutBigWordRight)])
Motion::NextWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutViWordRightEnd)])
}
Motion::NextBigWord => Some(vec![ReedlineOption::Edit(
EditCommand::CutViBigWordRightEnd,
)]),
Motion::NextWordEnd => {
Some(vec![ReedlineOption::Edit(EditCommand::CutWordRight)])
}
Motion::NextBigWordEnd => {
Some(vec![ReedlineOption::Edit(EditCommand::CutBigWordRight)])
Some(vec![ReedlineOption::Edit(EditCommand::CutViWordRightEnd)])
}
Motion::NextBigWordEnd => Some(vec![ReedlineOption::Edit(
EditCommand::CutViBigWordRightEnd,
)]),
Motion::PreviousWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutWordLeft)])
Some(vec![ReedlineOption::Edit(EditCommand::CutViWordLeft)])
}
Motion::PreviousBigWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CutBigWordLeft)])
Expand Down Expand Up @@ -464,17 +470,21 @@ impl Command {
Self::Yank => match motion {
Motion::End => Some(vec![ReedlineOption::Edit(EditCommand::CopyToLineEnd)]),
Motion::Line => Some(vec![ReedlineOption::Edit(EditCommand::CopyCurrentLine)]),
Motion::NextWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CopyWordRightToNext)])
}
Motion::NextWord => Some(vec![ReedlineOption::Edit(
EditCommand::CopyEmacsWordRightToNext,
)]),
Motion::NextBigWord => Some(vec![ReedlineOption::Edit(
EditCommand::CopyBigWordRightToNext,
)]),
Motion::NextWordEnd => Some(vec![ReedlineOption::Edit(EditCommand::CopyWordRight)]),
Motion::NextBigWordEnd => {
Some(vec![ReedlineOption::Edit(EditCommand::CopyBigWordRight)])
Motion::NextWordEnd => {
Some(vec![ReedlineOption::Edit(EditCommand::CopyViWordRightEnd)])
}
Motion::NextBigWordEnd => Some(vec![ReedlineOption::Edit(
EditCommand::CopyViBigWordRightEnd,
)]),
Motion::PreviousWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CopyViWordLeft)])
}
Motion::PreviousWord => Some(vec![ReedlineOption::Edit(EditCommand::CopyWordLeft)]),
Motion::PreviousBigWord => {
Some(vec![ReedlineOption::Edit(EditCommand::CopyBigWordLeft)])
}
Expand Down
6 changes: 3 additions & 3 deletions src/edit_mode/vi/motion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,21 +195,21 @@ impl Motion {
ReedlineEvent::Down,
]))
}],
Motion::NextWord => vec![ReedlineOption::Edit(EditCommand::MoveWordRightStart {
Motion::NextWord => vec![ReedlineOption::Edit(EditCommand::MoveViWordRightStart {
select: select_mode,
})],
Motion::NextBigWord => vec![ReedlineOption::Edit(EditCommand::MoveBigWordRightStart {
select: select_mode,
})],
Motion::NextWordEnd => vec![ReedlineOption::Edit(EditCommand::MoveWordRightEnd {
Motion::NextWordEnd => vec![ReedlineOption::Edit(EditCommand::MoveViWordRightEnd {
select: select_mode,
})],
Motion::NextBigWordEnd => {
vec![ReedlineOption::Edit(EditCommand::MoveBigWordRightEnd {
select: select_mode,
})]
}
Motion::PreviousWord => vec![ReedlineOption::Edit(EditCommand::MoveWordLeft {
Motion::PreviousWord => vec![ReedlineOption::Edit(EditCommand::MoveViWordLeft {
select: select_mode,
})],
Motion::PreviousBigWord => vec![ReedlineOption::Edit(EditCommand::MoveBigWordLeft {
Expand Down
22 changes: 11 additions & 11 deletions src/edit_mode/vi/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ mod tests {
ReedlineEvent::Up,
])]))]
#[case(&['w'],
ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveWordRightStart{select:false}])]))]
ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveViWordRightStart{select:false}])]))]
#[case(&['W'],
ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveBigWordRightStart{select:false}])]))]
#[case(&['2', 'l'], ReedlineEvent::Multiple(vec![
Expand Down Expand Up @@ -524,24 +524,24 @@ mod tests {
]))]
#[case(&['d', 'd'], ReedlineEvent::Multiple(vec![
ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine])]))]
#[case(&['d', 'w'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutWordRightToNext])]))]
#[case(&['d', 'w'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutEmacsWordRightToNext])]))]
#[case(&['d', 'W'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutBigWordRightToNext])]))]
#[case(&['d', 'e'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutWordRight])]))]
#[case(&['d', 'b'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutWordLeft])]))]
#[case(&['d', 'e'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViWordRightEnd])]))]
#[case(&['d', 'b'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViWordLeft])]))]
#[case(&['d', 'B'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutBigWordLeft])]))]
#[case(&['c', 'c'], ReedlineEvent::Multiple(vec![
ReedlineEvent::Edit(vec![EditCommand::MoveToLineStart { select: false }]), ReedlineEvent::Edit(vec![EditCommand::CutToLineEnd]), ReedlineEvent::Repaint]))]
#[case(&['c', 'w'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutWordRight]), ReedlineEvent::Repaint]))]
#[case(&['c', 'W'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutBigWordRight]), ReedlineEvent::Repaint]))]
#[case(&['c', 'e'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutWordRight]), ReedlineEvent::Repaint]))]
#[case(&['c', 'b'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutWordLeft]), ReedlineEvent::Repaint]))]
#[case(&['c', 'w'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViWordRightEnd]), ReedlineEvent::Repaint]))]
#[case(&['c', 'W'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViBigWordRightEnd]), ReedlineEvent::Repaint]))]
#[case(&['c', 'e'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViWordRightEnd]), ReedlineEvent::Repaint]))]
#[case(&['c', 'b'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViWordLeft]), ReedlineEvent::Repaint]))]
#[case(&['c', 'B'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutBigWordLeft]), ReedlineEvent::Repaint]))]
#[case(&['d', 'h'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::Backspace])]))]
#[case(&['d', 'l'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::Delete])]))]
#[case(&['2', 'd', 'd'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine]), ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine])]))]
// #[case(&['d', 'j'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine]), ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine])]))]
// #[case(&['d', 'k'], ReedlineEvent::Multiple(vec![ReedlineEvent::Up, ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine]), ReedlineEvent::Edit(vec![EditCommand::CutCurrentLine])]))]
#[case(&['d', 'E'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutBigWordRight])]))]
#[case(&['d', 'E'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViBigWordRightEnd])]))]
#[case(&['d', '0'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutFromLineStart])]))]
#[case(&['d', '^'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutFromLineNonBlankStart])]))]
#[case(&['d', '$'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutToLineEnd])]))]
Expand All @@ -551,7 +551,7 @@ mod tests {
#[case(&['d', 'T', 'a'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutLeftBefore('a')])]))]
#[case(&['d', 'g', 'g'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutFromStartLinewise { leave_blank_line: false }])]))]
#[case(&['d', 'G'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutToEndLinewise { leave_blank_line: false }])]))]
#[case(&['c', 'E'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutBigWordRight]), ReedlineEvent::Repaint]))]
#[case(&['c', 'E'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutViBigWordRightEnd]), ReedlineEvent::Repaint]))]
#[case(&['c', '0'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutFromLineStart]), ReedlineEvent::Repaint]))]
#[case(&['c', '^'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutFromLineNonBlankStart]), ReedlineEvent::Repaint]))]
#[case(&['c', '$'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::CutToLineEnd]), ReedlineEvent::Repaint]))]
Expand Down Expand Up @@ -622,7 +622,7 @@ mod tests {
])]))]
#[case(&['k'], ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveLineUp { select: true }])]))]
#[case(&['w'],
ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveWordRightStart{select:true}])]))]
ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveViWordRightStart{select:true}])]))]
#[case(&['W'],
ReedlineEvent::Multiple(vec![ReedlineEvent::Edit(vec![EditCommand::MoveBigWordRightStart{select:true}])]))]
#[case(&['2', 'l'], ReedlineEvent::Multiple(vec![
Expand Down
Loading
Loading