Показывать также искомую строку в заголовке результатов поиска по файлам

Здесь обсуждается всё, что касается макросов.
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 »

fml2 wrote: Tue 26 Jun, 2018 22:44 Если произвести поиск по файлам (Alt+F7), то в заголовке окна с результатами поиска высвечивается маска имени файлов, в которых был произведен поиск. Мне кажется, было бы неплохо показывать еще и строку поиска (или хотя бы ее начало, если она слишком длинная), если она была задана.
fml2, сделал небольшой скрипт, вставляющий строку поиска в заголовок рамки окна с результатами поиска. Некоторые ограничения скрипта:
1. Не обрабатываю языковые настройки (ищу заголовок по маске ^Find file: )
2. Не учитываю размеры окна (что будет, если искомая строка длиннее ширины окна - я не экспериментировал).


Этот вариант скрипта работает только при включённой истории диалогов. (Far.GetConfig('Dialog.EditHistory')). В принципе, есть вариант скрипта и для выключенной истории, но он кардинально сложнее. Если найдётся кто, выключивший историю диалогов и желающий иметь этот сервис - пишите. На смом деле пример "обхода" этого ограничения можно увидеть здесь
AltF7.SearchStr.lua.7z
(755 Bytes) Downloaded 74 times
Last edited by HaRT on Wed 04 Dec, 2019 23:46, edited 4 times in total.
Reason: Укорочен заголовок Темы
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 »

Есть рекомендации по стилю, если не возражаете (содержательно не смотрел пока).

Вместо того чтобы при обработке каждого события конвертировать id диалога в строку, рациональнее наоборот поступить - однократно конвертировать строку в бинарное представление.
Для строк удобно (и наглядно) пользоваться константами far.Guids.
Вложенные таблицы (при многократном использовании) лучше сохранять в локальных переменных, это и нагляднее, и даже несколько ускоряет выполнение (local F = far.Flags).
condition при пустом action в определении Event смысла не имеет (лучше перенести код в action).
Операцию aItem = aDlg.hDlg:send(far.Flags.DM_GETDLGITEM, iItem) достаточно выполнять в одном месте кода (после while).
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 »

John Doe wrote: Fri 26 Oct, 2018 07:43 Вместо того чтобы при обработке каждого события конвертировать id диалога в строку рациональнее наоборот поступить - однократно конвертировать строку в бинарное представление.
Спасибо, принято. Хотя есть некая странность: для первого диалога (FindFileID) его Id можно получить просто по Dlg.Id (и при этом он получается в строчном виде). А вот для второго диалога (FindFileResultId) Dlg.Id содержит пустую строку; пришлось вызывать DM_GetDlgInfo и вытаскивать оттуда. При этом у меня есть макрос, показывающий именно Dlg.Id; так вот он показывает Id-ы обоих диалогов правильно. Я так и не понял - я на баг наткнулся, или так и должно быть.
John Doe wrote: Fri 26 Oct, 2018 07:43 Для строк удобно (и наглядно) пользоваться константами far.Guids.
Спасибо.
John Doe wrote: Fri 26 Oct, 2018 07:43 Вложенные таблицы (при многократном использовании) лучше сохранять в локальных переменных, это и нагляднее, и даже несколько ускоряет выполнение (local F = far.Flags).
Да, я в курсе. Забыл заменить
John Doe wrote: Fri 26 Oct, 2018 07:43 condition при пустом action в определении Event смысла не имеет (лучше перенести код в action).
Ну, получилось так, что тут - имеет. Единственной функцией Action был бы поиск элемента диалога DI_EDIT и получение его текста. А это уже сделано в condition (при проверке, что это поле заполнено). Перенести эту проверку в action было бы неправильным: тогда этот обработчик экранировал бы собой что-то другое (если б захотелось написать). Вот и получилось, что в condition проверка объединена с запоминанием данных.
Кстати, может подскажете... Не нашёл способа получить последнюю запись из истории. Если б использовать такое, то один из обработчиков (FindFileId) стал бы не нужен.
John Doe wrote: Fri 26 Oct, 2018 07:43 Операцию aItem = aDlg.hDlg:send(far.Flags.DM_GETDLGITEM, iItem) достаточно выполнять в одном месте кода (после while).
Это я тоже знаю. С единственной поправкой: придётся while заменить на repeat. А я просто очень не люблю цикл repeat intil. С детства...
Last edited by buniak_a_h on Wed 04 Dec, 2019 23:32, 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 26 Oct, 2018 08:45 Я так и не понял - я на баг наткнулся, или так и должно быть.
Макро-свойства вводились без расчёта на то, что их будут пытаться получить из обработчиков событий, и я бы порекомендовал этого избегать по-возможности.

Т.е. врядли это можно назвать багом, но если вы напишите на мантис, то не исключено, что функциональность будет доработана.
buniak_a_h wrote: Fri 26 Oct, 2018 08:45Перенести эту проверку в action было бы неправильным: тогда этот обработчик экранировал бы собой что-то другое (если б захотелось написать).
Нет, обработчики событий устроены иначе: выполняется все подряд, если только action явно не вернёт значение, о котором в документации сказано иное.
buniak_a_h wrote: Fri 26 Oct, 2018 08:45 Кстати, может подскажете... Не нашёл способа получить последнюю запись из истории.
Его можно получить из db, но имхо не стоит.
buniak_a_h wrote: Fri 26 Oct, 2018 08:45 С единственной поправкой: придётся while заменить на repeat
Ну... Можно обойтись и while, если сначала присвоить фиксированное истинное значение.

И ещё одно замечание: при обработке событий имеет значение очерёдность проверки условий.
Рациональнее сначала отсеивать самые простые, не требующие вычислений.
Обратите внимание на то, что s:match('%S') это относительно ресурсоёмкая операция (хотя возможно получение id ещё тяжеловеснее).
Как-то так:

Code: Select all

 condition   = function(par1, aDlg)
   if aDlg.Msg == F.DN_INITDIALOG and par1==F.DE_DLGPROCINIT then
     local id = aDlg.hDlg:send(F.DM_GETDIALOGINFO)
     return id and id.Id==FindFileResultId and s:match('%S')
   end
  end;
(Убрал тут заодно и лишние скобки)
Last edited by John Doe on Fri 26 Oct, 2018 09:12, edited 1 time 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 »

John Doe wrote: Fri 26 Oct, 2018 09:09 Ну... Можно обойтись и while, если сначала присвоить фиксированное истинное значение.
На самом деле такой код, как у меня, хотя и включает вызов функции дважды, но (а) выполняет его (и вообще присваивание) один раз и (б) проверяет результат тоже один раз. А и то, что Вы советуете, и цикл repeat until потребуют проверки aItem дважды. Ну, или вставлять break, что не гут, если можно обойтись.
Т.о. либо я не понял, что Вы советуете, либо такой вариант (с двумя вызовами) скорострельнее.
John Doe wrote: Fri 26 Oct, 2018 09:09 (Убрал тут заодно и лишние скобки)
К лишним скобкам приучил идиотский паскаль, извините.
John Doe wrote: Fri 26 Oct, 2018 09:09 s:match('%S') это относительно ресурсоёмкая операция
На самом деле надо тупо сравнивать с пустой строкой (а лучше - с nil-ом) . Потому что поиск строки из пробелов тоже имеет смысл. Переделаю, как будет время
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 »

Code: Select all

local FindFileResultId=win.Uuid(far.Guids.FindFileResultId) -- 536754EB-C2D1-4626-933F-A25D1E1D110A
Тут я бы изменил имя переменной, чтобы отразить её изменённый характер, например FindFileResult_id, FindFileResult_guid, FindFileResultId_bin.
buniak_a_h wrote: Fri 26 Oct, 2018 10:08 Т.о. либо я не понял, что Вы советуете, либо такой вариант (с двумя вызовами) скорострельнее.
Различий в скорости тут ожидать не следует.
И я наверно пока ничего тут не буду советовать, потому что на первый взгляд вообще не понимаю зачем тут цикл.
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 »

John Doe wrote: Fri 26 Oct, 2018 10:25 не понимаю зачем тут цикл.
В одном макросе ищу поле ввода строки. Исхожу из того, что: (а) авторы вполне могут поменять порядок элементов диалога (в т.ч. и добавить); (б) имя истории не изменится (иначе история поиска пропадёт). Соответственно ищу DI_EDIT с History="SearchText"
В другом макросе ищу рамку. Опять же не могу быть уверенным, что элемент DI_DOUBLEBOX будет первым (хотя скорее всего так и есть). А главное - что он единственный. Поэтому коме типа элемента проверяю его текст. Тут, правда, засада: зависит от языка, а получить строку из языкового файла по far.GetMsg() у меня не получилось (строка ищется в каком-то другом файле. Да и номер - это немного не то, что нужно).
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 26 Oct, 2018 10:41 Исхожу из того, что: (а) авторы вполне могут поменять порядок элементов диалога
Справедливо.
Но у нас же скрипт, который легко будет в этом редком случае поправить, поэтому я бы предпочёл всё упростить.

Code: Select all

local F = far.Flags
local FindFileId_id = win.Uuid(far.Guids.FindFileId)
local FindFileResult_id = win.Uuid(far.Guids.FindFileResultId)

local SearchStr = ""

local idx_title = 1
Event { description="Вывод искомой строки в заголовок результатов поиска";
  group="DialogEvent";
  id="9F7E79ED-518C-4D57-84BB-F1CAAA0B65EC";
  condition=function(Event,Param)
   if Event==F.DE_DLGPROCINIT and Param.Msg==F.DN_INITDIALOG and SearchStr~="" then
     local id = Param.hDlg:send(F.DM_GETDIALOGINFO)
     return id and id.Id==FindFileResult_id
   end
  end;
  action=function(Event,Param)
    local text = Param.hDlg:send(F.DM_GETTEXT,idx_title)
    Param.hDlg:send(F.DM_SETTEXT,idx_title,("%s (%s)"):format(text,SearchStr))
  end;
}

local idx_editbox = 6
Event { description="Запоминание поисковой строки из диалога поиска по Alt+F7";
  group="DialogEvent";
  id="74C6CC84-7632-45C0-AF9E-49208F62A3DA";
  condition=function(Event,Param)
   if Param.Msg==F.DN_CLOSE and Event==F.DE_DLGPROCEND and Param.Param1>0 then
     local id = Param.hDlg:send(F.DM_GETDIALOGINFO)
     return id and id.Id==FindFileId_id
   end
  end;
  action=function(Event,Param)
    SearchStr = assert(Param.hDlg:send(F.DM_GETTEXT,idx_editbox))
  end;
}
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Показывать (также) строку поиска в заголовке результатов поиска по файлам

Post by zg »

John Doe wrote: Fri 26 Oct, 2018 09:09Его можно получить из db, но имхо не стоит.
я может быть чего-то не понимаю:

Code: Select all

settings=far.CreateSettings "far"
history=settings\OpenSubkey far.Flags.FSSF_ROOT,"SearchText"
items=settings\Enum history
far.Show items[#items].Name
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 »

1.
zg wrote: Fri 26 Oct, 2018 12:54 я может быть чего-то не понимаю:
Поиск по всей документации к ФАРу строки FSSF_ROOT не дал результата. И... Весчь в себе?
2. На каком языке написан Ваш пример? Не lua . Как проверить moon - я не знаю, но LuaCheck тоже ругается.
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 »

zg, Спасибо, получилось.
User avatar
zg
zero-gravity
Posts: 6016
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Показывать (также) строку поиска в заголовке результатов поиска по файлам

Post by zg »

buniak_a_h wrote: Fri 26 Oct, 2018 13:24Поиск по всей документации к ФАРу строки FSSF_ROOT не дал результата. И... Весчь в себе?
это есть в todo к энциклопедии. опишете — будет.
buniak_a_h wrote: Fri 26 Oct, 2018 13:242. На каком языке написан Ваш пример? Не lua . Как проверить moon - я не знаю, но LuaCheck тоже ругается.
на мунскрипте. у меня — не ругается.
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 »

John Doe, zg, из двух Ваших скрипт получился короче:
Last edited by buniak_a_h on Wed 04 Dec, 2019 23:36, edited 1 time 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 »

На самом деле очень полезная вещь. Я иногда, чтоб вспомнить, что ж я такое искал, инициировал повторный поиск, благо что второй раз быстрее проходит. Жаль, что раньше идея в голову не пришла. И спасибо за "помощь" (на самом деле - за готовые коды).
P/S. Предлагаю после проверки скрипт перенести в раздел полезных
Last edited by buniak_a_h on Fri 26 Oct, 2018 14:23, edited 1 time in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Показывать (также) строку поиска в заголовке результатов поиска по файлам

Post by DrKnS »

buniak_a_h wrote: Fri 26 Oct, 2018 14:20Я иногда, чтоб вспомнить, что ж я такое искал, инициировал повторный поиск
F3 на любом найденном + F7, не?
Post Reply

Return to “Обсуждение макросов”