Мне надоело после окончания поиска файлов, содержащих строки, открывать найденные файлы и повторять поиск (особенно, если поиск в файлах по регэкспу с помощь. плагинов, а поиск в файле настроен не через эти плагины. А также если имеется несколько строк, удовлетворяющих критерию поиска, и надо перейти на конкретную). В результате родился предлагаемый к обсуждению макрос.
Его отличия от поиска по CtrlF7:
Образец может быть регэкспом в формате LUA или Perl
В результатах показывается найденная строка (как GREP), а также 3 строки выше и ниже найденной
При переходе на выбранную строку редактор сразу позиционируется на неё.
Можно отметить несколько найденных строк (по одной в каждом файле), и тогда в редакторе будут открыты все отмеченные файлы (также с позиционированием на отмеченных строках)
Из результатов поиска можно удалять "мешающие" строки
Можно сворачивать - разворачивать строки, принадлежащие одному файлу
Окно поиска:
Процесс поиска:
Результат:
Обратите внимание: в результате строки файлов BaseLoad.pas b CHECK2TU.PAS "схлопнуты" (Condensed); несколько строк помечены. Внизу окна выведены 7 строк возле текущей (3 выше и 3 ниже)
Исправлена ошибка, в результате которой языковой файл находился только если язык либо ФАРа, либо помощи был Rus
В полной мере использована возможность указания в BreakKey Action; в результате ушла ошибка, в результате которой после удаления и предпросмотра файла пропадало "схлопывание" подразделов
Исправлен мелкий недочёт: можно было удалить строку-разделитель, а также вызвать редактор для этих строк
Добавлены хоткеи для разворачивания/сворачивания строк одного файла (Ctrl+Left, Ctrl+Right)
Добавлен хоткей для перехода к файлу в панели (Ctrl+G, Ctrl+Shift+G)
Добавлена возможность в настройках указать количество строк, выводимых в оне предпросмотра ДО и ПОСЛЕ найденной строки. Настройка вызывается или при помощи плагина Scripts Browser, либо из запроса на поиск, если выбрать "кодировку по расширению" и вызвать [ Настройка CP в зависимости от расширения ]
Версия 1.0.4
Исправлена ошибка (реакция на недокументированные кнопки)
Реализован переход на файл, если нажата CtrlG на разделителе
Название файлов в разделителе центрируется по окну, а не по самой длинной строке
В заголовок окна предпросмотра добавлено имя файла
Версия 1.0.5
Добавлена возможность поиска не только в папке на диске, но и на панели. Например, на временной панели. Если на панели - каталог, то поиск производится во вложенных каталогах.
При поиске на панели добавлена возможность ограничить поиск отмеченными файлами / папками.
Добавлена возможность поместить найденные файлы на временную панель, а при поиске на временной панели - наоборот, вычеркнуть файлы с временной панели.
Версия 1.0.6
Восстановлена возможность перетаскивания окна результатов поиска мышкой. Версия 1.0.7
Сделана возможность при узких экранах переносить элементы диалога на следующую строку
Сделана настройка на предпочтительную область поиска (диск/панель) (забыл отметить в новостях…)
Версия 1.0.8
Исправлена ошибка, проявлявшаяся при запуске макроса без настроек
Версия 1.0.9
Реализован поиск файлов не по маске, а по lua-выражению
Версия 1.0.10
Рефакторинг. Изменён полностью порядок просмотра файлов в разных кодировках. Для этого сначала весь файл читается в память. В результате сильно упрощена работа скрипта, алгоритм стал более понятным и прозрачным
Исправлена ошибка, проявлявшаяся в том, что при выборе кодировки «All» строки в предпросмотре дублировались.
При наличии у файла «Маркера последовательности байтов» (BOM), соответствующего кодировке UTF-8, он имеет наивысший приоритет перед остальными настройками
Версии 1.0.11, 1.0.12
Исправлена ошибка, появившаяся в версии 1.0.7 (пропала кнопка вызова настройки кодовой страницы в зависимости от расширения файла, а также количества строк предпросмотра). Изменения внесены только в языковой файл.
Добавлено расширение табуляций пробелами в строках предпросмотра. Функция взята из сообщения (отдельное спасибо John Doe)
Если активная панель видна, и она - файловая и не плагинновая, то в качестве "стартового" каталога теперь берётся не текущий системный каталог, а каталог, который отображён на панели.
При повторном вызове поиска в одной сессии (при неудаче поиска) стартовый каталог не изменяется.
Версия 1.0.13
Изменён вызов panel.GetPanelInfo в связи с изменившимися требованиями к параметрам
Версия 1.1.1
Нормализованы модули (сгруппированы по тематике). В результате изменены команды загрузки модулей
Добавлена возможность распахивать окно результатов на весь экран. Тулза повешена на кнопку F5
Версия 1.1.2
Добавлена возможность вызова настройки из меню Параметры плагинов (F9 -> Optons -> Plugins).
Добавлен вывод номеров строк (см. замечание от citRiks).
[/list] Версия 1.1.3
Восстановлена возможность использования в качестве маски файлов имени группы масок в виде #<<имя_маски>#. Работае только в том случае, если имя группы масок состоит только из букв, цифр и подчёрка.
Версия 1.1.4
В случае, если кодировка файла не соответствует той, что была указана в поисковом запросе (а в случае выбора кодировки All - той, в которой скрипт пытается читать файл) обработка файла в этой кодировке прекращается. Для варианта All происходит переход на следующую кодировку.
Версия 1.1.5
Изменён эвристический алгоритм автоматического распознавания кодировки. В некоторых случаях показывает значительно более устойчивый результат.
Добавлена возможность ограничить поиск образца первыми n строками
Версия 1.1.6
Исправлен английский языковой файл Find_n_GoEng.lng.
Версия 1.1.7
Добавлена настройка скрипта «Показывать результаты поиска в распахнутом окне».
Last edited by buniak_a_h on Wed 07 Feb, 2024 18:16, edited 31 times in total.
buniak_a_h wrote: ↑Wed 16 Sep, 2020 08:22
Новая версия библиотеки utf-8 "критично" относится к некорректности строки (т.е. если строка - не UTF-строка). И, хотя на самом деле она в ранней версии библиотеки обрабатывалась этими функциями корректно (и даже правильно! Т.е. соответственно интуитивному ожиданию), в новой версии при попытке применить перечисленные функции к не-utf строкам вызывает exception. Я сделал "заплатку": подменил функции из таблицы utf8 на костылик: проверяю, utf-валидные ли строи, передаваемые в эти функции, и если нет - вызываю string-функции, работающие с однобайтовыми символами. Иногда это приводит к неожиданным результатам (функции len, match возвращают позиции в байтах, а не символах), но, как правило, это всё же лучше, чем вылет. И, кстати, если строка utf-валидная, то вызывается предыдущая (стандартная) функция из исходной таблицы utf8. К чему плохому, кроме хорошего, это может привести, я не знаю. Убедить авторов в том, что "нынче не то что давеча" мне не удалось - вот и пришлось придумывать заплатку.
Лучше, все-таки скрипт исправить, чем хак с сайд эффектами применять. Без крайней необхомости это — излишний риск, ИМХО.
dmitrik wrote: ↑Wed 16 Sep, 2020 11:07
Лучше, все-таки скрипт исправить, чем хак с сайд эффектами применять. Без крайней необхомости это — излишний риск, ИМХО.
на всякий случай еще раз повторю за А. Буняк,
что для УТФ-8 string.len() действительно возвращает двойной размер для УТФных буков.
Т.е., если смешанная строка с УТФными и не-УТФными символами, то длина ее будет:
(кол-во УТФ-ных буков) * 2 + (кол-во не-УТФ-ных буков) * 1
что, в общем, не дает бездумно везде ставить string.len(..)
и что, в общем, говорит в пользу предложенного А. Буняк.
для меня дико что разработчик УТФ-бибилиотеки (это не есть "стандартная" библиотека)
не предусмотрел задания уровня терпимости к неправильным УТФ8.
Для меня проблема с новой УТФ-библиотекой даже не в том что ломается там то и се в ФАРовских скриптах,
а в том что если брать невинные луа-скрипты которые "везде работают",
т.е. те которые придуманы не ФАроводами и не для ФАРа,
то они тоже будут валиться при всяких some_string_var:len(..), some_string_var:match(..), итд.
Например debugger для ЗБС, корорый нужно класть в ФАР.
Я то его чинил "своим" методом, и вроде починился,
но сейчас думаю что надо найти свои починки и правильнее будет переставить их на починку от А. Буняк.
далее, не обязательно починку "от А. Буняк" ставить в _macroinit.lua.
Можно задать ее для конкретных скриптов/функций через setfenv,
и наверное еще какими-то способами.
Хотя конечно через _macroinit.lua проще.
Еще, для справки, есть вариант взять DLL прежней УТФ-библитеки, положить его в %FarHome%.
В соответсвующей теме Шмуэль любезно предоставил этот вариант,
подробностей которого я не помню, лучше там и уточнить.
Может этот вариант и наиболее правильным будет.
LAT,
потому что содержала нецензурные выражения видимо[/hide]
citRiks wrote: ↑Wed 16 Sep, 2020 16:54
есть вариант взять DLL прежней УТФ-библитеки
Покинувший нас Shmuel предлагал заменить (вернуться) желающим. Если б можно было "на лету" переключаться с одной библиотеки (DLL) на другую, я бы, конечно, так и сделал.
citRiks wrote: ↑Wed 16 Sep, 2020 16:54
будут валиться при всяких some_string_var:len(..), some_string_var:match(..)
Сейчас при написании скриптов достаточно пользоваться довольно простым правилом: применять юникодные функции только для заведомо юникодных строк.
А в случаях когда это не гарантированно (например чтение из файла) - проверять валидность строки.
Да, приходится думать чуть больше, но зато позволяет дополнительно отловить определённый класс ошибок.
John Doe, хотя Вы сами против продолжения обсуждения этой темы, но напомню.
Ваш luacheck_editor.lua стал валиться при проверке заведомо utf8-валидных текстов. Вы сами посоветовали указать ConvertToAnsi = false.
В частности, luacheck_editor.lua вылетает на файле, состоящем из одной строчки: far.Message('Для работы','',nil,'w')! И я не уверен, что ConvertToAnsi = false приводит к правильным результатам: ведь вы же писали для чего-то!
ConvertToAnsi используется только в одном месте: для преобразования строки в кодировку консоли.
Вышла версия 1.1.3 . Восстановлена возможность указания в качестве маски файлов одного имени файловых масок (например, <arc>). Возможность было утеряна, когда я сделал фишку: указывать в угловых скобках (<…>) выражение над именем файла.
skipik wrote: ↑Fri 08 Jan, 2021 21:26
Скажите, пожалуйста, это можно поправить?
См. тут. Хотя разработчики против такого выхода, я написал и с тех пор не имею проблем с UTF8. Увы, другого способа я до сих пор не знаю.
P/S. А главное - я не вижу никаких отрицательных последствий, кроме нарушения "чистоты кода"
Last edited by buniak_a_h on Fri 08 Jan, 2021 21:56, edited 1 time in total.
buniak_a_h wrote: ↑Fri 08 Jan, 2021 21:54См. тут. Хотя разработчики против такого выхода, я написал и с тех пор не имею проблем с UTF8. Увы, другого способа я до сих пор не знаю.
buniak_a_h wrote: ↑Fri 08 Jan, 2021 21:54P/S. А главное - я не вижу никаких отрицательных последствий, кроме нарушения "чистоты кода"
Ну ... Вашим скриптом не смогут пользоваться люди, которые не узнают/не захотят/не смогут использовать Ваш подход с подменой. Может, для Вас это и не отрицательное последствие.
buniak_a_h wrote: ↑Fri 08 Jan, 2021 21:54См. тут. Хотя разработчики против такого выхода, я написал и с тех пор не имею проблем с UTF8. Увы, другого способа я до сих пор не знаю.
buniak_a_h wrote: ↑Fri 08 Jan, 2021 21:54P/S. А главное - я не вижу никаких отрицательных последствий, кроме нарушения "чистоты кода"
Ну ... Вашим скриптом не смогут пользоваться люди, которые не узнают/не захотят/не смогут использовать Ваш подход с подменой. Может, для Вас это и не отрицательное последствие.
citRiks wrote: ↑Wed 16 Sep, 2020 16:54
Я то его чинил "своим" методом, и вроде починился,
но сейчас думаю что надо найти свои починки и правильнее будет переставить их на починку от А. Буняк.
далее, не обязательно починку "от А. Буняк" ставить в _macroinit.lua.
Можно задать ее для конкретных скриптов/функций через setfenv,
и наверное еще какими-то способами.
Хотя конечно через _macroinit.lua проще.
2. Если тулса не работает у тех, кто не хочет её использовать - это не минус тулсы, это - свойство характера юзера. Минусы у программы могут быть (по Норберту Винеру): (а) неправильные результаты; (б) отсутствие результата в приемлемое время и (в) неожиданные влияния на сторонние процессы. В моём подходе (а) и (б) отсутствуют даже в теории; (в) может быть в том случае, если ожидаемый результат "стороннего процесса" - вылет. Тогда - да, мой подход портит тем, что исправляет возможные ошибки выполнения других скриптов. Но я не считаю это минусом; скорее - плюс.
3. П всему тексту отслеживать вызов функций из таблицы utf8 и предварять их проверкой валидности - ну-ну… Я не настолько трудолюбив. А если вносятся изменения? Опять???
Тема надоела. Вы в этой конференции уже высказывались. Моё мнение не изменилось. Изменится, если кто-нить приведёт пример реального отрицательного эффекта. Было одно: что ошибка в данных исправляется незаметно для юзера. Этот минус легко решается логированием, что у меня делается.
Last edited by buniak_a_h on Sat 09 Jan, 2021 00:44, edited 1 time in total.