Page 1 of 1
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 15:10
by DV
Проверял с FAR 3.0 build 5234 x86 и FAR 3.0 build 5248 x86.
1. Качаем архив Far30b5248.x86.20180802.7z, распаковываем в новую пустую папку.
2. Рядом с этой новой пустой папкой (на том же уровне, что и она) создаем папку Progs.
3. Запускаем FAR из новой папки с Far30b5248, из этого запущенного FAR заходим внутрь архива Far30b5248.x86.20180802.7z
4. Находясь внутри архива, выполняем команду:
Code: Select all
lua:local p = win.GetEnv("FARHOME") .. "\\..\\Progs"; Panel.SetPath(0, p)
Результат: ничего не происходит.
Ожидается: переход в папку Progs.
5. Все еще находясь внутри архива, выполняем команду:
Code: Select all
lua:local p = win.GetEnv("FARHOME") .. "\\..\\Progs"; print("cd " .. p)
Результат: по нажатию Enter мы переходим в папку Progs.
Вопрос: почему не сработала команда в пункте 4 ?
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 15:37
by Shmuel
DV wrote: ↑Thu 02 Aug, 2018 15:10
Вопрос: почему не сработала команда в пункте 4 ?
Потому что когда активная панель является панелью плагина, SetPath() передаёт имя папки плагину, то есть просит его установить у себя требуемый путь. Поскольку такого пути в архиве нет, то ничего не происходит, и функция возвращает false.
Кстати, для вспомогательных переменных в комстроке нет надобности писать "local" (если они только не совпадают с существующими глобальными переменными).
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 15:56
by zg
Shmuel wrote: ↑Thu 02 Aug, 2018 15:37Потому что когда активная панель является панелью плагина, SetPath() передаёт имя папки плагину, то есть просит его установить у себя требуемый путь.
если только переданный путь не является абсолютным.
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 16:09
by DV
Как же изменить скрипт, чтобы он срабатывал и из плагиновой панели тоже?
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 16:58
by John Doe
На выбор:
1. far.ConvertPath
2. Самостоятельно закрывать панель плагина
3. Заменить Panel.SetPath на аналогичные команды плагинового апи
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 17:00
by HaRT
zg wrote: ↑Thu 02 Aug, 2018 15:56
если только переданный путь не является абсолютным
Так ведь в исходном примере путь предположительно абсолютный (поскольку
%FARHOME%
)…
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 17:22
by zg
HaRT wrote: ↑Thu 02 Aug, 2018 17:00Так ведь в исходном примере путь предположительно абсолютный (поскольку
%FARHOME%
)…
с каких пор пути, содержащие .. стали абсолютными?
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 17:48
by Shmuel
zg wrote: ↑Thu 02 Aug, 2018 17:22
с каких пор пути, содержащие .. стали абсолютными?
Данный путь состоит из абсолютного пути (%FARHOME%), к которому добавлен относительный (..\\Progs).
На мой взгляд, результат этого "сложения" = абсолютный путь.
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 18:18
by HaRT
zg wrote: ↑Thu 02 Aug, 2018 17:22
с каких пор пути, содержащие .. стали абсолютными?
Абсолютный путь или относительный определяется не тем, содержит ли он компоненты
.
или
..
, а тем, начинается ли он с
/
под никсами или с
\\
/
БУКВА_ДИСКА:\
под Виндой. Наличие компоненты
.
или
..
в середине влияет на то, является ли путь нормализованным/каноническим, но не на то, абсолютный ли он.
Panel.SetPath внутри архива
Posted: Thu 02 Aug, 2018 19:57
by zg
ну значит нужен абсолютный нормализованный.
Panel.SetPath внутри архива
Posted: Fri 03 Aug, 2018 07:14
by DV
Для протокола, рабочий вариант, на котором я остановился:
Code: Select all
lua:local p = win.GetEnv("FARHOME") .. "\\..\\Progs"; p = far.ConvertPath(p, "CPM_FULL"); Panel.SetPath(0, p)