Code: Select all
function resolve_to_absolute(path)
-- Если путь пустой, возвращаем текущую директорию Far
if not path or path == "" then
return far.GetCurrentDirectory()
end
-- Получаем текущую рабочую директорию из Far Manager
local cur_dir = far.GetCurrentDirectory()
-- 1. Обработка путей от корня текущего диска (например, \abc\def)
if path:match("^[/\\]") then
-- Вырезаем корень (букву диска с двоеточием, например "C:")
local drive_root = cur_dir:match("^%a:") or ""
-- Склеиваем диск и путь от корня
return far.ConvertPath(drive_root .. path)
end
-- 2. Обработка путей с относительным диском (например, C:abc\def)
if path:match("^%a:[^/\\]") then
local drive = path:sub(1, 2) -- Получаем "C:"
local sub_path = path:sub(3) -- Получаем "abc\def"
-- Если текущий диск Far совпадает с запрошенным диском
if cur_dir:sub(1, 2):lower() == drive:lower() then
return far.ConvertPath(cur_dir .. "\\" .. sub_path)
else
-- Если диски разные, Windows обычно сбрасывает к корню этого диска
-- (так как Far хранит историю только для своего текущего каталога)
return far.ConvertPath(drive .. "\\" .. sub_path)
end
end
-- 3. Обработка классических полных абсолютных путей (например, C:\abc или \\server\share)
if path:match("^%a:[/\\]") or path:match("^[/\\][/\\]") then
return far.ConvertPath(path)
end
-- 4. Обработка стандартных относительных путей (например, abc\def, .\config, ..\file)
-- Просто склеиваем текущую директорию Far и относительный путь
return far.ConvertPath(cur_dir .. "\\" .. path)
end
-- ====================================================================
-- Примеры работы функции (предположим, far.GetCurrentDirectory() вернул "C:\Plugins\Lua")
-- ====================================================================
-- 1. Путь от корня текущего диска
print(resolve_to_absolute("\\abc\\def"))
-- Вывод: "C:\abc\def"
-- 2. Относительный путь от текущей папки
print(resolve_to_absolute("utils\\test.lua"))
-- Вывод: "C:\Plugins\Lua\utils\test.lua"
-- 3. Путь со смещением на уровень вверх
print(resolve_to_absolute("..\\Macro\\script.lua"))
-- Вывод: "C:\Plugins\Macro\script.lua" (far.ConvertPath сам убрал "..")
-- 4. Полноценный абсолютный путь
print(resolve_to_absolute("D:\\Games\\cl.exe"))
-- Вывод: "D:\\Games\\cl.exe" (остался без изменений)