Skip to content

Commit

Permalink
Add emacs mark mode
Browse files Browse the repository at this point in the history
Updates #21927
Closes #8580

Co-Authored-By: Peter <[email protected]>
  • Loading branch information
ConradIrwin and notpeter committed Jan 17, 2025
1 parent 5da6789 commit 57df697
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 9 deletions.
29 changes: 28 additions & 1 deletion assets/keymaps/macos/emacs.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"ctrl-x b": "tab_switcher::Toggle", // switch-to-buffer
"alt-g g": "go_to_line::Toggle", // goto-line
"alt-g alt-g": "go_to_line::Toggle", // goto-line
//"ctrl-space": "editor::SetMark",
"ctrl-space": "editor::SetMark", // set-mark
"ctrl-x ctrl-x": "editor::ExchangeMark", // exchange-point-and-mark
"ctrl-f": "editor::MoveRight", // forward-char
"ctrl-b": "editor::MoveLeft", // backward-char
"ctrl-n": "editor::MoveDown", // next-line
Expand Down Expand Up @@ -55,6 +56,32 @@
"alt-^": "editor::JoinLines" // join-line
}
},
{
"context": "selection_mode",
"bindings": {
"right": "editor::SelectRight",
"left": "editor::SelectLeft",
"down": "editor::SelectDown",
"up": "editor::SelectUp",
"home": "editor::SelectToBeginningOfLine",
"end": "editor::SelectToEndOfLine",
"alt-left": "editor::SelectToPreviousWordStart",
"alt-right": "editor::SelectToNextWordEnd",
"pagedown": "editor::SelectPageDown",
"pageup": "editor::SelectPageUp",
"ctrl-f": "editor::SelectRight",
"ctrl-b": "editor::SelectLeft",
"ctrl-n": "editor::SelectDown",
"ctrl-p": "editor::SelectUp",
"ctrl-a": "editor::SelectToBeginningOfLine",
"ctrl-e": "editor::SelectToEndOfLine",
"alt-f": "editor::SelectToNextWordEnd",
"alt-b": "editor::SelectToPreviousSubwordStart",
"alt-<": "editor::SelectToBeginning",
"alt->": "editor::SelectToEnd",
"ctrl-g": "editor::Cancel"
}
},
{
"context": "Workspace",
"bindings": {
Expand Down
2 changes: 2 additions & 0 deletions crates/editor/src/actions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,8 @@ gpui::actions!(
ToggleInlayHints,
ToggleInlineCompletions,
ToggleLineNumbers,
ExchangeMark,
SetMark,
ToggleRelativeLineNumbers,
ToggleSelectionMenu,
ToggleSoftWrap,
Expand Down
40 changes: 32 additions & 8 deletions crates/editor/src/editor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,7 @@ pub struct Editor {
next_scroll_position: NextScrollCursorCenterTopBottom,
addons: HashMap<TypeId, Box<dyn Addon>>,
registered_buffers: HashMap<BufferId, OpenLspBufferHandle>,
selection_mark_mode: bool,
toggle_fold_multiple_buffers: Task<()>,
_scroll_cursor_center_top_bottom_task: Task<()>,
}
Expand Down Expand Up @@ -1361,6 +1362,7 @@ impl Editor {
addons: HashMap::default(),
registered_buffers: HashMap::default(),
_scroll_cursor_center_top_bottom_task: Task::ready(()),
selection_mark_mode: false,
toggle_fold_multiple_buffers: Task::ready(()),
text_style_refinement: None,
};
Expand Down Expand Up @@ -1453,13 +1455,8 @@ impl Editor {
key_context.add("inline_completion");
}

if !self
.selections
.disjoint
.iter()
.all(|selection| selection.start == selection.end)
{
key_context.add("selection");
if self.selection_mark_mode {
key_context.add("selection_mode");
}

key_context
Expand Down Expand Up @@ -2474,6 +2471,8 @@ impl Editor {
}

pub fn cancel(&mut self, _: &Cancel, cx: &mut ViewContext<Self>) {
self.selection_mark_mode = false;

if self.clear_expanded_diff_hunks(cx) {
cx.notify();
return;
Expand Down Expand Up @@ -10586,6 +10585,32 @@ impl Editor {
}
}

pub fn set_mark(&mut self, _: &actions::SetMark, cx: &mut ViewContext<Self>) {
if self.selection_mark_mode {
self.change_selections(None, cx, |s| {
s.move_with(|_, sel| {
sel.collapse_to(sel.head(), SelectionGoal::None);
});
})
}
self.selection_mark_mode = true;
cx.notify();
}

pub fn exchange_mark(&mut self, _: &actions::ExchangeMark, cx: &mut ViewContext<Self>) {
if self.selection_mark_mode {
self.change_selections(None, cx, |s| {
s.move_with(|_, sel| {
if sel.start != sel.end {
sel.reversed = !sel.reversed
}
});
})
}
self.selection_mark_mode = true;
cx.notify();
}

pub fn toggle_fold(&mut self, _: &actions::ToggleFold, cx: &mut ViewContext<Self>) {
if self.is_singleton(cx) {
let selection = self.selections.newest::<Point>(cx);
Expand Down Expand Up @@ -15198,7 +15223,6 @@ fn check_multiline_range(buffer: &Buffer, range: Range<usize>) -> Range<usize> {
range.start..range.start
}
}

pub struct KillRing(ClipboardItem);
impl Global for KillRing {}

Expand Down
2 changes: 2 additions & 0 deletions crates/editor/src/element.rs
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,8 @@ impl EditorElement {
register_action(view, cx, Editor::unfold_all);
register_action(view, cx, Editor::unfold_at);
register_action(view, cx, Editor::fold_selected_ranges);
register_action(view, cx, Editor::set_mark);
register_action(view, cx, Editor::exchange_mark);
register_action(view, cx, Editor::show_completions);
register_action(view, cx, Editor::toggle_code_actions);
register_action(view, cx, Editor::open_excerpts);
Expand Down

0 comments on commit 57df697

Please sign in to comment.