-- TODO(ZyX-I): Create compatibility layer. --{{{1 package.path updater function -- Last inserted paths. Used to clear out items from package.[c]path when they -- are no longer in &runtimepath. local last_nvim_paths = {} local function _update_package_paths() local cur_nvim_paths = {} local rtps = vim.api.nvim_list_runtime_paths() local sep = package.config:sub(1, 1) for _, key in ipairs({'path', 'cpath'}) do local orig_str = package[key] .. ';' local pathtrails_ordered = {} local orig = {} -- Note: ignores trailing item without trailing `;`. Not using something -- simpler in order to preserve empty items (stand for default path). for s in orig_str:gmatch('[^;]*;') do s = s:sub(1, -2) -- Strip trailing semicolon orig[#orig + 1] = s end if key == 'path' then -- /?.lua and /?/init.lua pathtrails_ordered = {sep .. '?.lua', sep .. '?' .. sep .. 'init.lua'} else local pathtrails = {} for _, s in ipairs(orig) do -- Find out path patterns. pathtrail should contain something like -- /?.so, \?.dll. This allows not to bother determining what correct -- suffixes are. local pathtrail = s:match('[/\\][^/\\]*%?.*$') if pathtrail and not pathtrails[pathtrail] then pathtrails[pathtrail] = true pathtrails_ordered[#pathtrails_ordered + 1] = pathtrail end end end local new = {} for _, rtp in ipairs(rtps) do if not rtp:match(';') then for _, pathtrail in pairs(pathtrails_ordered) do local new_path = rtp .. sep .. 'lua' .. pathtrail -- Always keep paths from &runtimepath at the start: -- append them here disregarding orig possibly containing one of them. new[#new + 1] = new_path cur_nvim_paths[new_path] = true end end end for _, orig_path in ipairs(orig) do -- Handle removing obsolete paths originating from &runtimepath: such -- paths either belong to cur_nvim_paths and were already added above or -- to last_nvim_paths and should not be added at all if corresponding -- entry was removed from &runtimepath list. if not (cur_nvim_paths[orig_path] or last_nvim_paths[orig_path]) then new[#new + 1] = orig_path end end package[key] = table.concat(new, ';') end last_nvim_paths = cur_nvim_paths end --{{{1 Module definition return { _update_package_paths = _update_package_paths, }