Как провалиться в первую непустую вложенную папку?
Posted: Wed 14 Dec, 2016 10:45
by nimdamsk
Всем добра.
Когда лазишь по Java-проекту на диске (только не спрашивайте зачем это делать в Far-е) жутко надоедает необходимость много раз жать "вниз+Enter", пока доберёшься до рабочих файлов. Можно это как-то автоматизировать? Т.е. по нажатию сочетания клавиш проваливаться в первую папку, в которой есть файл или другая папка. Куда копать?
Как провалиться в первую непустую вложенную папку?
Posted: Wed 14 Dec, 2016 11:32
by zg
в макросы.
Как провалиться в первую непустую вложенную папку?
Posted: Wed 14 Dec, 2016 21:05
by nimdamsk
Поковырялся немного. Хотя нет, много ковырялся, но сделал что нужно.
Этот макрос проваливается в первую непустую папку:
Macro {
area="Shell"; key="CtrlAltDown"; flags="EmptyCommandLine"; description="Go down to first non-empty dir";
action=function()
if APanel.Folder then Keys('Enter') end
while true do
if APanel.Empty or (APanel.ItemCount > 2) then
break
else
Keys('Down')
if APanel.Folder then Keys('Enter') else break end
end
end
end;
}
Macro {
area="Shell"; key="CtrlAltUp"; flags="EmptyCommandLine"; description="Go up to first non-empty dir";
action=function()
Keys('Home Enter')
while true do
if (APanel.ItemCount > 2) then
break
else
Keys('Home Enter')
end
end
end;
}
В общем всё работает.
Единственный минус, кмк, оно выполняется где-то 0,3 - 0,5 сек, т.е. заметно на глаз, хотелось бы чтобы было незаметно.
Если я что-то наговнокодил - прошу показать.
Всем спасибо за помощь.
Как провалиться в первую непустую вложенную папку?
Posted: Wed 14 Dec, 2016 23:09
by HaRT
nimdamsk wrote: Если я что-то наговнокодил - прошу показать.
1. Вместо “Home Enter” и “Enter” на директории лучше писать CtrlPgUp и CtrlPgDn соответственно — и короче, и flags="EmptyCommandLine"; можно выкинуть, и в корне диска будет работать правильно. Впрочем, если там меньше 3 элементов, то зациклится.
2. Вместо
Macro {
description = "Down till end or furcation";
area = "Shell"; key = "AltPgDn";
action = function()
local c = 1
while c do
Keys'CtrlPgDn Down'
c = APanel.ItemCount == 2 and APanel.Folder
end
end;
}
Macro {
area="Shell"; key="CtrlAltDown"; description="Go down to first non-empty dir";
action=function()
if APanel.Folder then Keys('CtrlPgDn') end
while not (APanel.Empty or (APanel.ItemCount > 2)) do
if APanel.Folder then Keys('CtrlPgDn') else break end
end
end;
}
Долго пытался понять, что ему не нравится. Потом попробовал руками проделать всё и стало понятно.
Macro {
area="Shell"; key="CtrlAltUp"; description="Go up to first non-empty dir";
action=function()
Keys('CtrlPgUp')
while not (APanel.ItemCount > 2) do
Keys('CtrlPgUp')
end
end;
}
Macro {
area="Shell"; key="CtrlAltDown"; description="Go down to first non-empty dir";
action=function()
while not (APanel.Empty or (APanel.ItemCount > 2)) do
Keys('Down CtrlPgDn')
end
end;
}
Ваш макрос AltPgDn работает, и лучше, чем мой - он проваливается вниз из корневой директории, даже если в ней больше 1 файла\папки, а у меня это условие стоит в начале цикла. Поэтому буду использовать ваш вариант, правда, смысл булевой операции я не понял, и не хочу понимать
Go Up я использовать не буду - там всё слишком сложно и оно не решает исходной задачи к тому же.
Наконец-то я написал в Far-е макрос, за примерно 15 лет использования
Спуститься в первый подкаталог с "нетривиальным" содержимым
Posted: Thu 08 Mar, 2018 23:24
by fml2
Здравствуйте.
У меня довольно часто возникает такая ситуациа: я стою в каталоге, содежимым которого является только один подкаталог. Содежимое этого подкаталога -- тоже только один подкаталог. И так еще пару раз. И только после этой пару раз в качестве содержимого появляется что-то кроме одного единственного подкаталога, т.е. либо более чем один подкаталог, либо еще какие-нибудь файлы.
Мне бы хотелось иметь макрос, который, исходя из текущего каталога, спускался бы вглубь до тех пор, пока в качестве содержимого не окажется что-то кроме одного единственного каталога.
Пример. Предположим, имеется следующая структура каталогов, и курсор в активной панели стоит на Folder1:
Тогда макрос должен "спуститься" по структуре и остановиться на Folder3 (т.е. в панели должно отображаться содержимое Folder3), т.к. Folder3 -- это первая папка, содержимое которой состоит не из одного единственного подкаталога.
Мне кажется, что я такой макрос даже уже где-то видел. Искал-искал, но так ничего и не нашел. Может, кто-нибудь подкинет ссылочку?
Заранее спасибо.
Спуститься в первый подкаталог с "нетривиальным" содержимым
А нельзя ли как-нибудь сделать так, чтобы перед "спусканием" макрос запоминал, откуда производится спуск, и потом иметь какую-нибудь кнопку, по которой можно было бы прыгнуть обратно. Что-то вроде "Undo". Потому как в том виде, в каком оно сейчас, кнопки Alt+Down и Alt+Up не являются "взаимонейтрализующими". А хотелось бы иметь возможность быстро подняться в исходное место, если увидел, что "провалился" не туда (или, может, точнее было бы "выбрал неправильную исходную точку для проваливания").
Как провалиться в первую непустую вложенную папку?
Posted: Sat 10 Mar, 2018 03:22
by HaRT
!
Message from: HaRT
fml2 wrote: ↑Thu 08 Mar, 2018 23:38 Думаю, что это "обсуждение" можно стереть.
Я просто склеил в одно.
Как провалиться в первую непустую вложенную папку?
Posted: Sat 10 Mar, 2018 14:23
by fml2
fml2 wrote: ↑Fri 09 Mar, 2018 22:23А нельзя ли как-нибудь сделать так, чтобы перед "спусканием" макрос запоминал, откуда производится спуск, и потом иметь какую-нибудь кнопку, по которой можно было бы прыгнуть обратно.
Может, как-то так можно: перед спуском запоминать (в settings? ведь макросы не имеют состояния, правильно?), откуда начинается спуск, а в другом макросе (Alt+Up) проверять, находимся ли мы в одном из подкаталогов запомненного каталога, и, если да, то возвращаться в него.
Как провалиться в первую непустую вложенную папку?
local last_dir
Macro {
......
action=function()
if last_dir .... then
..............
last_dir = ....
..............
end;
}
Как провалиться в первую непустую вложенную папку?
Posted: Sat 10 Mar, 2018 23:27
by fml2
Написал вот пару "взаимно нейтрализующих" макросов (один спускается, другой поднимается в исходное место) -- см. прикрепленный файл. Внутри панелей плагинов "подъем", похоже, не работает.
Как провалиться в первую непустую вложенную папку?
Posted: Sun 11 Mar, 2018 05:55
by Shmuel
fml2, не используйте функции библиотеки string - она не юникодная.
Вместо string.len(srcPath) должно быть srcPath:len(), аналогично заменить string.sub(APanel.Path) на APanel.Path:sub().
Как провалиться в первую непустую вложенную папку?
Posted: Sun 11 Mar, 2018 08:00
by siberia-man
fml2 wrote: ↑Sat 10 Mar, 2018 23:27пару "взаимно нейтрализующих" макросов
Спрошу, не вдаваясь в подробности Ваших макросов. Возможно Вы уже предусмотрели это. Макросы учитывают "неожиданный" переход в другой кактлог после спуска? Например, пользователь сделал "Descend to the first non-trivial subdirectory", а потом перешел в совершенно другой каталог. Как отреагирует макрос "Undo the last Descend" на такое изменение системы?
Как провалиться в первую непустую вложенную папку?
Posted: Sun 11 Mar, 2018 10:09
by fml2
Shmuel wrote: ↑Sun 11 Mar, 2018 05:55fml2, не используйте функции библиотеки string - она не юникодная.
Спасибо за замечание, подправил. Подправленный вариант -- в довеске.
siberia-man wrote: ↑Sun 11 Mar, 2018 08:00Макросы учитывают "неожиданный" переход в другой кактлог после спуска?
Да. Если текущий каталог не находится внутри того каталога, откуда был произведен спуск, то ничего не происходит.