diff --git a/data/core/init.lua b/data/core/init.lua index 0d8c8e51..1a2cf61f 100644 --- a/data/core/init.lua +++ b/data/core/init.lua @@ -238,11 +238,11 @@ local function refresh_directory(topdir, target, expanded) -- If we're expecting to keep track of everything, go through the list and iteratively deal with directories. files = dirwatch.get_directory_files(topdir, topdir.name, directory, {}, 0, function() return false end) end - + local new_idx, old_idx = 1, index local new_directories = {} local last_dir = nil - while old_idx <= n or new_idx <= #files do + while old_idx <= n or new_idx <= #files do local old_info, new_info = topdir.files[old_idx], files[new_idx] if not new_info or not old_info or not last_dir or old_info.filename:sub(1, #last_dir + 1) ~= last_dir .. "/" then if not new_info or not old_info or not files_info_equal(new_info, old_info) then @@ -282,7 +282,7 @@ local function refresh_directory(topdir, target, expanded) if change then core.redraw = true topdir.is_dirty = true - end + end return change end end @@ -301,8 +301,8 @@ function core.add_project_directory(path) watch_thread = nil, watch = dirwatch.new() } - table.insert(core.project_directories, topdir) - + table.insert(core.project_directories, topdir) + local fstype = PLATFORM == "Linux" and system.get_fs_type(topdir.name) or "unknown" topdir.force_scans = (fstype == "nfs" or fstype == "fuse") local t, complete, entries_count = dirwatch.get_directory_files(topdir, topdir.name, "", {}, 0, timed_max_files_pred) @@ -320,13 +320,13 @@ function core.add_project_directory(path) topdir.watch:watch(topdir.name) -- each top level directory gets a watch thread. if the project is small, or -- if the ablity to use directory watches hasn't been compromised in some way - -- either through error, or amount of files, then this should be incredibly + -- either through error, or amount of files, then this should be incredibly -- quick; essentially one syscall per check. Otherwise, this may take a bit of -- time; the watch will yield in this coroutine after 0.01 second, for 0.1 seconds. topdir.watch_thread = core.add_thread(function() while true do topdir.watch:check(function(target) - if target == topdir.name then return refresh_directory(topdir, "", true) end + if target == topdir.name then return refresh_directory(topdir, "", true) end local dirpath = target:sub(#topdir.name + 2) local abs_dirpath = topdir.name .. PATHSEP .. dirpath if dirpath then @@ -339,7 +339,7 @@ function core.add_project_directory(path) coroutine.yield(0.05) end end) - + if path == core.project_dir then core.project_files = topdir.files end @@ -719,7 +719,32 @@ function core.init() core.threads = setmetatable({}, { __mode = "k" }) core.blink_start = system.get_time() core.blink_timer = core.blink_start - + core.redraw = true + core.visited_files = {} + core.restart_request = false + core.quit_request = false + + -- We load core views before plugins that may need them. + core.root_view = RootView() + core.command_view = CommandView() + core.status_view = StatusView() + core.nag_view = NagView() + core.title_view = TitleView() + + -- Some plugins (eg: console) require the nodes to be initialized to defaults + local cur_node = core.root_view.root_node + cur_node.is_primary_node = true + cur_node:split("up", core.title_view, {y = true}) + cur_node = cur_node.b + cur_node:split("up", core.nag_view, {y = true}) + cur_node = cur_node.b + cur_node = cur_node:split("down", core.command_view, {y = true}) + cur_node = cur_node:split("down", core.status_view, {y = true}) + + -- Load defaiult commands first so plugins can override them + command.add_defaults() + + -- Load user module, plugins and project module local got_user_error, got_project_error = not core.load_user_directory() local project_dir_abs = system.absolute_path(project_dir) @@ -736,7 +761,7 @@ function core.init() update_recents_project("remove", project_dir) end project_dir_abs = system.absolute_path(".") - if not core.set_project_dir(project_dir_abs, function() + if not core.set_project_dir(project_dir_abs, function() got_project_error = not core.load_project_module() end) then system.show_fatal_error("Lite XL internal error", "cannot set project directory to cwd") @@ -744,27 +769,7 @@ function core.init() end end - core.redraw = true - core.visited_files = {} - core.restart_request = false - core.quit_request = false - - core.root_view = RootView() - core.command_view = CommandView() - core.status_view = StatusView() - core.nag_view = NagView() - core.title_view = TitleView() - - local cur_node = core.root_view.root_node - cur_node.is_primary_node = true - cur_node:split("up", core.title_view, {y = true}) - cur_node = cur_node.b - cur_node:split("up", core.nag_view, {y = true}) - cur_node = cur_node.b - cur_node = cur_node:split("down", core.command_view, {y = true}) - cur_node = cur_node:split("down", core.status_view, {y = true}) - - command.add_defaults() + -- Load core plugins after user ones to let the user override them local plugins_success, plugins_refuse_list = core.load_plugins() do