feat: support Cursor editor as debug session option (#5205)

* feat: support Cursor editor as debug session option

* fmt

---------

Co-authored-by: Jonathan Kelley <jkelleyrtp@gmail.com>
This commit is contained in:
faysouandJonathan Kelley authored and GitHub committed 2026-04-07 18:13:38 -07:00
1 parent e396c1f04b
commit 56882b97e5
4 files changed
+48 -6

No files matched your search

+20 -5
View File
@@ -1611,6 +1611,21 @@ impl AppBuilder {
} }
pub(crate) async fn open_debugger(&mut self, server: &WebServer) -> Result<()> { pub(crate) async fn open_debugger(&mut self, server: &WebServer) -> Result<()> {
// Get the preferred editor from workspace settings, defaulting to VS Code
use crate::settings::SupportedEditor;
let preferred_editor = self
.build
.workspace
.settings
.preferred_editor
.unwrap_or(SupportedEditor::Vscode);
// Map the editor to its binary and URL scheme
let (editor_binary, url_scheme) = match preferred_editor {
SupportedEditor::Vscode => ("code", "vscode"),
SupportedEditor::Cursor => ("cursor", "cursor"),
};
let url = match self.build.bundle { let url = match self.build.bundle {
BundleFormat::MacOS BundleFormat::MacOS
| BundleFormat::Windows | BundleFormat::Windows
@@ -1622,7 +1637,7 @@ impl AppBuilder {
}; };
format!( format!(
"vscode://vadimcn.vscode-lldb/launch/config?{{'request':'attach','pid':{pid}}}" "{url_scheme}://vadimcn.vscode-lldb/launch/config?{{'request':'attach','pid':{pid}}}"
) )
} }
@@ -1637,7 +1652,7 @@ impl AppBuilder {
Some(base_path) => format!("/{}", base_path.trim_matches('/')), Some(base_path) => format!("/{}", base_path.trim_matches('/')),
None => "".to_owned(), None => "".to_owned(),
}; };
format!("vscode://DioxusLabs.dioxus/debugger?uri={protocol}://{address}{base_path}") format!("{url_scheme}://DioxusLabs.dioxus/debugger?uri={protocol}://{address}{base_path}")
} }
BundleFormat::Ios => { BundleFormat::Ios => {
@@ -1647,7 +1662,7 @@ impl AppBuilder {
}; };
format!( format!(
"vscode://vadimcn.vscode-lldb/launch/config?{{'request':'attach','pid':{pid}}}" "{url_scheme}://vadimcn.vscode-lldb/launch/config?{{'request':'attach','pid':{pid}}}"
) )
} }
@@ -1742,7 +1757,7 @@ impl AppBuilder {
let program_path = self.build.main_exe(); let program_path = self.build.main_exe();
format!( format!(
r#"vscode://vadimcn.vscode-lldb/launch/config?{{ r#"{url_scheme}://vadimcn.vscode-lldb/launch/config?{{
'name':'Attach to Android', 'name':'Attach to Android',
'type':'lldb', 'type':'lldb',
'request':'attach', 'request':'attach',
@@ -1769,7 +1784,7 @@ impl AppBuilder {
tracing::info!("Opening debugger for [{}]: {url}", self.build.bundle); tracing::info!("Opening debugger for [{}]: {url}", self.build.bundle);
_ = tokio::process::Command::new("code") _ = tokio::process::Command::new(editor_binary)
.arg("--open-url") .arg("--open-url")
.arg(url) .arg(url)
.spawn(); .spawn();
+7 -1
View File
@@ -1,5 +1,5 @@
use super::*; use super::*;
use crate::{CliSettings, TraceSrc, Workspace}; use crate::{settings::SupportedEditor, CliSettings, TraceSrc, Workspace};
/// Dioxus config file controls /// Dioxus config file controls
#[derive(Clone, Debug, Deserialize, Subcommand)] #[derive(Clone, Debug, Deserialize, Subcommand)]
@@ -46,6 +46,8 @@ pub(crate) enum Setting {
WSLFilePollInterval { value: u16 }, WSLFilePollInterval { value: u16 },
/// Disable the built-in telemetry for the CLI /// Disable the built-in telemetry for the CLI
DisableTelemetry { value: BoolValue }, DisableTelemetry { value: BoolValue },
/// Set the preferred editor for debug sessions
PreferredEditor { value: SupportedEditor },
} }
impl Display for Setting { impl Display for Setting {
@@ -56,6 +58,7 @@ impl Display for Setting {
Self::AlwaysOnTop { value: _ } => write!(f, "always-on-top"), Self::AlwaysOnTop { value: _ } => write!(f, "always-on-top"),
Self::WSLFilePollInterval { value: _ } => write!(f, "wsl-file-poll-interval"), Self::WSLFilePollInterval { value: _ } => write!(f, "wsl-file-poll-interval"),
Self::DisableTelemetry { value: _ } => write!(f, "disable-telemetry"), Self::DisableTelemetry { value: _ } => write!(f, "disable-telemetry"),
Self::PreferredEditor { value: _ } => write!(f, "preferred-editor"),
} }
} }
} }
@@ -122,6 +125,9 @@ impl Config {
Setting::DisableTelemetry { value } => { Setting::DisableTelemetry { value } => {
settings.disable_telemetry = Some(value.into()); settings.disable_telemetry = Some(value.into());
} }
Setting::PreferredEditor { value } => {
settings.preferred_editor = Some(value);
}
})?; })?;
tracing::info!(dx_src = ?TraceSrc::Dev, "🚩 CLI setting `{setting}` has been set."); tracing::info!(dx_src = ?TraceSrc::Dev, "🚩 CLI setting `{setting}` has been set.");
} }
+3
View File
@@ -882,6 +882,9 @@ impl TraceController {
Setting::AlwaysOnTop { value } => json!({ "value": value }), Setting::AlwaysOnTop { value } => json!({ "value": value }),
Setting::WSLFilePollInterval { value } => json!({ "value": value }), Setting::WSLFilePollInterval { value } => json!({ "value": value }),
Setting::DisableTelemetry { value } => json!({ "value": value }), Setting::DisableTelemetry { value } => json!({ "value": value }),
Setting::PreferredEditor { value } => {
json!({ "value": format!("{:?}", value) })
}
}, },
), ),
}, },
+18
View File
@@ -5,6 +5,22 @@ use std::sync::LazyLock;
use std::{fs, path::PathBuf, sync::Arc}; use std::{fs, path::PathBuf, sync::Arc};
use tracing::{error, trace, warn}; use tracing::{error, trace, warn};
/// Supported editors for debug sessions
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, clap::ValueEnum)]
#[serde(rename_all = "kebab-case")]
pub(crate) enum SupportedEditor {
/// Visual Studio Code
Vscode,
/// Cursor editor
Cursor,
}
impl Default for SupportedEditor {
fn default() -> Self {
SupportedEditor::Vscode
}
}
/// Describes cli settings from project or global level. /// Describes cli settings from project or global level.
/// The order of priority goes: /// The order of priority goes:
/// 1. CLI Flags/Arguments /// 1. CLI Flags/Arguments
@@ -29,6 +45,8 @@ pub(crate) struct CliSettings {
pub(crate) ignore_version_update: Option<String>, pub(crate) ignore_version_update: Option<String>,
/// Disable telemetry /// Disable telemetry
pub(crate) disable_telemetry: Option<bool>, pub(crate) disable_telemetry: Option<bool>,
/// Preferred editor for debug sessions
pub(crate) preferred_editor: Option<SupportedEditor>,
} }
impl CliSettings { impl CliSettings {