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

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
fml2
Posts: 516
Joined: Mon 09 Jul, 2012 22:10
Has thanked: 1 time
Been thanked: 7 times

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

Post by fml2 » Tue 26 Jun, 2018 22:44

Если произвести поиск по файлам (Alt+F7), то в заголовке окна с результатами поиска высвечивается маска имени файлов, в которых был произведен поиск. Мне кажется, было бы неплохо показывать еще и строку поиска (или хотя бы ее начало, если она слишком длинная), если она была задана.

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 00:33

fml2, сделал небольшой скрипт, вставляющий строку поиска в заголовок рамки окна с результатами поиска. Некоторые ограничения скрипта:
1. Не обрабатываю языковые настройки (ищу заголовок по маске ^Find file: )
2. Не учитываю размеры окна (что будет, если искомая строка длиннее ширины окна - я не экспериментировал).
AltF7.Test.lua.7z
(994 Bytes) Downloaded 5 times

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

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

Post by John Doe » Fri 26 Oct, 2018 07:43

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

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

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 08:45

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. С детства...
AltF7.Test.lua.7z
Версия 2
(1.04 KiB) Downloaded 5 times

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

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

Post by John Doe » Fri 26 Oct, 2018 09:09

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.

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 10:08

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: 11991
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 27 times
Been thanked: 136 times

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

Post by John Doe » Fri 26 Oct, 2018 10:25

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
Т.о. либо я не понял, что Вы советуете, либо такой вариант (с двумя вызовами) скорострельнее.
Различий в скорости тут ожидать не следует.
И я наверно пока ничего тут не буду советовать, потому что на первый взгляд вообще не понимаю зачем тут цикл.

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 10:41

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

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

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

Post by John Doe » Fri 26 Oct, 2018 11:01

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: 5512
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 76 times
Contact:

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

Post by zg » Fri 26 Oct, 2018 12:54

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

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 13:24

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

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 13:31

zg, Спасибо, получилось.

User avatar
zg
zero-gravity
Posts: 5512
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 76 times
Contact:

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

Post by zg » Fri 26 Oct, 2018 13:55

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

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 14:16

John Doe, zg, из двух Ваших скрипт получился короче:
AltF7.SearchStr.lua.7z
Скрипт, помещающий строку поиска в окно вывода результатов поиска
(729 Bytes) Downloaded 12 times

buniak_a_h
Posts: 593
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 59 times
Been thanked: 14 times
Contact:

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

Post by buniak_a_h » Fri 26 Oct, 2018 14:20

На самом деле очень полезная вещь. Я иногда, чтоб вспомнить, что ж я такое искал, инициировал повторный поиск, благо что второй раз быстрее проходит. Жаль, что раньше идея в голову не пришла. И спасибо за "помощь" (на самом деле - за готовые коды).
P/S. Предлагаю после проверки скрипт перенести в раздел полезных
Last edited by buniak_a_h on Fri 26 Oct, 2018 14:23, edited 1 time in total.

User avatar
DrKnS
Posts: 5011
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 5 times
Been thanked: 167 times

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

Post by DrKnS » Fri 26 Oct, 2018 16:15

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

Post Reply

Return to “Предложения и идеи”