From c3013489557ddf1afaf5c5ce1cfcc67c45e465e2 Mon Sep 17 00:00:00 2001 From: Nick von Kaenel <52364921+nickvonkaenel@users.noreply.github.com> Date: Tue, 17 Feb 2026 15:32:13 -0800 Subject: [PATCH 1/2] fix(files): validate window ID before accessing in get_explorer_state Adds vim.api.nvim_win_is_valid() check before accessing window buffers to prevent errors when window IDs become invalid, such as with empty folders. --- lua/mini/files.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lua/mini/files.lua b/lua/mini/files.lua index 331bead2..c1a9f206 100644 --- a/lua/mini/files.lua +++ b/lua/mini/files.lua @@ -1061,9 +1061,11 @@ MiniFiles.get_explorer_state = function() H.explorer_ensure_target_window(explorer) local windows = {} for _, win_id in ipairs(explorer.windows) do - local buf_id = vim.api.nvim_win_get_buf(win_id) - local path = (H.opened_buffers[buf_id] or {}).path - table.insert(windows, { win_id = win_id, path = path }) + if vim.api.nvim_win_is_valid(win_id) then + local buf_id = vim.api.nvim_win_get_buf(win_id) + local path = (H.opened_buffers[buf_id] or {}).path + table.insert(windows, { win_id = win_id, path = path }) + end end return { From 595a0f94821548898c0e1fef1841b89b0af6b014 Mon Sep 17 00:00:00 2001 From: Nick von Kaenel <52364921+nickvonkaenel@users.noreply.github.com> Date: Thu, 19 Feb 2026 18:18:37 -0800 Subject: [PATCH 2/2] Remove unnecessary window validation and improve windows normalize_path function Found that the root cause of the issue is related to how paths were being normalized for windows. Changed the normalize function to handle UNC and Extended-length paths, and also improve behavior around slashes following drive letters --- lua/mini/files.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lua/mini/files.lua b/lua/mini/files.lua index c1a9f206..ab3a4a6f 100644 --- a/lua/mini/files.lua +++ b/lua/mini/files.lua @@ -1061,11 +1061,9 @@ MiniFiles.get_explorer_state = function() H.explorer_ensure_target_window(explorer) local windows = {} for _, win_id in ipairs(explorer.windows) do - if vim.api.nvim_win_is_valid(win_id) then - local buf_id = vim.api.nvim_win_get_buf(win_id) - local path = (H.opened_buffers[buf_id] or {}).path - table.insert(windows, { win_id = win_id, path = path }) - end + local buf_id = vim.api.nvim_win_get_buf(win_id) + local path = (H.opened_buffers[buf_id] or {}).path + table.insert(windows, { win_id = win_id, path = path }) end return { @@ -2634,7 +2632,13 @@ end H.fs_normalize_path = function(path) return (path:gsub('/+', '/'):gsub('(.)/$', '%1')) end if H.is_windows then - H.fs_normalize_path = function(path) return (path:gsub('\\', '/'):gsub('([^/])/+', '%1/'):gsub('(.)[\\/]$', '%1')) end + H.fs_normalize_path = function(path) + path = path:gsub('\\', '/'):gsub('///+', '//') + local prefix = path:sub(1, 2) + local rest = path:sub(3):gsub('/+', '/'):gsub('/+$', '') + if prefix:match('%a:') then prefix = prefix .. '/' end + return prefix .. rest + end end H.fs_is_imaginary_path = function(path) return path:sub(-1) == '\000' end