From f10b6f6ee2bbf4d6d9356e27be25b25bdb85b9cd Mon Sep 17 00:00:00 2001 From: plexom Date: Fri, 1 Jul 2022 11:27:32 +0200 Subject: adds --vsplit and --hsplit arguments (#2773) * adds --vsplit and --hsplit arguments * moved comment * fixed lint (third time's a charm) * changed vsplit and hsplit from two separate bools to type Option, and some cleanup--- helix-term/src/application.rs | 21 ++++++++++++++++++--- helix-term/src/args.rs | 4 ++++ helix-term/src/main.rs | 2 ++ 3 files changed, 24 insertions(+), 3 deletions(-) (limited to 'helix-term/src') diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 23f4610f..805f660f 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -5,7 +5,7 @@ use helix_core::{ pos_at_coords, syntax, Selection, }; use helix_lsp::{lsp, util::lsp_pos_to_pos, LspProgressMap}; -use helix_view::{align_view, editor::ConfigEvent, theme, Align, Editor}; +use helix_view::{align_view, editor::ConfigEvent, theme, tree::Layout, Align, Editor}; use serde_json::json; use crate::{ @@ -158,16 +158,31 @@ impl Application { } else { let nr_of_files = args.files.len(); editor.open(first, Action::VerticalSplit)?; - for (file, pos) in args.files { + // Because the line above already opens the first file, we can + // simply skip opening it a second time by using .skip(1) here. + for (file, pos) in args.files.into_iter().skip(1) { if file.is_dir() { return Err(anyhow::anyhow!( "expected a path to file, found a directory. (to open a directory pass it as first argument)" )); } else { + // If the user passes in either `--vsplit` or + // `--hsplit` as a command line argument, all the given + // files will be opened according to the selected + // option. If neither of those two arguments are passed + // in, just load the files normally. + let action = match args.split { + Some(Layout::Vertical) => Action::VerticalSplit, + Some(Layout::Horizontal) => Action::HorizontalSplit, + None => Action::Load, + }; let doc_id = editor - .open(&file, Action::Load) + .open(&file, action) .context(format!("open '{}'", file.to_string_lossy()))?; // with Action::Load all documents have the same view + // NOTE: this isn't necessarily true anymore. If + // `--vsplit` or `--hsplit` are used, the file which is + // opened last is focused on. let view_id = editor.tree.focus; let doc = editor.document_mut(doc_id).unwrap(); let pos = Selection::point(pos_at_coords(doc.text().slice(..), pos, true)); diff --git a/helix-term/src/args.rs b/helix-term/src/args.rs index b99c7d1a..c3019ea7 100644 --- a/helix-term/src/args.rs +++ b/helix-term/src/args.rs @@ -1,5 +1,6 @@ use anyhow::Result; use helix_core::Position; +use helix_view::tree::Layout; use std::path::{Path, PathBuf}; #[derive(Default)] @@ -11,6 +12,7 @@ pub struct Args { pub load_tutor: bool, pub fetch_grammars: bool, pub build_grammars: bool, + pub split: Option, pub verbosity: u64, pub files: Vec<(PathBuf, Position)>, } @@ -28,6 +30,8 @@ impl Args { "--version" => args.display_version = true, "--help" => args.display_help = true, "--tutor" => args.load_tutor = true, + "--vsplit" => args.split = Some(Layout::Vertical), + "--hsplit" => args.split = Some(Layout::Horizontal), "--health" => { args.health = true; args.health_arg = argv.next_if(|opt| !opt.starts_with('-')); diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index 7b26fb11..eb186d78 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -67,6 +67,8 @@ FLAGS: -v Increases logging verbosity each use for up to 3 times (default file: {}) -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"), env!("VERSION_AND_GIT_HASH"), -- cgit v1.2.3-70-g09d2