Allow piping from stdin into a buffer on startup (#996)

* Allow piping from stdin into a buffer on startup

* Refactor

* Don't allow piping into new buffer on macOS

* Update helix-term/src/application.rs

Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>

* Update helix-term/src/application.rs

Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>

* Fix

Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>
pull/1039/head
Jason Hansen 3 years ago committed by GitHub
parent 68224232af
commit cf831b1a65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -7,7 +7,7 @@ use crate::{args::Args, compositor::Compositor, config::Config, job::Jobs, ui};
use log::{error, warn}; use log::{error, warn};
use std::{ use std::{
io::{stdout, Write}, io::{stdin, stdout, Write},
sync::Arc, sync::Arc,
time::{Duration, Instant}, time::{Duration, Instant},
}; };
@ -17,6 +17,7 @@ use anyhow::Error;
use crossterm::{ use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture, Event, EventStream}, event::{DisableMouseCapture, EnableMouseCapture, Event, EventStream},
execute, terminal, execute, terminal,
tty::IsTty,
}; };
#[cfg(not(windows))] #[cfg(not(windows))]
use { use {
@ -134,8 +135,17 @@ impl Application {
} }
editor.set_status(format!("Loaded {} files.", nr_of_files)); editor.set_status(format!("Loaded {} files.", nr_of_files));
} }
} else { } else if stdin().is_tty() {
editor.new_file(Action::VerticalSplit); 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); editor.set_theme(theme);

@ -9,6 +9,7 @@ use crate::{
use futures_util::future; use futures_util::future;
use std::{ use std::{
collections::BTreeMap, collections::BTreeMap,
io::stdin,
path::{Path, PathBuf}, path::{Path, PathBuf},
pin::Pin, pin::Pin,
sync::Arc, sync::Arc,
@ -314,16 +315,24 @@ impl Editor {
self._refresh(); self._refresh();
} }
pub fn new_file(&mut self, action: Action) -> DocumentId { fn new_file_from_document(&mut self, action: Action, mut document: Document) -> DocumentId {
let id = DocumentId(self.next_document_id); let id = DocumentId(self.next_document_id);
self.next_document_id += 1; self.next_document_id += 1;
let mut doc = Document::default(); document.id = id;
doc.id = id; self.documents.insert(id, document);
self.documents.insert(id, doc);
self.switch(id, action); self.switch(id, action);
id id
} }
pub fn new_file(&mut self, action: Action) -> DocumentId {
self.new_file_from_document(action, Document::default())
}
pub fn new_file_from_stdin(&mut self, action: Action) -> Result<DocumentId, Error> {
let (rope, encoding) = crate::document::from_reader(&mut stdin(), None)?;
Ok(self.new_file_from_document(action, Document::from(rope, Some(encoding))))
}
pub fn open(&mut self, path: PathBuf, action: Action) -> Result<DocumentId, Error> { pub fn open(&mut self, path: PathBuf, action: Action) -> Result<DocumentId, Error> {
let path = helix_core::path::get_canonicalized_path(&path)?; let path = helix_core::path::get_canonicalized_path(&path)?;

Loading…
Cancel
Save