diff --git a/helix-term/src/config.rs b/helix-term/src/config.rs index 13917656a231..4c5e0a175db0 100644 --- a/helix-term/src/config.rs +++ b/helix-term/src/config.rs @@ -3,8 +3,10 @@ use serde::Deserialize; use crate::keymap::Keymaps; #[derive(Debug, Default, Clone, PartialEq, Deserialize)] +#[serde(rename_all = "kebab-case")] pub struct Config { pub theme: Option, + pub log_file: Option, #[serde(default)] pub lsp: LspConfig, #[serde(default)] diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index 180dacd1faf2..3f12dd175854 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -35,12 +35,24 @@ fn setup_logging(logpath: PathBuf, verbosity: u64) -> Result<()> { #[tokio::main] async fn main() -> Result<()> { - let cache_dir = helix_core::cache_dir(); - if !cache_dir.exists() { - std::fs::create_dir_all(&cache_dir).ok(); + let conf_dir = helix_core::config_dir(); + if !conf_dir.exists() { + std::fs::create_dir_all(&conf_dir).ok(); } - let logpath = cache_dir.join("helix.log"); + let config = match std::fs::read_to_string(conf_dir.join("config.toml")) { + Ok(config) => merge_keys(toml::from_str(&config)?), + Err(err) if err.kind() == std::io::ErrorKind::NotFound => Config::default(), + Err(err) => return Err(Error::new(err)), + }; + + let default_log_path = helix_core::cache_dir().join("helix.log"); + let log_path = config + .log_file + .clone() + .map(PathBuf::from) + .unwrap_or(default_log_path); + let help = format!( "\ {} {} @@ -56,14 +68,14 @@ ARGS: FLAGS: -h, --help Prints help information -v Increases logging verbosity each use for up to 3 times - (default file: {}) + (file: {}) -V, --version Prints version information ", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"), env!("CARGO_PKG_AUTHORS"), env!("CARGO_PKG_DESCRIPTION"), - logpath.display(), + log_path.display(), ); let args = Args::parse_args().context("could not parse arguments")?; @@ -79,18 +91,12 @@ FLAGS: std::process::exit(0); } - let conf_dir = helix_core::config_dir(); - if !conf_dir.exists() { - std::fs::create_dir_all(&conf_dir).ok(); - } - - let config = match std::fs::read_to_string(conf_dir.join("config.toml")) { - Ok(config) => merge_keys(toml::from_str(&config)?), - Err(err) if err.kind() == std::io::ErrorKind::NotFound => Config::default(), - Err(err) => return Err(Error::new(err)), - }; + let log_dir = log_path.parent().unwrap(); - setup_logging(logpath, args.verbosity).context("failed to initialize logging")?; + if !log_dir.exists() { + std::fs::create_dir_all(log_dir).ok(); + } + setup_logging(log_path, args.verbosity).context("failed to initialize logging")?; // TODO: use the thread local executor to spawn the application task separately from the work pool let mut app = Application::new(args, config).context("unable to create new application")?;