From 000caf2e43bcee1f371f6bea167c43be43a570c0 Mon Sep 17 00:00:00 2001 From: Guldoman Date: Sun, 10 Oct 2021 03:43:23 +0200 Subject: [PATCH] Allow opening non existing files from arguments --- data/core/init.lua | 54 +++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/data/core/init.lua b/data/core/init.lua index 6b70d589..31462e39 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -593,6 +593,25 @@ local function add_config_files_hooks() end +-- The function below works like system.absolute_path except it +-- doesn't fail if the file does not exist. We consider that the +-- current dir is core.project_dir so relative filename are considered +-- to be in core.project_dir. +-- Please note that .. or . in the filename are not taken into account. +-- This function should get only filenames normalized using +-- common.normalize_path function. +function core.project_absolute_path(filename) + if filename:match('^%a:\\') or filename:find('/', 1, true) == 1 then + return common.normalize_path(filename) + elseif not core.project_dir then + local cwd = system.absolute_path(".") + return cwd .. PATHSEP .. common.normalize_path(filename) + else + return core.project_dir .. PATHSEP .. filename + end +end + + function core.init() command = require "core.command" keymap = require "core.keymap" @@ -626,23 +645,20 @@ function core.init() local project_dir = core.recent_projects[1] or "." local project_dir_explicit = false local files = {} - local delayed_error for i = 2, #ARGS do local arg_filename = strip_trailing_slash(ARGS[i]) local info = system.get_file_info(arg_filename) or {} - if info.type == "file" then - local file_abs = system.absolute_path(arg_filename) - if file_abs then - table.insert(files, file_abs) - project_dir = file_abs:match("^(.+)[/\\].+$") - end - elseif info.type == "dir" then + if info.type == "dir" then project_dir = arg_filename project_dir_explicit = true else -- on macOS we can get an argument like "-psn_0_52353" that we just ignore. if not ARGS[i]:match("^-psn") then - delayed_error = string.format("error: invalid file or directory %q", ARGS[i]) + local file_abs = core.project_absolute_path(arg_filename) + if file_abs then + table.insert(files, file_abs) + project_dir = file_abs:match("^(.+)[/\\].+$") + end end end end @@ -728,10 +744,6 @@ function core.init() core.root_view:open_doc(core.open_doc(filename)) end - if delayed_error then - core.error(delayed_error) - end - if not plugins_success or got_user_error or got_project_error then command.perform("core:open-log") end @@ -1002,22 +1014,6 @@ function core.normalize_to_project_dir(filename) end --- The function below works like system.absolute_path except it --- doesn't fail if the file does not exist. We consider that the --- current dir is core.project_dir so relative filename are considered --- to be in core.project_dir. --- Please note that .. or . in the filename are not taken into account. --- This function should get only filenames normalized using --- common.normalize_path function. -function core.project_absolute_path(filename) - if filename:match('^%a:\\') or filename:find('/', 1, true) == 1 then - return filename - else - return core.project_dir .. PATHSEP .. filename - end -end - - function core.open_doc(filename) local new_file = not filename or not system.get_file_info(filename) local abs_filename