Add keybindings for accepting hunks (#19749)
I went with Cmd-Shift-Y on macOS (Ctrl-Shift-Y on Linux) for "yes accept this individual hunk" - both are currently unused. I went with Cmd-Shift-A on macOS (Ctrl-Alt-A on Linux) for "accept all hunks" - both are unused. (Ctrl-Shift-A on Linux was taken, as is Ctrl-Alt-Y, so although the pairing of Ctrl-Shift-Y and Ctrl-Alt-A isn't necessarily obvious, the letters seem intuitive - "yes" and "all" - and those key combinations don't conflict with anything.) Release Notes: - Added keybindings for applying hunks in Proposed Changes <img width="247" alt="Screenshot 2024-10-25 at 12 47 00 PM" src="https://github.com/user-attachments/assets/d6355621-ba80-4ee2-8918-b7239a4d29be">
This commit is contained in:
parent
24cb694494
commit
c9db1b9a7b
6 changed files with 45 additions and 18 deletions
|
@ -505,6 +505,13 @@
|
||||||
"ctrl-enter": "assistant::InlineAssist"
|
"ctrl-enter": "assistant::InlineAssist"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"context": "ProposedChangesEditor",
|
||||||
|
"bindings": {
|
||||||
|
"ctrl-shift-y": "editor::ApplyDiffHunk",
|
||||||
|
"ctrl-alt-a": "editor::ApplyAllDiffHunks"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"context": "Editor && jupyter && !ContextEditor",
|
"context": "Editor && jupyter && !ContextEditor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
|
|
|
@ -538,6 +538,13 @@
|
||||||
"ctrl-enter": "assistant::InlineAssist"
|
"ctrl-enter": "assistant::InlineAssist"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"context": "ProposedChangesEditor",
|
||||||
|
"bindings": {
|
||||||
|
"cmd-shift-y": "editor::ApplyDiffHunk",
|
||||||
|
"cmd-shift-a": "editor::ApplyAllDiffHunks"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"context": "PromptEditor",
|
"context": "PromptEditor",
|
||||||
"bindings": {
|
"bindings": {
|
||||||
|
|
|
@ -193,6 +193,7 @@ gpui::actions!(
|
||||||
AcceptPartialInlineCompletion,
|
AcceptPartialInlineCompletion,
|
||||||
AddSelectionAbove,
|
AddSelectionAbove,
|
||||||
AddSelectionBelow,
|
AddSelectionBelow,
|
||||||
|
ApplyAllDiffHunks,
|
||||||
ApplyDiffHunk,
|
ApplyDiffHunk,
|
||||||
Backspace,
|
Backspace,
|
||||||
Cancel,
|
Cancel,
|
||||||
|
|
|
@ -444,6 +444,7 @@ impl EditorElement {
|
||||||
register_action(view, cx, Editor::accept_inline_completion);
|
register_action(view, cx, Editor::accept_inline_completion);
|
||||||
register_action(view, cx, Editor::revert_file);
|
register_action(view, cx, Editor::revert_file);
|
||||||
register_action(view, cx, Editor::revert_selected_hunks);
|
register_action(view, cx, Editor::revert_selected_hunks);
|
||||||
|
register_action(view, cx, Editor::apply_all_diff_hunks);
|
||||||
register_action(view, cx, Editor::apply_selected_diff_hunks);
|
register_action(view, cx, Editor::apply_selected_diff_hunks);
|
||||||
register_action(view, cx, Editor::open_active_item_in_terminal);
|
register_action(view, cx, Editor::open_active_item_in_terminal);
|
||||||
register_action(view, cx, Editor::reload_file)
|
register_action(view, cx, Editor::reload_file)
|
||||||
|
|
|
@ -16,10 +16,10 @@ use util::RangeExt;
|
||||||
use workspace::Item;
|
use workspace::Item;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
editor_settings::CurrentLineHighlight, hunk_status, hunks_for_selections, ApplyDiffHunk,
|
editor_settings::CurrentLineHighlight, hunk_status, hunks_for_selections, ApplyAllDiffHunks,
|
||||||
BlockPlacement, BlockProperties, BlockStyle, CustomBlockId, DiffRowHighlight, DisplayRow,
|
ApplyDiffHunk, BlockPlacement, BlockProperties, BlockStyle, CustomBlockId, DiffRowHighlight,
|
||||||
DisplaySnapshot, Editor, EditorElement, ExpandAllHunkDiffs, GoToHunk, GoToPrevHunk, RevertFile,
|
DisplayRow, DisplaySnapshot, Editor, EditorElement, ExpandAllHunkDiffs, GoToHunk, GoToPrevHunk,
|
||||||
RevertSelectedHunks, ToDisplayPoint, ToggleHunkDiff,
|
RevertFile, RevertSelectedHunks, ToDisplayPoint, ToggleHunkDiff,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -352,7 +352,11 @@ impl Editor {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn apply_all_diff_hunks(&mut self, cx: &mut ViewContext<Self>) {
|
pub(crate) fn apply_all_diff_hunks(
|
||||||
|
&mut self,
|
||||||
|
_: &ApplyAllDiffHunks,
|
||||||
|
cx: &mut ViewContext<Self>,
|
||||||
|
) {
|
||||||
let buffers = self.buffer.read(cx).all_buffers();
|
let buffers = self.buffer.read(cx).all_buffers();
|
||||||
for branch_buffer in buffers {
|
for branch_buffer in buffers {
|
||||||
branch_buffer.update(cx, |branch_buffer, cx| {
|
branch_buffer.update(cx, |branch_buffer, cx| {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{Editor, EditorEvent, SemanticsProvider};
|
use crate::{ApplyAllDiffHunks, Editor, EditorEvent, SemanticsProvider};
|
||||||
use collections::HashSet;
|
use collections::HashSet;
|
||||||
use futures::{channel::mpsc, future::join_all};
|
use futures::{channel::mpsc, future::join_all};
|
||||||
use gpui::{AppContext, EventEmitter, FocusableView, Model, Render, Subscription, Task, View};
|
use gpui::{AppContext, EventEmitter, FocusableView, Model, Render, Subscription, Task, View};
|
||||||
|
@ -8,7 +8,7 @@ use project::Project;
|
||||||
use smol::stream::StreamExt;
|
use smol::stream::StreamExt;
|
||||||
use std::{any::TypeId, ops::Range, rc::Rc, time::Duration};
|
use std::{any::TypeId, ops::Range, rc::Rc, time::Duration};
|
||||||
use text::ToOffset;
|
use text::ToOffset;
|
||||||
use ui::prelude::*;
|
use ui::{prelude::*, ButtonLike, KeyBinding};
|
||||||
use workspace::{
|
use workspace::{
|
||||||
searchable::SearchableItemHandle, Item, ItemHandle as _, ToolbarItemEvent, ToolbarItemLocation,
|
searchable::SearchableItemHandle, Item, ItemHandle as _, ToolbarItemEvent, ToolbarItemLocation,
|
||||||
ToolbarItemView, Workspace,
|
ToolbarItemView, Workspace,
|
||||||
|
@ -232,7 +232,10 @@ impl ProposedChangesEditor {
|
||||||
|
|
||||||
impl Render for ProposedChangesEditor {
|
impl Render for ProposedChangesEditor {
|
||||||
fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
|
fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
|
||||||
self.editor.clone()
|
div()
|
||||||
|
.size_full()
|
||||||
|
.key_context("ProposedChangesEditor")
|
||||||
|
.child(self.editor.clone())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,17 +334,21 @@ impl ProposedChangesEditorToolbar {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Render for ProposedChangesEditorToolbar {
|
impl Render for ProposedChangesEditorToolbar {
|
||||||
fn render(&mut self, _cx: &mut ViewContext<Self>) -> impl IntoElement {
|
fn render(&mut self, cx: &mut ViewContext<Self>) -> impl IntoElement {
|
||||||
let editor = self.current_editor.clone();
|
let button_like = ButtonLike::new("apply-changes").child(Label::new("Apply All"));
|
||||||
Button::new("apply-changes", "Apply All").on_click(move |_, cx| {
|
|
||||||
if let Some(editor) = &editor {
|
match &self.current_editor {
|
||||||
editor.update(cx, |editor, cx| {
|
Some(editor) => {
|
||||||
editor.editor.update(cx, |editor, cx| {
|
let focus_handle = editor.focus_handle(cx);
|
||||||
editor.apply_all_diff_hunks(cx);
|
let keybinding = KeyBinding::for_action_in(&ApplyAllDiffHunks, &focus_handle, cx)
|
||||||
})
|
.map(|binding| binding.into_any_element());
|
||||||
});
|
|
||||||
|
button_like.children(keybinding).on_click({
|
||||||
|
move |_event, cx| focus_handle.dispatch_action(&ApplyAllDiffHunks, cx)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
None => button_like.disabled(true),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue