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.rs143
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(())
}