aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/application.rs
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-11-21 11:06:45 +0000
committerBlaž Hrastnik2021-11-21 11:06:45 +0000
commitd1854d8e6af07cd78ab6c24c859a4471afb3514e (patch)
tree301e4212e7fc88dd5f626f884bd78b700cf3e4a6 /helix-term/src/application.rs
parent8b85903116fdfdc177bf2ca171831674144de70a (diff)
parentb95c9470de9f9199f109fdbfb6ec9a951fbe8866 (diff)
Merge remote-tracking branch 'origin/master' into debug
Diffstat (limited to 'helix-term/src/application.rs')
-rw-r--r--helix-term/src/application.rs64
1 files changed, 37 insertions, 27 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index faf93b09..242dc837 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -9,7 +9,7 @@ use crate::{
use log::{error, warn};
use std::{
- io::{stdout, Write},
+ io::{stdin, stdout, Write},
sync::Arc,
time::{Duration, Instant},
};
@@ -19,6 +19,7 @@ use anyhow::Error;
use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture, Event, EventStream},
execute, terminal,
+ tty::IsTty,
};
#[cfg(not(windows))]
use {
@@ -62,14 +63,19 @@ impl Application {
std::sync::Arc::new(theme::Loader::new(&conf_dir, &helix_core::runtime_dir()));
// load default and user config, and merge both
- let def_lang_conf: toml::Value = toml::from_slice(include_bytes!("../../languages.toml"))
- .expect("Could not parse built-in languages.toml, something must be very wrong");
- let user_lang_conf: Option<toml::Value> = std::fs::read(conf_dir.join("languages.toml"))
+ let builtin_err_msg =
+ "Could not parse built-in languages.toml, something must be very wrong";
+ let def_lang_conf: toml::Value =
+ toml::from_slice(include_bytes!("../../languages.toml")).expect(builtin_err_msg);
+ let def_syn_loader_conf: helix_core::syntax::Configuration =
+ def_lang_conf.clone().try_into().expect(builtin_err_msg);
+ let user_lang_conf = std::fs::read(conf_dir.join("languages.toml"))
.ok()
- .map(|raw| toml::from_slice(&raw).expect("Could not parse user languages.toml"));
+ .map(|raw| toml::from_slice(&raw));
let lang_conf = match user_lang_conf {
- Some(value) => merge_toml_values(def_lang_conf, value),
- None => def_lang_conf,
+ Some(Ok(value)) => Ok(merge_toml_values(def_lang_conf, value)),
+ Some(err @ Err(_)) => err,
+ None => Ok(def_lang_conf),
};
let theme = if let Some(theme) = &config.theme {
@@ -85,8 +91,15 @@ impl Application {
};
let syn_loader_conf: helix_core::syntax::Configuration = lang_conf
- .try_into()
- .expect("Could not parse merged (built-in + user) languages.toml");
+ .and_then(|conf| conf.try_into())
+ .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 []);
+ def_syn_loader_conf
+ });
let syn_loader = std::sync::Arc::new(syntax::Loader::new(syn_loader_conf));
let mut editor = Editor::new(
@@ -124,8 +137,17 @@ impl Application {
}
editor.set_status(format!("Loaded {} files.", nr_of_files));
}
- } else {
+ } else if stdin().is_tty() {
editor.new_file(Action::VerticalSplit);
+ } else if cfg!(target_os = "macos") {
+ // On Linux and Windows, we allow the output of a command to be piped into the new buffer.
+ // This doesn't currently work on macOS because of the following issue:
+ // https://github.com/crossterm-rs/crossterm/issues/500
+ anyhow::bail!("Piping into helix-term is currently not supported on macOS");
+ } else {
+ editor
+ .new_file_from_stdin(Action::VerticalSplit)
+ .unwrap_or_else(|_| editor.new_file(Action::VerticalSplit));
}
editor.set_theme(theme);
@@ -253,12 +275,8 @@ impl Application {
}
let editor_view = self
.compositor
- .find(std::any::type_name::<ui::EditorView>())
+ .find::<ui::EditorView>()
.expect("expected at least one EditorView");
- let editor_view = editor_view
- .as_any_mut()
- .downcast_mut::<ui::EditorView>()
- .unwrap();
if editor_view.completion.is_some() {
return;
@@ -583,12 +601,8 @@ impl Application {
{
let editor_view = self
.compositor
- .find(std::any::type_name::<ui::EditorView>())
+ .find::<ui::EditorView>()
.expect("expected at least one EditorView");
- let editor_view = editor_view
- .as_any_mut()
- .downcast_mut::<ui::EditorView>()
- .unwrap();
let lsp::ProgressParams { token, value } = params;
let lsp::ProgressParamsValue::WorkDone(work) = value;
@@ -702,12 +716,8 @@ impl Application {
let editor_view = self
.compositor
- .find(std::any::type_name::<ui::EditorView>())
+ .find::<ui::EditorView>()
.expect("expected at least one EditorView");
- let editor_view = editor_view
- .as_any_mut()
- .downcast_mut::<ui::EditorView>()
- .unwrap();
let spinner = editor_view.spinners_mut().get_or_create(server_id);
if spinner.is_stopped() {
spinner.start();
@@ -742,7 +752,7 @@ impl Application {
Ok(())
}
- pub async fn run(&mut self) -> Result<(), Error> {
+ pub async fn run(&mut self) -> Result<i32, Error> {
self.claim_term().await?;
// Exit the alternate screen and disable raw mode before panicking
@@ -765,6 +775,6 @@ impl Application {
self.restore_term()?;
- Ok(())
+ Ok(self.editor.exit_code)
}
}