@@ -12,6 +12,8 @@
"down": "vim::Down",
"enter": "vim::NextLineStart",
"ctrl-m": "vim::NextLineStart",
+ "+": "vim::NextLineStart",
+ "-": "vim::PreviousLineStart",
"tab": "vim::Tab",
"shift-tab": "vim::Tab",
"k": "vim::Up",
@@ -192,7 +194,6 @@
"ctrl-w g shift-d": "editor::GoToTypeDefinitionSplit",
"ctrl-w space": "editor::OpenExcerptsSplit",
"ctrl-w g space": "editor::OpenExcerptsSplit",
- "-": "pane::RevealInProjectPanel",
"ctrl-6": "pane::AlternateFile"
}
},
@@ -91,6 +91,7 @@ pub enum Motion {
last_find: Box<Motion>,
},
NextLineStart,
+ PreviousLineStart,
StartOfLineDownward,
EndOfLineDownward,
GoToColumn,
@@ -235,6 +236,7 @@ actions!(
EndOfDocument,
Matching,
NextLineStart,
+ PreviousLineStart,
StartOfLineDownward,
EndOfLineDownward,
GoToColumn,
@@ -353,6 +355,9 @@ pub fn register(workspace: &mut Workspace, _: &mut ViewContext<Workspace>) {
workspace.register_action(|_: &mut Workspace, &NextLineStart, cx: _| {
motion(Motion::NextLineStart, cx)
});
+ workspace.register_action(|_: &mut Workspace, &PreviousLineStart, cx: _| {
+ motion(Motion::PreviousLineStart, cx)
+ });
workspace.register_action(|_: &mut Workspace, &StartOfLineDownward, cx: _| {
motion(Motion::StartOfLineDownward, cx)
});
@@ -468,6 +473,7 @@ impl Motion {
| EndOfDocument
| CurrentLine
| NextLineStart
+ | PreviousLineStart
| StartOfLineDownward
| StartOfParagraph
| WindowTop
@@ -537,6 +543,7 @@ impl Motion {
| WindowMiddle
| WindowBottom
| NextLineStart
+ | PreviousLineStart
| ZedSearchResult { .. }
| Jump { .. } => false,
}
@@ -561,7 +568,8 @@ impl Motion {
| PreviousWordEnd { .. }
| NextSubwordEnd { .. }
| PreviousSubwordEnd { .. }
- | NextLineStart => true,
+ | NextLineStart
+ | PreviousLineStart => true,
Left
| Backspace
| Right
@@ -763,6 +771,7 @@ impl Motion {
_ => return None,
},
NextLineStart => (next_line_start(map, point, times), SelectionGoal::None),
+ PreviousLineStart => (previous_line_start(map, point, times), SelectionGoal::None),
StartOfLineDownward => (next_line_start(map, point, times - 1), SelectionGoal::None),
EndOfLineDownward => (last_non_whitespace(map, point, times), SelectionGoal::None),
GoToColumn => (go_to_column(map, point, times), SelectionGoal::None),
@@ -1655,6 +1664,11 @@ fn next_line_start(map: &DisplaySnapshot, point: DisplayPoint, times: usize) ->
first_non_whitespace(map, false, correct_line)
}
+fn previous_line_start(map: &DisplaySnapshot, point: DisplayPoint, times: usize) -> DisplayPoint {
+ let correct_line = start_of_relative_buffer_row(map, point, (times as isize) * -1);
+ first_non_whitespace(map, false, correct_line)
+}
+
fn go_to_column(map: &DisplaySnapshot, point: DisplayPoint, times: usize) -> DisplayPoint {
let correct_line = start_of_relative_buffer_row(map, point, 0);
right(map, correct_line, times.saturating_sub(1))