Make external terminal provider configurable

Fixes #1699
imgbot
Blaž Hrastnik 2 years ago
parent 7e330697e1
commit cb7615e0ed
No known key found for this signature in database
GPG Key ID: 1238B9C4AD889640

@ -139,7 +139,7 @@ pub fn get_clipboard_provider() -> Box<dyn ClipboardProvider> {
} }
} }
mod provider { pub mod provider {
use super::{ClipboardProvider, ClipboardType}; use super::{ClipboardProvider, ClipboardType};
use anyhow::Result; use anyhow::Result;
use std::borrow::Cow; use std::borrow::Cow;
@ -164,6 +164,12 @@ mod provider {
} }
} }
impl Default for NopProvider {
fn default() -> Self {
Self::new()
}
}
#[cfg(not(target_os = "windows"))] #[cfg(not(target_os = "windows"))]
impl ClipboardProvider for NopProvider { impl ClipboardProvider for NopProvider {
fn name(&self) -> Cow<str> { fn name(&self) -> Cow<str> {

@ -157,6 +157,7 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub search: SearchConfig, pub search: SearchConfig,
pub lsp: LspConfig, pub lsp: LspConfig,
pub terminal: Option<TerminalConfig>,
/// Column numbers at which to draw the rulers. Default to `[]`, meaning no rulers. /// Column numbers at which to draw the rulers. Default to `[]`, meaning no rulers.
pub rulers: Vec<u16>, pub rulers: Vec<u16>,
#[serde(default)] #[serde(default)]
@ -167,6 +168,52 @@ pub struct Config {
pub color_modes: bool, pub color_modes: bool,
} }
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
#[serde(default, rename_all = "kebab-case", deny_unknown_fields)]
pub struct TerminalConfig {
pub command: String,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub args: Vec<String>,
}
#[cfg(windows)]
pub fn get_terminal_provider() -> Option<TerminalConfig> {
use crate::clipboard::provider::command::exists;
if exists("wt") {
return Some(TerminalConfig {
command: "wt".to_string(),
args: vec![
"new-tab".to_string(),
"--title".to_string(),
"DEBUG".to_string(),
"cmd".to_string(),
"/C".to_string(),
],
});
}
return Some(TerminalConfig {
command: "conhost".to_string(),
args: vec!["cmd".to_string(), "/C".to_string()],
});
}
#[cfg(not(any(windows, target_os = "wasm32")))]
pub fn get_terminal_provider() -> Option<TerminalConfig> {
use crate::clipboard::provider::command::{env_var_is_set, exists};
if env_var_is_set("TMUX") && exists("tmux") {
return Some(TerminalConfig {
command: "tmux".to_string(),
args: vec!["split-window".to_string()],
});
}
None
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(default, rename_all = "kebab-case", deny_unknown_fields)] #[serde(default, rename_all = "kebab-case", deny_unknown_fields)]
pub struct LspConfig { pub struct LspConfig {
@ -497,6 +544,7 @@ impl Default for Config {
true_color: false, true_color: false,
search: SearchConfig::default(), search: SearchConfig::default(),
lsp: LspConfig::default(), lsp: LspConfig::default(),
terminal: get_terminal_provider(),
rulers: Vec::new(), rulers: Vec::new(),
whitespace: WhitespaceConfig::default(), whitespace: WhitespaceConfig::default(),
indent_guides: IndentGuidesConfig::default(), indent_guides: IndentGuidesConfig::default(),

@ -5,7 +5,6 @@ use helix_dap::{self as dap, Client, Payload, Request, ThreadId};
use helix_lsp::block_on; use helix_lsp::block_on;
use log::warn; use log::warn;
use std::fmt::Write; use std::fmt::Write;
use std::io::ErrorKind;
use std::path::PathBuf; use std::path::PathBuf;
#[macro_export] #[macro_export]
@ -287,32 +286,32 @@ impl Editor {
serde_json::from_value(request.arguments.unwrap_or_default()).unwrap(); serde_json::from_value(request.arguments.unwrap_or_default()).unwrap();
// TODO: no unwrap // TODO: no unwrap
let process = if cfg!(windows) { let config = match self.config().terminal.clone() {
std::process::Command::new("wt") Some(config) => config,
.arg("new-tab") None => {
.arg("--title") self.set_error("No external terminal defined");
.arg("DEBUG") return true;
.arg("cmd") }
.arg("/C") };
.arg(arguments.args.join(" "))
.spawn() // Re-borrowing debugger to avoid issues when loading config
.unwrap_or_else(|error| match error.kind() { let debugger = match self.debugger.as_mut() {
ErrorKind::NotFound => std::process::Command::new("conhost") Some(debugger) => debugger,
.arg("cmd") None => return false,
.arg("/C") };
.arg(arguments.args.join(" "))
.spawn() let process = match std::process::Command::new(config.command)
.unwrap(), .args(config.args)
// TODO replace the pretty print {:?} with a regular format {} .arg(arguments.args.join(" "))
// when the MSRV is raised to 1.60.0 .spawn()
e => panic!("Error to start debug console: {:?}", e), {
}) Ok(process) => process,
} else { Err(err) => {
std::process::Command::new("tmux") // TODO replace the pretty print {:?} with a regular format {}
.arg("split-window") // when the MSRV is raised to 1.60.0
.arg(arguments.args.join(" ")) self.set_error(format!("Error starting external terminal: {:?}", err));
.spawn() return true;
.unwrap() }
}; };
let _ = debugger let _ = debugger

Loading…
Cancel
Save