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.rs124
1 files changed, 62 insertions, 62 deletions
diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs
index bdca0c01..aac5c537 100644
--- a/helix-term/src/main.rs
+++ b/helix-term/src/main.rs
@@ -1,10 +1,12 @@
use anyhow::{Context, Error, Result};
+use crossterm::event::EventStream;
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 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,7 +27,7 @@ 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()?;
@@ -39,15 +41,14 @@ fn main() -> Result<()> {
#[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());
+ let logpath = helix_loader::log_file();
+ let parent = logpath.parent().unwrap();
+ if !parent.exists() {
+ std::fs::create_dir_all(parent).ok();
+ }
- // Help has a higher priority and should be handled separately.
- if args.display_help {
- print!(
- "\
+ let help = format!(
+ "\
{} {}
{}
{}
@@ -56,34 +57,35 @@ 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, position can also be specified via file[:row[:col]]
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
+ -h, --help Prints help information
+ --tutor Loads the tutorial
+ --health [CATEGORY] Checks for potential errors in editor setup
+ CATEGORY can be a language or one of 'clipboard', 'languages'
+ or 'all'. 'all' is the default if not specified.
+ -g, --grammar {{fetch|build}} Fetches or builds tree-sitter grammars listed in languages.toml
+ -c, --config <file> Specifies a file to use for configuration
+ -v Increases logging verbosity each use for up to 3 times
+ --log Specifies 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.
+ -V, --version Prints version information
+ --vsplit Splits all given files vertically into different windows
+ --hsplit Splits all given files horizontally into different windows
",
- env!("CARGO_PKG_NAME"),
- VERSION_AND_GIT_HASH,
- env!("CARGO_PKG_AUTHORS"),
- env!("CARGO_PKG_DESCRIPTION"),
- helix_loader::default_log_file().display(),
- );
+ env!("CARGO_PKG_NAME"),
+ VERSION_AND_GIT_HASH,
+ env!("CARGO_PKG_AUTHORS"),
+ env!("CARGO_PKG_DESCRIPTION"),
+ logpath.display(),
+ );
+
+ 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);
}
@@ -114,46 +116,44 @@ FLAGS:
return Ok(0);
}
- setup_logging(args.verbosity).context("failed to initialize logging")?;
+ let logpath = args.log_file.as_ref().cloned().unwrap_or(logpath);
+ setup_logging(logpath, 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 config_dir = helix_loader::config_dir();
+ if !config_dir.exists() {
+ std::fs::create_dir_all(&config_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()
- }
+ helix_loader::initialize_config_file(args.config_file.clone());
+
+ let config = match std::fs::read_to_string(helix_loader::config_file()) {
+ Ok(config) => toml::from_str(&config)
+ .map(helix_term::keymap::merge_keys)
+ .unwrap_or_else(|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()
+ }),
+ 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);
+ let syn_loader_conf = helix_core::config::user_syntax_loader().unwrap_or_else(|err| {
+ eprintln!("Bad language config: {}", 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()
+ helix_core::config::default_syntax_loader()
});
// 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, syn_loader_conf)
+ .context("unable to create new application")?;
- let exit_code = app.run(&mut events).await?;
+ let exit_code = app.run(&mut EventStream::new()).await?;
Ok(exit_code)
}