Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/main.rs')
| -rw-r--r-- | helix-term/src/main.rs | 143 |
1 files changed, 42 insertions, 101 deletions
diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index bdca0c01..180dacd1 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -1,10 +1,11 @@ use anyhow::{Context, Error, Result}; -use helix_loader::VERSION_AND_GIT_HASH; use helix_term::application::Application; use helix_term::args::Args; -use helix_term::config::{Config, ConfigLoadError}; +use helix_term::config::Config; +use helix_term::keymap::merge_keys; +use std::path::PathBuf; -fn setup_logging(verbosity: u64) -> Result<()> { +fn setup_logging(logpath: PathBuf, verbosity: u64) -> Result<()> { let mut base_config = fern::Dispatch::new(); base_config = match verbosity { @@ -25,29 +26,23 @@ fn setup_logging(verbosity: u64) -> Result<()> { message )) }) - .chain(fern::log_file(helix_loader::log_file())?); + .chain(fern::log_file(logpath)?); base_config.chain(file_config).apply()?; Ok(()) } -fn main() -> Result<()> { - let exit_code = main_impl()?; - std::process::exit(exit_code); -} - #[tokio::main] -async fn main_impl() -> Result<i32> { - let args = Args::parse_args().context("could not parse arguments")?; - - helix_loader::initialize_config_file(args.config_file.clone()); - helix_loader::initialize_log_file(args.log_file.clone()); +async fn main() -> Result<()> { + let cache_dir = helix_core::cache_dir(); + if !cache_dir.exists() { + std::fs::create_dir_all(&cache_dir).ok(); + } - // Help has a higher priority and should be handled separately. - if args.display_help { - print!( - "\ + let logpath = cache_dir.join("helix.log"); + let help = format!( + "\ {} {} {} {} @@ -56,104 +51,50 @@ USAGE: hx [FLAGS] [files]... ARGS: - <files>... Set the input file to use, position can also be specified via file[:row[:col]] + <files>... Sets the input file to use FLAGS: - -h, --help Print help information - --tutor Load the tutorial - --health [CATEGORY] Check for potential errors in editor setup - CATEGORY can be a language or one of 'clipboard', 'languages', - 'all-languages' or 'all'. 'languages' is filtered according to - user config, 'all-languages' and 'all' are not. If not specified, - the default is the same as 'all', but with languages filtering. - -g, --grammar {{fetch|build}} Fetch or builds tree-sitter grammars listed in languages.toml - -c, --config <file> Specify a file to use for configuration - -v Increase logging verbosity each use for up to 3 times - --log <file> Specify a file to use for logging - (default file: {}) - -V, --version Print version information - --vsplit Split all given files vertically into different windows - --hsplit Split all given files horizontally into different windows - -w, --working-dir <path> Specify an initial working directory - +[N] Open the first given file at line number N, or the last line, if - N is not specified. + -h, --help Prints help information + -v Increases logging verbosity each use for up to 3 times + (default file: {}) + -V, --version Prints version information ", - env!("CARGO_PKG_NAME"), - VERSION_AND_GIT_HASH, - env!("CARGO_PKG_AUTHORS"), - env!("CARGO_PKG_DESCRIPTION"), - helix_loader::default_log_file().display(), - ); - std::process::exit(0); - } + env!("CARGO_PKG_NAME"), + env!("CARGO_PKG_VERSION"), + env!("CARGO_PKG_AUTHORS"), + env!("CARGO_PKG_DESCRIPTION"), + logpath.display(), + ); - if args.display_version { - println!("helix {}", VERSION_AND_GIT_HASH); - std::process::exit(0); - } - - if args.health { - if let Err(err) = helix_term::health::print_health(args.health_arg) { - // Piping to for example `head -10` requires special handling: - // https://stackoverflow.com/a/65760807/7115678 - if err.kind() != std::io::ErrorKind::BrokenPipe { - return Err(err.into()); - } - } + let args = Args::parse_args().context("could not parse arguments")?; + // Help has a higher priority and should be handled separately. + if args.display_help { + print!("{}", help); std::process::exit(0); } - if args.fetch_grammars { - helix_loader::grammar::fetch_grammars()?; - return Ok(0); - } - - if args.build_grammars { - helix_loader::grammar::build_grammars(None)?; - return Ok(0); + if args.display_version { + println!("helix {}", env!("CARGO_PKG_VERSION")); + std::process::exit(0); } - setup_logging(args.verbosity).context("failed to initialize logging")?; - - // NOTE: Set the working directory early so the correct configuration is loaded. Be aware that - // Application::new() depends on this logic so it must be updated if this changes. - if let Some(path) = &args.working_directory { - helix_stdx::env::set_current_working_dir(path)?; - } else if let Some((path, _)) = args.files.first().filter(|p| p.0.is_dir()) { - // If the first file is a directory, it will be the working directory unless -w was specified - helix_stdx::env::set_current_working_dir(path)?; + let conf_dir = helix_core::config_dir(); + if !conf_dir.exists() { + std::fs::create_dir_all(&conf_dir).ok(); } - let config = match Config::load_default() { - Ok(config) => config, - Err(ConfigLoadError::Error(err)) if err.kind() == std::io::ErrorKind::NotFound => { - Config::default() - } - Err(ConfigLoadError::Error(err)) => return Err(Error::new(err)), - Err(ConfigLoadError::BadConfig(err)) => { - eprintln!("Bad config: {}", err); - eprintln!("Press <ENTER> to continue with default config"); - use std::io::Read; - let _ = std::io::stdin().read(&mut []); - Config::default() - } + 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 lang_loader = helix_core::config::user_lang_loader().unwrap_or_else(|err| { - eprintln!("{}", err); - eprintln!("Press <ENTER> to continue with default language config"); - use std::io::Read; - // This waits for an enter press. - let _ = std::io::stdin().read(&mut []); - helix_core::config::default_lang_loader() - }); + setup_logging(logpath, 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, lang_loader).context("unable to start Helix")?; - let mut events = app.event_stream(); + let mut app = Application::new(args, config).context("unable to create new application")?; + app.run().await.unwrap(); - let exit_code = app.run(&mut events).await?; - - Ok(exit_code) + Ok(()) } |