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

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

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

Postby nimdamsk » Wed 14 Dec, 2016 10:45

Всем добра.

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

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

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

Postby zg » Wed 14 Dec, 2016 11:32

в макросы.

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

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

Postby 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: 7954
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 66 times
Been thanked: 97 times

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

Postby HaRT » Wed 14 Dec, 2016 23:09

nimdamsk wrote:Source of the post Если я что-то наговнокодил - прошу показать.
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: HaRT @ Меню со списком родительских папок (CD up).
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

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

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


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

Who is online

Users browsing this forum: No registered users and 1 guest