Меню со списком родительских папок (CD up)

Здесь выкладываются готовые к использованию макросы и скрипты.
Shmuel
Posts: 5897
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 218 times

Re: Меню со списком родительских папок (CD up)

Post by Shmuel » Sun 15 Dec, 2013 18:28

Latest post of the previous page:

DV wrote:Портировал ли кто этот (или подобный) макрос под FAR3?
Независимая реализация той же функциональности + выравнивание по правому краю слишком длинных пунктов меню:

Примечание модератора:
Код макроса перенесён в шапку темы.
Last edited by Shmuel on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Edit

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

Меню со списком родительских папок (CD up)

Post by HaRT » Mon 09 May, 2016 21:05

Представляю на суд общественности свой вариант, сделанный на основе выложенного в шапке.
Отличия:
1. Добавлены горячие клавиши от 0 до Z, далее просто выравнивание пробелами.
2. Выбор элемента означает не переход в директорию, а переход на директорию — об этом напоминает отсутствие разделителя (‘\’) на концах путей.
3. При попытке перехода на саму букву диска открывается меню дисков.
4. Макрос назначен на AltPgUp.
Last edited by HaRT on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Опубликована версия 2016.05.10.1; изменения смотри в начале исходного кода (по-английски).
Фар есть инструмент, а не нянька. © 2009 DrKnS

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

Меню со списком родительских папок (CD up)

Post by siberia-man » Fri 20 Apr, 2018 19:41

Еще один вариант макроса. Причины написания:
1. Во всех предыдущих реализациях список "перевернут" - вершина дерева директорий расположена снизу
2. Было желание расширить функционал макроса функционалом дерева каталогов (примерно так как это сделано в Проводнике или Редакторе реестра)

Первое решается легко, а вот второе - трудоемеко и лениво: надо отрисовывать пункты меню с учетом вложенности каждого элемента. Оставляю идею здесь. Возможно, кто-то подхватит и реализует.
  1.  
  2. -- https://forum.farmanager.com/viewtopic.php?p=149194#p149194
  3.  
  4. ---------------------------------------------------------------------------
  5.  
  6. local FARPANEL_BRODER_WIDTH_LEFT = 1
  7. local FARPANEL_BRODER_WIDTH_RIGHT = 1
  8.  
  9. local FARMENU_BORDER_WIDTH_LEFT = 5
  10. local FARMENU_BORDER_WIDTH_RIGHT = 6
  11.  
  12. ---------------------------------------------------------------------------
  13.  
  14. local OMIT = "..."
  15. local oLen = string.len(OMIT)
  16.  
  17. function string.shrink(s, width)
  18.     local sLen = string.len(s)
  19.     return sLen <= width and s or OMIT .. string.sub(s, sLen - width + oLen + 1)
  20. end
  21.  
  22. ---------------------------------------------------------------------------
  23.  
  24. local function FillTable(t, path, width)
  25.     local pLen = string.len(path)
  26.     local pos = 0
  27.  
  28.     repeat
  29.         pos = string.find(path, "\\", pos + 1, true)
  30.  
  31.         local s = string.sub(path, 1, pos and pos or pLen)
  32.         if s == "" then s = "\\" end
  33.  
  34.         local sLen = string.len(s)
  35.         table.insert(t, {
  36.             path = s;
  37.             text = string.shrink(s, width);
  38.         })
  39.     until not pos or pos >= pLen
  40. end
  41.  
  42. ---------------------------------------------------------------------------
  43.  
  44. local function ShowMenu()
  45.     local items = {}
  46.  
  47.     -- max width for the menu items
  48.     local width = APanel.Width - FARMENU_BORDER_WIDTH_LEFT - FARMENU_BORDER_WIDTH_RIGHT
  49.  
  50.     FillTable(items, APanel.Path0, width)
  51.  
  52.     if APanel.Plugin then
  53.         table.insert(items, { separator = true })
  54.         FillTable(items, APanel.Path, width)
  55.     end
  56.  
  57.     local item = far.Menu({
  58.         Title = "Go to...";
  59.         SelectIndex = #items;
  60.         -- Fit the menu into the width of the active panel taking into account the border widths
  61.         X = ( APanel.Left and 0 or PPanel.Width ) + FARPANEL_BRODER_WIDTH_LEFT + FARPANEL_BRODER_WIDTH_RIGHT;
  62.     }, items)
  63.  
  64.     if item then Panel.SetPath(0, item.path) end
  65. end
  66.  
  67. ---------------------------------------------------------------------------
  68.  
  69. if Macro == nil then
  70.     ShowMenu()
  71.     return
  72. end
  73.  
  74. Macro {
  75.     description = "Shell: Cd Up (Light)";
  76.     area = "Shell";
  77.     key = "AltPgUp";
  78.     --condition = function() return APanel.Visible end;
  79.     action = ShowMenu;
  80. }
  81.  
  82. ---------------------------------------------------------------------------
  83.  
  84. -- EOF
Last edited by siberia-man on Fri 20 Apr, 2018 19:41, edited 1 time in total.

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

Меню со списком родительских папок (CD up)

Post by HaRT » Fri 20 Apr, 2018 20:51

Ха, оказывается, я забыл тогда выложить свою обновлённую версию, где к корню диска движемся вверх (и это включено по умолчанию).

Отличия от версии 2016.05.10.1:
1. Добавлена опция, чтобы отображать только последний компонент пути. По умолчанию ВКЛ.
2. Добавлена опция, чтобы отображать директории от корня диска к текущей сверху вниз. По умолчанию ВКЛ.
3. Меню присвоен GUID.
4. Добавлена возможность перехода на выбранный элемент на пассивную панель по ShiftEnter. Это реализовано только для путей в настоящей ФС (в противоположность «виртуальным» ФС, эмулируемым панельными плагинами).
5. Документация: добавлены TODO (см. исходник ниже).
6. Внутренне: улучшена декомпозиция кода, удалён ненужный код, добавлена диагностика.

Пока нет поддержки для плагиновых панелей, где разделитель не \, например, NetBox.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 12457
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 188 times

Меню со списком родительских папок (CD up)

Post by John Doe » Fri 16 Nov, 2018 13:23

HaRT wrote:
Fri 20 Apr, 2018 20:51
1. Добавлена опция, чтобы отображать только последний компонент пути.
Идея: псевдодерево

Code: Select all

╔═════════ Go up to ... ═════════╗
║  e G:                          ║
║  d └Public                     ║
║  c  └Software                  ║
║  b   └Shells                   ║
║  a    └Far                     ║
╟────────────────────────────────╢
║  9 Far30b5193.x86.20180416.msi ║
...
╚═════════ Shift-/Enter ═════════╝

Code: Select all

╔═════════ Go up to ... ═════════╗
║  a    ┌Far                     ║
║  b   ┌Shells                   ║
║  c  ┌Software                  ║
║  d ┌Public                     ║
║  e G:                          ║
╟────────────────────────────────╢
║  9 Far30b5193.x86.20180416.msi ║
...
╚═════════ Shift-/Enter ═════════╝

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

Меню со списком родительских папок (CD up)

Post by HaRT » Fri 16 Nov, 2018 13:32

John Doe wrote:
Fri 16 Nov, 2018 13:23
Идея: псевдодерево
Если/когда кто-то соберётся это делать, можно параметризовать 2 символами: └┌. Если строка пустая, значит без псевдодерева; если задан только один (например, +), он используется в обоих случаях.
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
John Doe
Бюрократ
Posts: 12457
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 188 times

Меню со списком родительских папок (CD up)

Post by John Doe » Fri 16 Nov, 2018 13:58

можно параметризовать 2 символами:
Символ ведь зависит от displayDirsRootToCurrent.
HaRT wrote:
Fri 16 Nov, 2018 13:32
Если/когда кто-то соберётся это делать,
Очень быстрый хак:

Code: Select all

local symbol = Options.displayDirsRootToCurrent and "└" or "┌"
local function attachText( v )
    --...skipped...--
    local level = select(2,v.path:gsub("\\","\\"))
    local branch = level==0 and "" or (" "):rep(level-1)..symbol
    v.text = '&' .. v.hotkey .. ' ' .. branch .. path
  end
end
Attachments
Shell_Go-Up.lua
(5.77 KiB) Downloaded 51 times

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

Меню со списком родительских папок (CD up)

Post by HaRT » Fri 16 Nov, 2018 14:18

John Doe wrote:
Fri 16 Nov, 2018 13:58
можно параметризовать 2 символами:
Символ ведь зависит от displayDirsRootToCurrent.
Именно поэтому я и веду речь про два символа, а не про один. А если они не заданы, то и псевдодерево не надо выводить.
Фар есть инструмент, а не нянька. © 2009 DrKnS

Post Reply

Return to “Полезные макросы и скрипты”