debugger: Extend f5
binding to contextually rerun the last session (#31753)
Release Notes: - Debugger Beta: if there is no stopped or running session, `f5` now reruns the last session, or opens the new session modal if there is no previously-run session.
This commit is contained in:
parent
b14401f817
commit
b16911e756
5 changed files with 70 additions and 11 deletions
|
@ -31,8 +31,6 @@
|
||||||
"ctrl-,": "zed::OpenSettings",
|
"ctrl-,": "zed::OpenSettings",
|
||||||
"ctrl-q": "zed::Quit",
|
"ctrl-q": "zed::Quit",
|
||||||
"f4": "debugger::Start",
|
"f4": "debugger::Start",
|
||||||
"alt-f4": "debugger::RerunLastSession",
|
|
||||||
"f5": "debugger::Continue",
|
|
||||||
"shift-f5": "debugger::Stop",
|
"shift-f5": "debugger::Stop",
|
||||||
"ctrl-shift-f5": "debugger::Restart",
|
"ctrl-shift-f5": "debugger::Restart",
|
||||||
"f6": "debugger::Pause",
|
"f6": "debugger::Pause",
|
||||||
|
@ -583,11 +581,24 @@
|
||||||
"ctrl-alt-r": "task::Rerun",
|
"ctrl-alt-r": "task::Rerun",
|
||||||
"alt-t": "task::Rerun",
|
"alt-t": "task::Rerun",
|
||||||
"alt-shift-t": "task::Spawn",
|
"alt-shift-t": "task::Spawn",
|
||||||
"alt-shift-r": ["task::Spawn", { "reveal_target": "center" }]
|
"alt-shift-r": ["task::Spawn", { "reveal_target": "center" }],
|
||||||
// also possible to spawn tasks by name:
|
// also possible to spawn tasks by name:
|
||||||
// "foo-bar": ["task::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
|
// "foo-bar": ["task::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
|
||||||
// or by tag:
|
// or by tag:
|
||||||
// "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
|
// "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
|
||||||
|
"f5": "debugger::RerunLastSession"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"context": "Workspace && debugger_running",
|
||||||
|
"bindings": {
|
||||||
|
"f5": "zed::NoAction"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"context": "Workspace && debugger_stopped",
|
||||||
|
"bindings": {
|
||||||
|
"f5": "debugger::Continue"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
"use_key_equivalents": true,
|
"use_key_equivalents": true,
|
||||||
"bindings": {
|
"bindings": {
|
||||||
"f4": "debugger::Start",
|
"f4": "debugger::Start",
|
||||||
"alt-f4": "debugger::RerunLastSession",
|
|
||||||
"f5": "debugger::Continue",
|
|
||||||
"shift-f5": "debugger::Stop",
|
"shift-f5": "debugger::Stop",
|
||||||
"shift-cmd-f5": "debugger::Restart",
|
"shift-cmd-f5": "debugger::Restart",
|
||||||
"f6": "debugger::Pause",
|
"f6": "debugger::Pause",
|
||||||
|
@ -635,7 +633,8 @@
|
||||||
"cmd-k shift-right": "workspace::SwapPaneRight",
|
"cmd-k shift-right": "workspace::SwapPaneRight",
|
||||||
"cmd-k shift-up": "workspace::SwapPaneUp",
|
"cmd-k shift-up": "workspace::SwapPaneUp",
|
||||||
"cmd-k shift-down": "workspace::SwapPaneDown",
|
"cmd-k shift-down": "workspace::SwapPaneDown",
|
||||||
"cmd-shift-x": "zed::Extensions"
|
"cmd-shift-x": "zed::Extensions",
|
||||||
|
"f5": "debugger::RerunLastSession"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -652,6 +651,20 @@
|
||||||
// "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
|
// "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"context": "Workspace && debugger_running",
|
||||||
|
"use_key_equivalents": true,
|
||||||
|
"bindings": {
|
||||||
|
"f5": "zed::NoAction"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"context": "Workspace && debugger_stopped",
|
||||||
|
"use_key_equivalents": true,
|
||||||
|
"bindings": {
|
||||||
|
"f5": "debugger::Continue"
|
||||||
|
}
|
||||||
|
},
|
||||||
// Bindings from Sublime Text
|
// Bindings from Sublime Text
|
||||||
{
|
{
|
||||||
"context": "Editor",
|
"context": "Editor",
|
||||||
|
|
|
@ -3,9 +3,10 @@ use crate::session::DebugSession;
|
||||||
use crate::session::running::RunningState;
|
use crate::session::running::RunningState;
|
||||||
use crate::{
|
use crate::{
|
||||||
ClearAllBreakpoints, Continue, Detach, FocusBreakpointList, FocusConsole, FocusFrames,
|
ClearAllBreakpoints, Continue, Detach, FocusBreakpointList, FocusConsole, FocusFrames,
|
||||||
FocusLoadedSources, FocusModules, FocusTerminal, FocusVariables, Pause, Restart,
|
FocusLoadedSources, FocusModules, FocusTerminal, FocusVariables, NewProcessModal,
|
||||||
ShowStackTrace, StepBack, StepInto, StepOut, StepOver, Stop, ToggleIgnoreBreakpoints,
|
NewProcessMode, Pause, Restart, ShowStackTrace, StepBack, StepInto, StepOut, StepOver, Stop,
|
||||||
ToggleSessionPicker, ToggleThreadPicker, persistence, spawn_task_or_modal,
|
ToggleIgnoreBreakpoints, ToggleSessionPicker, ToggleThreadPicker, persistence,
|
||||||
|
spawn_task_or_modal,
|
||||||
};
|
};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use command_palette_hooks::CommandPaletteFilter;
|
use command_palette_hooks::CommandPaletteFilter;
|
||||||
|
@ -334,10 +335,17 @@ impl DebugPanel {
|
||||||
let Some(task_inventory) = task_store.read(cx).task_inventory() else {
|
let Some(task_inventory) = task_store.read(cx).task_inventory() else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
let workspace = self.workspace.clone();
|
||||||
let Some(scenario) = task_inventory.read(cx).last_scheduled_scenario().cloned() else {
|
let Some(scenario) = task_inventory.read(cx).last_scheduled_scenario().cloned() else {
|
||||||
|
window.defer(cx, move |window, cx| {
|
||||||
|
workspace
|
||||||
|
.update(cx, |workspace, cx| {
|
||||||
|
NewProcessModal::show(workspace, window, NewProcessMode::Launch, None, cx);
|
||||||
|
})
|
||||||
|
.ok();
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
let workspace = self.workspace.clone();
|
|
||||||
|
|
||||||
cx.spawn_in(window, async move |this, cx| {
|
cx.spawn_in(window, async move |this, cx| {
|
||||||
let task_contexts = workspace
|
let task_contexts = workspace
|
||||||
|
@ -1411,4 +1419,10 @@ impl workspace::DebuggerProvider for DebuggerProvider {
|
||||||
fn debug_scenario_scheduled_last(&self, cx: &App) -> bool {
|
fn debug_scenario_scheduled_last(&self, cx: &App) -> bool {
|
||||||
self.0.read(cx).debug_scenario_scheduled_last
|
self.0.read(cx).debug_scenario_scheduled_last
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn active_thread_state(&self, cx: &App) -> Option<ThreadStatus> {
|
||||||
|
let session = self.0.read(cx).active_session()?;
|
||||||
|
let thread = session.read(cx).running_state().read(cx).thread_id()?;
|
||||||
|
session.read(cx).session(cx).read(cx).thread_state(thread)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2194,4 +2194,8 @@ impl Session {
|
||||||
self.shutdown(cx).detach();
|
self.shutdown(cx).detach();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn thread_state(&self, thread_id: ThreadId) -> Option<ThreadStatus> {
|
||||||
|
self.thread_states.thread_state(thread_id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,7 @@ pub use persistence::{
|
||||||
use postage::stream::Stream;
|
use postage::stream::Stream;
|
||||||
use project::{
|
use project::{
|
||||||
DirectoryLister, Project, ProjectEntryId, ProjectPath, ResolvedPath, Worktree, WorktreeId,
|
DirectoryLister, Project, ProjectEntryId, ProjectPath, ResolvedPath, Worktree, WorktreeId,
|
||||||
debugger::breakpoint_store::BreakpointStoreEvent,
|
debugger::{breakpoint_store::BreakpointStoreEvent, session::ThreadStatus},
|
||||||
};
|
};
|
||||||
use remote::{SshClientDelegate, SshConnectionOptions, ssh_session::ConnectionIdentifier};
|
use remote::{SshClientDelegate, SshConnectionOptions, ssh_session::ConnectionIdentifier};
|
||||||
use schemars::JsonSchema;
|
use schemars::JsonSchema;
|
||||||
|
@ -161,6 +161,8 @@ pub trait DebuggerProvider {
|
||||||
fn task_scheduled(&self, cx: &mut App);
|
fn task_scheduled(&self, cx: &mut App);
|
||||||
fn debug_scenario_scheduled(&self, cx: &mut App);
|
fn debug_scenario_scheduled(&self, cx: &mut App);
|
||||||
fn debug_scenario_scheduled_last(&self, cx: &App) -> bool;
|
fn debug_scenario_scheduled_last(&self, cx: &App) -> bool;
|
||||||
|
|
||||||
|
fn active_thread_state(&self, cx: &App) -> Option<ThreadStatus>;
|
||||||
}
|
}
|
||||||
|
|
||||||
actions!(
|
actions!(
|
||||||
|
@ -202,6 +204,7 @@ actions!(
|
||||||
Unfollow,
|
Unfollow,
|
||||||
Welcome,
|
Welcome,
|
||||||
RestoreBanner,
|
RestoreBanner,
|
||||||
|
ToggleExpandItem,
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -5802,6 +5805,20 @@ impl Render for Workspace {
|
||||||
let mut context = KeyContext::new_with_defaults();
|
let mut context = KeyContext::new_with_defaults();
|
||||||
context.add("Workspace");
|
context.add("Workspace");
|
||||||
context.set("keyboard_layout", cx.keyboard_layout().name().to_string());
|
context.set("keyboard_layout", cx.keyboard_layout().name().to_string());
|
||||||
|
if let Some(status) = self
|
||||||
|
.debugger_provider
|
||||||
|
.as_ref()
|
||||||
|
.and_then(|provider| provider.active_thread_state(cx))
|
||||||
|
{
|
||||||
|
match status {
|
||||||
|
ThreadStatus::Running | ThreadStatus::Stepping => {
|
||||||
|
context.add("debugger_running");
|
||||||
|
}
|
||||||
|
ThreadStatus::Stopped => context.add("debugger_stopped"),
|
||||||
|
ThreadStatus::Exited | ThreadStatus::Ended => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let centered_layout = self.centered_layout
|
let centered_layout = self.centered_layout
|
||||||
&& self.center.panes().len() == 1
|
&& self.center.panes().len() == 1
|
||||||
&& self.active_item(cx).is_some();
|
&& self.active_item(cx).is_some();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue