Page 1 of 1

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

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
Поковырялся немного. Хотя нет, много ковырялся, но сделал что нужно.

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

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

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

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

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

Posted: Wed 14 Dec, 2016 23:09
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.

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

Posted: Thu 15 Dec, 2016 00:43
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 лет использования :)

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

Posted: Thu 08 Mar, 2018 23:24
by fml2
Здравствуйте.

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

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

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

Code: Select all

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

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

Заранее спасибо.

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

Posted: Thu 08 Mar, 2018 23:38
by fml2
А, нашел! viewtopic.php?f=57&t=10578

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

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

Posted: Fri 09 Mar, 2018 22:23
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 не являются "взаимонейтрализующими". А хотелось бы иметь возможность быстро подняться в исходное место, если увидел, что "провалился" не туда (или, может, точнее было бы "выбрал неправильную исходную точку для проваливания").

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

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) проверять, находимся ли мы в одном из подкаталогов запомненного каталога, и, если да, то возвращаться в него.

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

Posted: Sat 10 Mar, 2018 15:27
by Shmuel
Макросы могут иметь состояние. Вот пример:

Code: Select all

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:55
fml2, не используйте функции библиотеки string - она не юникодная.
Спасибо за замечание, подправил. Подправленный вариант -- в довеске.
siberia-man wrote:
Sun 11 Mar, 2018 08:00
Макросы учитывают "неожиданный" переход в другой кактлог после спуска?
Да. Если текущий каталог не находится внутри того каталога, откуда был произведен спуск, то ничего не происходит.