Как провалиться в первую непустую вложенную папку?

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
nimdamsk
Posts: 17
Joined: Thu 22 Oct, 2009 12:10
Has thanked: 1 time

Как провалиться в первую непустую вложенную папку?

Post by nimdamsk » Wed 14 Dec, 2016 10:45

Всем добра.

Когда лазишь по Java-проекту на диске (только не спрашивайте зачем это делать в Far-е) жутко надоедает необходимость много раз жать "вниз+Enter", пока доберёшься до рабочих файлов. Можно это как-то автоматизировать? Т.е. по нажатию сочетания клавиш проваливаться в первую папку, в которой есть файл или другая папка. Куда копать?

User avatar
zg
zero-gravity
Posts: 5610
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 100 times
Contact:

Как провалиться в первую непустую вложенную папку?

Post by zg » Wed 14 Dec, 2016 11:32

в макросы.

nimdamsk
Posts: 17
Joined: Thu 22 Oct, 2009 12:10
Has thanked: 1 time

Как провалиться в первую непустую вложенную папку?

Post by nimdamsk » Wed 14 Dec, 2016 21:05

Поковырялся немного. Хотя нет, много ковырялся, но сделал что нужно.

Этот макрос проваливается в первую непустую папку:

Code: Select all

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;
}
А этот вылезает со дна наверх:

Code: Select all

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 сек, т.е. заметно на глаз, хотелось бы чтобы было незаметно.

Если я что-то наговнокодил - прошу показать.

Всем спасибо за помощь.

User avatar
HaRT
Moderator
Posts: 9083
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 90 times
Been thanked: 157 times

Как провалиться в первую непустую вложенную папку?

Post by HaRT » Wed 14 Dec, 2016 23:09

nimdamsk wrote: Если я что-то наговнокодил - прошу показать.
1. Вместо “Home Enter” и “Enter” на директории лучше писать CtrlPgUp и CtrlPgDn соответственно — и короче, и flags="EmptyCommandLine"; можно выкинуть, и в корне диска будет работать правильно. Впрочем, если там меньше 3 элементов, то зациклится.
2. Вместо

Code: Select all

    while true do
      if Condition then
        break
      else
        Actions
      end
    end
лучше писать

Code: Select all

    while not Condition do
      Actions
    end
— и короче, и понятнее.

И только сейчас, прочитав Ваш код, я понял, что же Вы хотели получить. Я для такого „проваливания“ давно пользуюсь таким макросом: . А для выхода вверх — Go Up: http://forum.farmanager.com/viewtopic.p ... 19#p137619.
Фар есть инструмент, а не нянька. © 2009 DrKnS

nimdamsk
Posts: 17
Joined: Thu 22 Oct, 2009 12:10
Has thanked: 1 time

Как провалиться в первую непустую вложенную папку?

Post by nimdamsk » Thu 15 Dec, 2016 00:43

За CtrlPgDn спасибо, я им не пользуюсь, поэтому и не применил.

Сначала механически поправил while по вашему совету. С таким кодом Far зависал:

Code: Select all

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;
}
Долго пытался понять, что ему не нравится. Потом попробовал руками проделать всё и стало понятно.

Вот рабочие переделанные макросы.

Code: Select all

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;
}

Code: Select all

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 лет использования :)

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Спуститься в первый подкаталог с "нетривиальным" содержимым

Post by fml2 » Thu 08 Mar, 2018 23:24

Здравствуйте.

У меня довольно часто возникает такая ситуациа: я стою в каталоге, содежимым которого является только один подкаталог. Содежимое этого подкаталога -- тоже только один подкаталог. И так еще пару раз. И только после этой пару раз в качестве содержимого появляется что-то кроме одного единственного подкаталога, т.е. либо более чем один подкаталог, либо еще какие-нибудь файлы.

Мне бы хотелось иметь макрос, который, исходя из текущего каталога, спускался бы вглубь до тех пор, пока в качестве содержимого не окажется что-то кроме одного единственного каталога.

Пример. Предположим, имеется следующая структура каталогов, и курсор в активной панели стоит на Folder1:

Code: Select all

Folder1
  Folder2
    Folder3
      FolderA
      FolderB
Тогда макрос должен "спуститься" по структуре и остановиться на Folder3 (т.е. в панели должно отображаться содержимое Folder3), т.к. Folder3 -- это первая папка, содержимое которой состоит не из одного единственного подкаталога.

Мне кажется, что я такой макрос даже уже где-то видел. Искал-искал, но так ничего и не нашел. Может, кто-нибудь подкинет ссылочку?

Заранее спасибо.
Last edited by fml2 on Thu 08 Mar, 2018 23:26, edited 1 time in total.

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Спуститься в первый подкаталог с "нетривиальным" содержимым

Post by fml2 » Thu 08 Mar, 2018 23:38

А, нашел! viewtopic.php?f=57&t=10578

Думаю, что это "обсуждение" можно стереть.

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Как провалиться в первую непустую вложенную папку?

Post by fml2 » Fri 09 Mar, 2018 22:23

HaRT wrote:
Wed 14 Dec, 2016 23:09
А для выхода вверх — Go Up: http://forum.farmanager.com/viewtopic.p ... 19#p137619.
А нельзя ли как-нибудь сделать так, чтобы перед "спусканием" макрос запоминал, откуда производится спуск, и потом иметь какую-нибудь кнопку, по которой можно было бы прыгнуть обратно. Что-то вроде "Undo". Потому как в том виде, в каком оно сейчас, кнопки Alt+Down и Alt+Up не являются "взаимонейтрализующими". А хотелось бы иметь возможность быстро подняться в исходное место, если увидел, что "провалился" не туда (или, может, точнее было бы "выбрал неправильную исходную точку для проваливания").

User avatar
HaRT
Moderator
Posts: 9083
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 90 times
Been thanked: 157 times

Как провалиться в первую непустую вложенную папку?

Post by HaRT » Sat 10 Mar, 2018 03:22

 ! Message from: HaRT
fml2 wrote:
Thu 08 Mar, 2018 23:38
Думаю, что это "обсуждение" можно стереть.
Я просто склеил в одно.
Фар есть инструмент, а не нянька. © 2009 DrKnS

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Как провалиться в первую непустую вложенную папку?

Post by fml2 » Sat 10 Mar, 2018 14:23

fml2 wrote:
Fri 09 Mar, 2018 22:23
А нельзя ли как-нибудь сделать так, чтобы перед "спусканием" макрос запоминал, откуда производится спуск, и потом иметь какую-нибудь кнопку, по которой можно было бы прыгнуть обратно.
Может, как-то так можно: перед спуском запоминать (в settings? ведь макросы не имеют состояния, правильно?), откуда начинается спуск, а в другом макросе (Alt+Up) проверять, находимся ли мы в одном из подкаталогов запомненного каталога, и, если да, то возвращаться в него.

Shmuel
Posts: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

Как провалиться в первую непустую вложенную папку?

Post by Shmuel » Sat 10 Mar, 2018 15:27

Макросы могут иметь состояние. Вот пример:

Code: Select all

local last_dir
Macro {
  ......
  action=function()
    if last_dir .... then
    ..............
    last_dir = ....
    ..............
  end;
}

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Как провалиться в первую непустую вложенную папку?

Post by fml2 » Sat 10 Mar, 2018 23:27

Написал вот пару "взаимно нейтрализующих" макросов (один спускается, другой поднимается в исходное место) -- см. прикрепленный файл. Внутри панелей плагинов "подъем", похоже, не работает.
Attachments
DescendToFirstNonTrivialFolder.lua
Текст макросов
(1.19 KiB) Downloaded 138 times

Shmuel
Posts: 5896
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 217 times

Как провалиться в первую непустую вложенную папку?

Post by Shmuel » Sun 11 Mar, 2018 05:55

fml2, не используйте функции библиотеки string - она не юникодная.
Вместо string.len(srcPath) должно быть srcPath:len(), аналогично заменить string.sub(APanel.Path) на APanel.Path:sub().

siberia-man
Posts: 98
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Как провалиться в первую непустую вложенную папку?

Post by siberia-man » Sun 11 Mar, 2018 08:00

fml2 wrote:
Sat 10 Mar, 2018 23:27
пару "взаимно нейтрализующих" макросов
Спрошу, не вдаваясь в подробности Ваших макросов. Возможно Вы уже предусмотрели это. Макросы учитывают "неожиданный" переход в другой кактлог после спуска? Например, пользователь сделал "Descend to the first non-trivial subdirectory", а потом перешел в совершенно другой каталог. Как отреагирует макрос "Undo the last Descend" на такое изменение системы?
Last edited by siberia-man on Sun 11 Mar, 2018 08:01, edited 1 time in total.

fml2
Posts: 518
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

Как провалиться в первую непустую вложенную папку?

Post by fml2 » Sun 11 Mar, 2018 10:09

Shmuel wrote:
Sun 11 Mar, 2018 05:55
fml2, не используйте функции библиотеки string - она не юникодная.
Спасибо за замечание, подправил. Подправленный вариант -- в довеске.
siberia-man wrote:
Sun 11 Mar, 2018 08:00
Макросы учитывают "неожиданный" переход в другой кактлог после спуска?
Да. Если текущий каталог не находится внутри того каталога, откуда был произведен спуск, то ничего не происходит.
Attachments
DescendToFirstNonTrivialFolder.lua
(1.61 KiB) Downloaded 148 times
Last edited by fml2 on Thu 15 Mar, 2018 09:47, edited 2 times in total.

Post Reply

Return to “Нужна помощь”