From 91462af546619740c93181b88a7908e481e6d6ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= <blaz@mxxn.io>
Date: Tue, 6 Apr 2021 19:02:22 +0900
Subject: [PATCH] Allow starting hx without a file. A new blank file will be
 created.

---
 helix-term/src/application.rs | 11 +++--
 helix-term/src/main.rs        |  2 +-
 helix-view/src/editor.rs      | 92 ++++++++++++++++++++---------------
 3 files changed, 60 insertions(+), 45 deletions(-)

diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 53fd086b..396bd565 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -45,14 +45,17 @@ pub struct Application {
 
 impl Application {
     pub fn new(mut args: Args, executor: &'static smol::Executor<'static>) -> Result<Self, Error> {
+        use helix_view::editor::Action;
         let mut compositor = Compositor::new()?;
         let size = compositor.size();
         let mut editor = Editor::new(executor, size);
 
-        let files = args.values_of_t::<PathBuf>("files").unwrap();
-        for file in files {
-            use helix_view::editor::Action;
-            editor.open(file, Action::HorizontalSplit)?;
+        if let Ok(files) = args.values_of_t::<PathBuf>("files") {
+            for file in files {
+                editor.open(file, Action::HorizontalSplit)?;
+            }
+        } else {
+            editor.new_file(Action::HorizontalSplit)?;
         }
 
         compositor.push(Box::new(ui::EditorView::new()));
diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs
index 33792947..a2ea5993 100644
--- a/helix-term/src/main.rs
+++ b/helix-term/src/main.rs
@@ -56,7 +56,7 @@ fn main() {
         .arg(
             Arg::new("files")
                 .about("Sets the input file to use")
-                .required(true)
+                .required(false)
                 .multiple(true)
                 .index(1),
         )
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index a4ce2aca..531571f7 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -51,46 +51,7 @@ impl Editor {
         }
     }
 
-    pub fn open(&mut self, path: PathBuf, action: Action) -> Result<DocumentId, Error> {
-        let id = self
-            .documents()
-            .find(|doc| doc.path() == Some(&path))
-            .map(|doc| doc.id);
-
-        let id = if let Some(id) = id {
-            id
-        } else {
-            let mut doc = Document::load(path, self.theme.scopes())?;
-
-            // try to find a language server based on the language name
-            let language_server = doc
-                .language
-                .as_ref()
-                .and_then(|language| self.language_servers.get(language, self.executor));
-
-            if let Some(language_server) = language_server {
-                doc.set_language_server(Some(language_server.clone()));
-
-                let language_id = doc
-                    .language()
-                    .and_then(|s| s.split('.').last()) // source.rust
-                    .map(ToOwned::to_owned)
-                    .unwrap_or_default();
-
-                smol::block_on(language_server.text_document_did_open(
-                    doc.url().unwrap(),
-                    doc.version(),
-                    doc.text(),
-                    language_id,
-                ))
-                .unwrap();
-            }
-
-            let id = self.documents.insert(doc);
-            self.documents[id].id = id;
-            id
-        };
-
+    fn _open(&mut self, id: DocumentId, action: Action) -> Result<DocumentId, Error> {
         use crate::tree::Layout;
         use helix_core::Selection;
         match action {
@@ -134,6 +95,57 @@ impl Editor {
         Ok(id)
     }
 
+    pub fn new_file(&mut self, action: Action) -> Result<DocumentId, Error> {
+        use helix_core::Rope;
+        let doc = Document::new(Rope::from("\n"));
+        let id = self.documents.insert(doc);
+        self.documents[id].id = id;
+        self._open(id, action)
+    }
+
+    pub fn open(&mut self, path: PathBuf, action: Action) -> Result<DocumentId, Error> {
+        let id = self
+            .documents()
+            .find(|doc| doc.path() == Some(&path))
+            .map(|doc| doc.id);
+
+        let id = if let Some(id) = id {
+            id
+        } else {
+            let mut doc = Document::load(path, self.theme.scopes())?;
+
+            // try to find a language server based on the language name
+            let language_server = doc
+                .language
+                .as_ref()
+                .and_then(|language| self.language_servers.get(language, self.executor));
+
+            if let Some(language_server) = language_server {
+                doc.set_language_server(Some(language_server.clone()));
+
+                let language_id = doc
+                    .language()
+                    .and_then(|s| s.split('.').last()) // source.rust
+                    .map(ToOwned::to_owned)
+                    .unwrap_or_default();
+
+                smol::block_on(language_server.text_document_did_open(
+                    doc.url().unwrap(),
+                    doc.version(),
+                    doc.text(),
+                    language_id,
+                ))
+                .unwrap();
+            }
+
+            let id = self.documents.insert(doc);
+            self.documents[id].id = id;
+            id
+        };
+
+        self._open(id, action)
+    }
+
     pub fn close(&mut self, id: ViewId) {
         let view = self.tree.get(self.tree.focus);
         // get around borrowck issues