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

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

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

Post by Shmuel »

Latest post of the previous page:

DV wrote:Портировал ли кто этот (или подобный) макрос под FAR3?
Только что, конвертером.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

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

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

Post by HaRT »

Представляю на суд общественности свой вариант, сделанный на основе выложенного в шапке.
Отличия:
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: 131
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 2 times
Been thanked: 9 times

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

Post by siberia-man »

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

Первое решается легко, а вот второе - трудоемеко и лениво: надо отрисовывать пункты меню с учетом вложенности каждого элемента. Оставляю идею здесь. Возможно, кто-то подхватит и реализует.
  1.  
  2.  
  3. -- https://forum.farmanager.com/viewtopic.php?p=149194#p149194
  4.  
  5.  
  6.  
  7. ---------------------------------------------------------------------------
  8.  
  9.  
  10.  
  11. local FARPANEL_BRODER_WIDTH_LEFT = 1
  12.  
  13. local FARPANEL_BRODER_WIDTH_RIGHT = 1
  14.  
  15.  
  16.  
  17. local FARMENU_BORDER_WIDTH_LEFT = 5
  18.  
  19. local FARMENU_BORDER_WIDTH_RIGHT = 6
  20.  
  21.  
  22.  
  23. ---------------------------------------------------------------------------
  24.  
  25.  
  26.  
  27. local OMIT = "..."
  28.  
  29. local oLen = string.len(OMIT)
  30.  
  31.  
  32.  
  33. function string.shrink(s, width)
  34.  
  35.     local sLen = string.len(s)
  36.  
  37.     return sLen <= width and s or OMIT .. string.sub(s, sLen - width + oLen + 1)
  38.  
  39. end
  40.  
  41.  
  42.  
  43. ---------------------------------------------------------------------------
  44.  
  45.  
  46.  
  47. local function FillTable(t, path, width)
  48.  
  49.     local pLen = string.len(path)
  50.  
  51.     local pos = 0
  52.  
  53.  
  54.  
  55.     repeat
  56.  
  57.         pos = string.find(path, "\\", pos + 1, true)
  58.  
  59.  
  60.  
  61.         local s = string.sub(path, 1, pos and pos or pLen)
  62.  
  63.         if s == "" then s = "\\" end
  64.  
  65.  
  66.  
  67.         local sLen = string.len(s)
  68.  
  69.         table.insert(t, {
  70.  
  71.             path = s;
  72.  
  73.             text = string.shrink(s, width);
  74.  
  75.         })
  76.  
  77.     until not pos or pos >= pLen
  78.  
  79. end
  80.  
  81.  
  82.  
  83. ---------------------------------------------------------------------------
  84.  
  85.  
  86.  
  87. local function ShowMenu()
  88.  
  89.     local items = {}
  90.  
  91.  
  92.  
  93.     -- max width for the menu items
  94.  
  95.     local width = APanel.Width - FARMENU_BORDER_WIDTH_LEFT - FARMENU_BORDER_WIDTH_RIGHT
  96.  
  97.  
  98.  
  99.     FillTable(items, APanel.Path0, width)
  100.  
  101.  
  102.  
  103.     if APanel.Plugin then
  104.  
  105.         table.insert(items, { separator = true })
  106.  
  107.         FillTable(items, APanel.Path, width)
  108.  
  109.     end
  110.  
  111.  
  112.  
  113.     local item = far.Menu({
  114.  
  115.         Title = "Go to...";
  116.  
  117.         SelectIndex = #items;
  118.  
  119.         -- Fit the menu into the width of the active panel taking into account the border widths
  120.  
  121.         X = ( APanel.Left and 0 or PPanel.Width ) + FARPANEL_BRODER_WIDTH_LEFT + FARPANEL_BRODER_WIDTH_RIGHT;
  122.  
  123.     }, items)
  124.  
  125.  
  126.  
  127.     if item then Panel.SetPath(0, item.path) end
  128.  
  129. end
  130.  
  131.  
  132.  
  133. ---------------------------------------------------------------------------
  134.  
  135.  
  136.  
  137. if Macro == nil then
  138.  
  139.     ShowMenu()
  140.  
  141.     return
  142.  
  143. end
  144.  
  145.  
  146.  
  147. Macro {
  148.  
  149.     description = "Shell: Cd Up (Light)";
  150.  
  151.     area = "Shell";
  152.  
  153.     key = "AltPgUp";
  154.  
  155.     --condition = function() return APanel.Visible end;
  156.  
  157.     action = ShowMenu;
  158.  
  159. }
  160.  
  161.  
  162.  
  163. ---------------------------------------------------------------------------
  164.  
  165.  
  166.  
  167. -- EOF
Last edited by siberia-man on Fri 20 Apr, 2018 19:41, edited 1 time in total.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

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

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

Пока нет поддержки для плагиновых панелей, где разделитель не \, например, NetBox.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

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

Post by HaRT »

John Doe wrote: Fri 16 Nov, 2018 13:23 Идея: псевдодерево
Если/когда кто-то соберётся это делать, можно параметризовать 2 символами: └┌. Если строка пустая, значит без псевдодерева; если задан только один (например, +), он используется в обоих случаях.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

можно параметризовать 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 155 times
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

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

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