Восстановление файлового фильтра: добавить расширение

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Восстановление файлового фильтра: добавить расширение

Post by buniak_a_h »

Здравствуйте! Проблема следующая.
Допустим, в папке панели имеются файлы qqq.001, qqq.002, 111.003.
Настраиваем фильтр, чтоб были видны только файлы *.001
Затем переходим в другую папку с файлами qqq.aaa, qqq.bbb, qqq.ccc. Вызываем диалог установки фильтра; там в списке типов файлов, кроме *.aaa, *.bbb и *.ccc имеется отмеченное ранее, но отсутствующее в папке расширение *.001.
Теперь я делаю макрос, запоминающий активный фильтр и восстанавливающий его. При этом папка,в которой фильтр восстанавливается, может не совпадать с той, в которой фильтр сохранялся. Отметить имеющиеся расширения у меня получается, а вот добавить в список отсутствующее в нынешней папке расширение, чтобы отметить его - нет. Точнее, добавить легко, но при выходе из диалога настройки фильтров FAR падает с сообщением
╔══════════════════════════ Exception occurred ══════════════════════════╗ ║ Exception: 0xC0000005 - EXCEPTION_ACCESS_VIOLATION ║ ║ Details: Memory at 0000000000000018 could not be read ║ ║ errno: 0x00000000 - No error ║ ║ LastError: 0x00000000 - Операция успешно завершена. ║ ║ NTSTATUS: 0xC0000034 - Объект с указанным именем не найден. ║ ║ Address: 0x00103069 - Far.exe!<unknown> (get the pdb) ║ ║ Function: main ║ ║ Source: ║ ║ File: E:\Far.Test\Far.exe ║ ║ Plugin: ║ ║ Far: 3.0.5730.0 x64 (6c8f15a) ║ ║ OS: 10.0.19041.2.0.0.256.1 (version 2004, OS build 19041.746) ║ ║ Kernel: 10.0.19041.746 (WinBuild.160101.0800) ║
Я так понимаю, что я делаю некорректные действия: меняю данные прямо в диалоге.
Вопрос следующий: есть ли корректный способ решения указанной проблемы (кроме как через временную панель; до такого способа я додумался, но это как-то пер-анально…)? Додумался я также до добавления именованного фильтра, содержащего список масок. Но это - не менее проктологично, чем через временную панель
P/S. Если кого-то интересует данная задачка, могу опубликовать скрипты сохранения/восстановления файлового фильтра. Сейчас это ~120 строк LUA-кода.
Last edited by buniak_a_h on Fri 22 Jan, 2021 20:45, edited 1 time in total.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Восстановление файлового фильтра: добавить расширение

Post by John Doe »

buniak_a_h wrote: Fri 22 Jan, 2021 20:42 Вопрос следующий: есть ли корректный способ решения указанной проблемы
Нет
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Восстановление файлового фильтра: добавить расширение

Post by citRiks »

buniak_a_h wrote: Fri 22 Jan, 2021 20:42 Если кого-то интересует данная задачка, могу опубликовать скрипты сохранения/восстановления файлового фильтра. Сейчас это ~120 строк LUA-кода.
интересует :) и будет падать с этой ошибкой?
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Восстановление файлового фильтра: добавить расширение

Post by citRiks »

а есть ли какая-то логика в "падать при задании раширения, если этого раширения в текущей директории нет" ?
если же нету, то может быть починить в ФАРе ?
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Восстановление файлового фильтра: добавить расширение

Post by buniak_a_h »

citRiks wrote: Sat 23 Jan, 2021 22:40
buniak_a_h wrote: Fri 22 Jan, 2021 20:42 Если кого-то интересует данная задачка, могу опубликовать скрипты сохранения/восстановления файлового фильтра. Сейчас это ~120 строк LUA-кода.
интересует :) и будет падать с этой ошибкой?
Для падения сделал такой макрос:
  1. local F = far.Flags
  2.  
  3. Macro{
  4.  
  5.   id="BB0FDE00-BF26-4271-899C-33ABCBA5FC3C";
  6.  
  7.   area="Menu";
  8.  
  9.   key="Ctrl=";
  10.  
  11.   description="добавить в меню";
  12.  
  13.   flags="";
  14.  
  15.   condition=function(key, data)
  16.  
  17.    return Menu.Id == far.Guids.FiltersMenuId
  18.  
  19.   end;
  20.  
  21.   action=function(data)
  22.  
  23.    local hDlg,CurPos = far.AdvControl("ACTL_GETWINDOWINFO").Id, 1
  24.  
  25.    local LastStr = Menu.GetValue(Object.ItemCount)
  26.  
  27.    local NewStr = LastStr:gsub("^%w%.(.*│%s*)(.-)$", '  %1*.pdf') -- *.pdf - только для удобства тестирования (в одних папках есть, в других - нету).
  28.  
  29.    hDlg:send(F.DM_LISTADDSTR, CurPos, NewStr)
  30.  
  31.   end;
  32.  
  33. }
Строка добавляется, и всё нормально, если не попробовать отметить пункт (даже если отметить, а потом снять).
На самом деле всё естественно: видимо, перед показом МЕНЮ формируются внутренние структуры, их размер/количество определяются до показа МЕНЮ. При добавлении строки само меню растёт, а внутренние структуры не меняются. В результате при закрытии диалога происходит чтение в отсутствующий элемент.
citRiks wrote: Sat 23 Jan, 2021 22:43 а есть ли какая-то логика в "падать при задании расширения, если этого расширения в текущей директории нет" ?
если же нету, то может быть починить в ФАРе ?
Вопрос родственный тому, чтобы доделать интерфейс управления файловыми фильтрами на базе АПИ вместо keystrokes. Видимо, изначально при проектировании этой части ФАРа заложены были неправильные решения; иначе не объяснить, например, использования keystrokes в скрипте Автофильтр от John Doe и некоторые другие.
Last edited by buniak_a_h on Sun 24 Jan, 2021 04:16, edited 2 times in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Восстановление файлового фильтра: добавить расширение

Post by buniak_a_h »

citRiks,
P/S.
1. Падение происходит не из-за добавления отсутствующего расширения, а просто при добавлении строки в меню.
2. Собственно сохранение-восстановление фильтров я сделал (через временную панель), но у меня это - часть более объёмной задачи сохранения/восстановления именованного контекста, включая папки, фильтры, режимы и сортировки, в также открытые в редакторе и во вьюере файлы. Этого мне очень не хватает. Если собственно сохранение-восстановление именно фильтров интересует, напишите - я дооформлю и выложу в форум обсуждения скриптов.
PP/S. Пришла в голову мысль, что на этой же основе можно сделать добавление произвольных расширений в фильтр
Last edited by buniak_a_h on Sun 24 Jan, 2021 04:20, edited 1 time in total.
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

Восстановление файлового фильтра: добавить расширение

Post by citRiks »

buniak_a_h wrote: Sun 24 Jan, 2021 04:13 Если собственно сохранение-восстановление именно фильтров интересует, напишите - я дооформлю и выложу в форум обсуждения скриптов.
Да, спасибо
buniak_a_h wrote: Sun 24 Jan, 2021 04:04 Вопрос родственный тому, чтобы доделать интерфейс управления файловыми фильтрами на базе АПИ вместо keystrokes
да, старая больная, и странная тема.
Так, все.
Перечислю 1000$ тому если кто сделает эту фунцкиональность в официальном ФАРе
А то хоть самому Сишником становись, а это вырванные из жизни годы.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Восстановление файлового фильтра: добавить расширение

Post by buniak_a_h »

citRiks wrote: Sun 24 Jan, 2021 09:45
buniak_a_h wrote: Sun 24 Jan, 2021 04:13 Если собственно сохранение-восстановление именно фильтров интересует, напишите - я дооформлю и выложу в форум обсуждения скриптов.
Да, спасибо
См. тут
Post Reply

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