From f10b6f6ee2bbf4d6d9356e27be25b25bdb85b9cd Mon Sep 17 00:00:00 2001
From: plexom <48958093+plexom@users.noreply.github.com>
Date: Fri, 1 Jul 2022 11:27:32 +0200
Subject: [PATCH] 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<Layout>, and some cleanup
---
 contrib/completion/hx.bash    |  2 +-
 contrib/completion/hx.fish    |  3 ++-
 contrib/completion/hx.zsh     |  2 ++
 helix-term/src/application.rs | 21 ++++++++++++++++++---
 helix-term/src/args.rs        |  4 ++++
 helix-term/src/main.rs        |  2 ++
 6 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/contrib/completion/hx.bash b/contrib/completion/hx.bash
index 6371bedb..87c34028 100644
--- a/contrib/completion/hx.bash
+++ b/contrib/completion/hx.bash
@@ -16,7 +16,7 @@ _hx() {
 		COMPREPLY=($(compgen -W "$languages" -- $2))
 		;;
 	*)
-		COMPREPLY=($(compgen -fd -W "-h --help --tutor -V --version -v -vv -vvv --health -g --grammar" -- $2))
+		COMPREPLY=($(compgen -fd -W "-h --help --tutor -V --version -v -vv -vvv --health -g --grammar --vsplit --hsplit" -- $2))
 		;;
 	esac
 } && complete -F _hx hx
diff --git a/contrib/completion/hx.fish b/contrib/completion/hx.fish
index 4ec690d8..df2fb500 100644
--- a/contrib/completion/hx.fish
+++ b/contrib/completion/hx.fish
@@ -9,4 +9,5 @@ complete -c hx -l health -x -a "$langs" -d "Checks for errors in editor setup"
 complete -c hx -s g -l grammar -x -a "fetch build" -d "Fetches or builds tree-sitter grammars"
 complete -c hx -s v -o vv -o vvv -d "Increases logging verbosity"
 complete -c hx -s V -l version -d "Prints version information"
-
+complete -c hx -l vsplit -d "Splits all given files vertically into different windows"
+complete -c hx -l hsplit -d "Splits all given files horizontally into different windows"
diff --git a/contrib/completion/hx.zsh b/contrib/completion/hx.zsh
index 16631519..f9d58d3c 100644
--- a/contrib/completion/hx.zsh
+++ b/contrib/completion/hx.zsh
@@ -14,6 +14,8 @@ _hx() {
 		"--health[Checks for errors in editor setup]:language:->health" \
 		"-g[Fetches or builds tree-sitter grammars]:action:->grammar" \
 		"--grammar[Fetches or builds tree-sitter grammars]:action:->grammar" \
+		"--vsplit[Splits all given files vertically into different windows]" \
+		"--hsplit[Splits all given files horizontally into different windows]" \
 		"*:file:_files"
 
 	case "$state" in
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<Layout>,
     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"),