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

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

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

Post by nimdamsk »

Всем добра.

Когда лазишь по Java-проекту на диске (только не спрашивайте зачем это делать в Far-е) жутко надоедает необходимость много раз жать "вниз+Enter", пока доберёшься до рабочих файлов. Можно это как-то автоматизировать? Т.е. по нажатию сочетания клавиш проваливаться в первую папку, в которой есть файл или другая папка. Куда копать?
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

в макросы.
nimdamsk
Posts: 19
Joined: Thu 22 Oct, 2009 12:10
Has thanked: 1 time

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

Post by nimdamsk »

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

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

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: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

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: 19
Joined: Thu 22 Oct, 2009 12:10
Has thanked: 1 time

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

Post by nimdamsk »

За 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: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

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

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

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

Пример. Предположим, имеется следующая структура каталогов, и курсор в активной панели стоит на 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: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

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

Думаю, что это "обсуждение" можно стереть.
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

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: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

 ! Message from: HaRT
fml2 wrote: Thu 08 Mar, 2018 23:38 Думаю, что это "обсуждение" можно стереть.
Я просто склеил в одно.
Фар есть инструмент, а не нянька. © 2009 DrKnS
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

fml2 wrote: Fri 09 Mar, 2018 22:23А нельзя ли как-нибудь сделать так, чтобы перед "спусканием" макрос запоминал, откуда производится спуск, и потом иметь какую-нибудь кнопку, по которой можно было бы прыгнуть обратно.
Может, как-то так можно: перед спуском запоминать (в settings? ведь макросы не имеют состояния, правильно?), откуда начинается спуск, а в другом макросе (Alt+Up) проверять, находимся ли мы в одном из подкаталогов запомненного каталога, и, если да, то возвращаться в него.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

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

Code: Select all

local last_dir
Macro {
  ......
  action=function()
    if last_dir .... then
    ..............
    last_dir = ....
    ..............
  end;
}
fml2
Posts: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

Написал вот пару "взаимно нейтрализующих" макросов (один спускается, другой поднимается в исходное место) -- см. прикрепленный файл. Внутри панелей плагинов "подъем", похоже, не работает.
Attachments
DescendToFirstNonTrivialFolder.lua
Текст макросов
(1.19 KiB) Downloaded 160 times
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

fml2, не используйте функции библиотеки string - она не юникодная.
Вместо string.len(srcPath) должно быть srcPath:len(), аналогично заменить string.sub(APanel.Path) на APanel.Path:sub().
siberia-man
Posts: 131
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 2 times
Been thanked: 9 times

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

Post by siberia-man »

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: 534
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 2 times
Been thanked: 8 times

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

Post by fml2 »

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

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