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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
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: 5302
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 47 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: 8105
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 103 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: viewtopic.php?p=137619#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 лет использования :)

Post Reply

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