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

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

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

Post by Shmuel »

Latest post of the previous page:

DV wrote:Портировал ли кто этот (или подобный) макрос под FAR3?
Только что, конвертером.

Shmuel
Posts: 6139
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 31 times
Been thanked: 317 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: 9446
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 106 times
Been thanked: 223 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: 103
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 5 times

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

Post by siberia-man »

Еще один вариант макроса. Причины написания:
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: 9446
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 106 times
Been thanked: 223 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: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 290 times

Меню со списком родительских папок (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: 9446
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 106 times
Been thanked: 223 times

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

Post by HaRT »

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

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

Меню со списком родительских папок (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 64 times

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

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

Post by HaRT »

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

Post Reply

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