Condensed View

Здесь выкладываются готовые к использованию макросы и скрипты.
buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 26 Jul, 2015 13:36

Latest post of the previous page:

John Doe wrote: Каждый раз перед использованием GetInfo надо вызывать, и продолжать работу только при наличии значения. Не вижу как общие переменные в этом могут помочь.
Не общие переменные - этим занимается IsEditorActive, который вызывается в condition
John Doe wrote: Одинаковые имена переменных и параметров отражаю всё что надо.
Увы, не привык полагаться на имена. Есть "специалисты", дающие переменным имена типа ii, iii, iiii и т.д. ; есть языки программирования (интерпретаторы), скорость работы которых сильно зависит от длины имен переменных (в частности, при использовании в Clipper-программе 1-2-символьных имён переменных скорость выполнения выше раз в 5-7, чем при нормальных именах). Опять же, статические переменные - это выше скорость, чем из стека. Наверно, "отрыжка" тех времён, когда эффективность кода имела значение...
Небольшой вопрос:
John Doe wrote:

Code: Select all

local function IsMacroActive()
  EID = IsEditorActive()
  isActive = EID and EditorsCondView[EID]
  return isActive
end;
В этом фрагменте переменная isActive не объявлена local. Это - ошибка, или специально она глобальная ? Или я опять языке запутался?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация Condensed View

Post by John Doe » Sun 26 Jul, 2015 13:48

buniak_a_h wrote: Не общие переменные - этим занимается IsEditorActive, который вызывается в condition
Я тут критикую избыточную область действия переменных ei, EID, объявленных в самом начале скрипта.
Утверждаю, что общие переменные необходимы только в макросах, для передачи значений из condition в action (поскольку других механизмов для этого не предусмотрено).
У вас же эти переменные общие для всех функций, что чревато багами (потенциально), и делает код запутанным, т.к. глядя на функцию я без понятия откуда пришло значение той или иной переменной.
buniak_a_h wrote: фрагменте переменная isActive не объявлена local. Это - ошибка, или специально она глобальная ? Или я опять языке запутался?
В коде из прошлого сообщения я пытался продемонстрировать разумное использование общих переменных, EID и isActive.

P.S.
Но если быть параноиком (к чему я не призываю), то есть смысл в action получать значения заново, т.к. между condition и action состояние может измениться. Ситуация не штатная, но возможная.

buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 26 Jul, 2015 14:16

John Doe wrote: Но если быть параноиком...
Поначалу я так и сделал. Но Вы меня сбили замечанием, что GetInfo может вернуть и nil. Поэтому я решил проверять его результат сразу в condition, и больше уже не переспрашивать до тех пор, пока не я сам не решу, что что-то могло измениться. Просто тогда непонятно, что делать дальше...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация Condensed View

Post by HaRT » Sun 26 Jul, 2015 14:18

Фар есть инструмент, а не нянька. © 2009 DrKnS

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

Реализация Condensed View

Post by John Doe » Sun 26 Jul, 2015 14:22

buniak_a_h wrote: Просто тогда непонятно, что делать дальше...
Жаль, значит я напрасно старался.

buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 26 Jul, 2015 14:45

Last edited by buniak_a_h on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Спрятан офтопик
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 26 Jul, 2015 15:04

John Doe wrote: Жаль, значит я напрасно старался.
Это вы о моём просвещении?
(а) Вы так и не описали ситуацию, в которой GetInfo возвращает nil, у меня смоделировать такое не получилось, так что как тестировать - не представляю.
(б) А действительно, как должен поступить скрипт, если в condition GetInfo вернула таблицу, а в action - уже нет? Я вот просто не знаю, что в таком случае делать. То ли прекращать скрипт и подчищать за собой переменные (таблицы), то ли подождать микросекундочку и запросить GetInfo снова...
И, кстати, по поводу
John Doe wrote:
buniak_a_h wrote:Увы, editor.GetInfo приходится вызывать каждый раз, когда делается что-нибудь (перемещение по файлу, выход с или без сохранения позиции).
Естественно! Информация-то меняется.
Тут могут быть два подхода (в учебниках это называлось передачей по ссылке или по значению): GetInfo может вернуть саму таблицу (т.е. образовать новую переменную и заполнить её), либо ссылку на некую внутреннюю структуру редактора, содержащую эту информацию. Во втором случае GetInfo достаточно вызвать один раз; все изменения состояния редактора автоматически будут видны в возвращаемой таблице. И как в ФАРе это реализовано, я не знаю. Так что ирония неуместна.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

Shmuel
Posts: 5202
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

Реализация Condensed View

Post by Shmuel » Sun 26 Jul, 2015 15:12

John Doe
Мне кажется, имеет смысл подождать (неделю, месяц, год) пока наш уважаемый (без иронии) программист со стажем освоит азы Lua и FAR API, вместо того, чтобы опираться на свой большой опыт в других областях программирования. Зачем зря тратить ваше время.

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

Реализация Condensed View

Post by John Doe » Sun 26 Jul, 2015 15:24

buniak_a_h wrote: как тестировать - не представляю.
В Энциклопедии, которая для нас является основным руководством, для каждой функции зачем-то предусмотрена возможность неуспеха.
Вероятно для того, чтобы в своём коде мы могли это как-то учесть.
Как тестировать, это другой вопрос, подозреваю что философский.
buniak_a_h wrote: как должен поступить скрипт, если в condition GetInfo вернула таблицу, а в action - уже нет?
Не выполнять действий. Никаких.
Но если вы не параноик, то в данном случае такой возможностью можно и пренебречь, тем более других проблем хватает.
buniak_a_h wrote: (т.е. образовать новую переменную и заполнить её)
Именно так.
Shmuel wrote: Зачем зря тратить ваше время.
Человек изначально не собирался ничего совершенствовать, а я его чуть ли не заставил, поэтому и трачу.
Тем более идея скрипта заинтересовала (хотя конечно уже бы и сам написал).

buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 26 Jul, 2015 15:42

John Doe wrote: Тем более идея скрипта заинтересовала (хотя конечно уже бы и сам написал)
Я просил, никто не взялся. Сделаете по уму - буду только рад.
Shmuel wrote: Мне кажется, имеет смысл подождать (неделю, месяц, год) пока (...) программист со стажем освоит азы Lua и FAR API
У меня есть работа, и изучать язык ради одного скрипта я не буду. У меня - работает. Вызывать macro:load или macro:unload во время активного макроса ни я, ни мои сотрудники не собираемся. Обрабатывать (гипотетическую) ситуацию, из-за которой контекст макро выгрузится из памяти я тоже не хочу.
Итак: а Вас есть выбор.
1. Дописать (исправить) то, что работает, и разместить или в "полезных макросах", или на ринге.
2. Не дописывать и разместить. С комментариями, в каких случаях он падает.
3. Написать свой (если идею считаете полезной). Тем более, что Вы это сделали бы быстрее.
4. Забанить тему совсем. Этот вариант будет грустный, т.к. в "нормальных" условиях скрипт работает, и в некоторых случаях он бывает полезным. Могут найтись желающие поюзать.
Если будете что-то делать сами, насчёт авторских прав не парьтесь - мне эта тема не интересна, и за неё я денег получать не планирую. Хотя было бы приятно видеть в тексте что-нить типа "идея Буняка А.Х." :-)
5. Что-то иное...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация Condensed View

Post by John Doe » Sun 26 Jul, 2015 15:50

buniak_a_h wrote: У меня - работает.
Хочется надеяться что при разработке таможенного софта вы придерживаетесь других принципов.

А работа есть у всех, и свои недописанные скрипты тоже.
Если вы более не намерены заниматься скриптом, то тема будет закрыта, да.
(Но не удалена, любой сможет доделать и выложить свою версию, в другой теме)

buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 26 Jul, 2015 23:42

John Doe wrote: Хочется надеяться что при разработке таможенного софта вы придерживаетесь других принципов
Главное - чтоб работало и не падало.
Короче, в последней (уже, видимо, не крайней) версии макроса сделано всё. Предусмотрены совсем уж гипотетические ситуации (типа перезагрузки макросов прямо во время работы, попытка отменить режим R/O в сжатом режиме, попытка сохранить файл...). Даже сохранение файла не по команде с клавиатуры, а как-то по-другому (у меня, в частности, макрос CtrlS вызывает сохранение). Так что тему можете закрывать.
Last edited by buniak_a_h on Thu 01 Jan, 1970 01:00, edited 0 times in total.
Reason: Спрятан офтопик

User avatar
DrKnS
Posts: 4618
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

Реализация Condensed View

Post by DrKnS » Mon 27 Jul, 2015 23:06


buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Thu 26 May, 2016 02:06

Окончательно сделал реализацию Condenced View макросом. Последнее изменение: запоминание-восстановление закладок. Сделано тупо (через переход и посылку клавиатурной комбинации RAlt<n>. Если кто знает, как сделать занесение закладок более корректно - напишите, пожалуйста!
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация Condensed View

Post by John Doe » Sun 05 Jun, 2016 12:19

buniak_a_h wrote: Если кто знает, как сделать занесение закладок более корректно - напишите, пожалуйста!
Не трогать закладки.
Вообще не менять содержимое редактора, а для работы открывать новый редактор.

По коду.
buniak_a_h wrote: создадим глобальную таблицу для хранения информации по концам строк
Здесь не нужна глобальная таблица.

Ну и то что раньше писал: хранение ei и EID между вызовами абсолютно различных функций непросто отследить, и вообще крайне сомнительная практика.
Навскидку, посмотрим что у вас в ProcessEditorEvent.
Насколько мне известно ProcessEditorEvent может приходить не только для текущего редактора.
Вы же полагаетесь на то что редактор всегда текущий, и используете в обработчике (когда-то) закешированные значения ei и EID.

buniak_a_h
Posts: 353
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 37 times
Been thanked: 5 times
Contact:

Реализация Condensed View

Post by buniak_a_h » Sun 05 Jun, 2016 14:26

John Doe
Спасибо за анализ. Поясню некоторые моменты, которые я просто не знаю, как сделать по-другому, т.к. (а) это мой первый опыт написания процедуры на lua и (б) не смог найти детального описания областей видимости и времени жизни переменных.
John Doe wrote: Не трогать закладки.
Не трогаю. Обошёл по кривой. Запоминаю позиции закладок, при восстановлении перехожу на позицию закладки и посылаю Keys('RCtrl[0-9]")
John Doe wrote: Здесь не нужна глобальная таблица.
Мне нужно, чтобы информация оставалась между вызовами функций. Т.к. я не знаю, какое время жизни переменных, единственный способ обеспечить доступность информации между разными вызовами функций, который я смог придумать, это - заведение таблицы в _G, внутри неё - для каждого редактора по его ID-у таблицы для хранения данных. Придумал опять же не сам, а сделал по примеру макроса, расставляющего переносы по тексту (EditWrap.lua). Если подскажете, как это делают умные люди - буду благодарен.
John Doe wrote: Ну и то что раньше писал: хранение ei и EID между вызовами абсолютно различных функций непросто отследить, и вообще крайне сомнительная практика.
<...> и используете в обработчике (когда-то) закешированные значения ei и EID
Эти переменные присваиваются в функциях condition. Неужели между condition и action может произойти переключение на другой редактор?
John Doe wrote: Навскидку, посмотрим что у вас в ProcessEditorEvent.
Насколько мне известно ProcessEditorEvent может приходить не только для текущего редактора.
Я же проверяю, находится ли редактор, соответствующий переданному в обработчик события id-у, в condenced-режиме. Если да - всё, контроль за ним полностью обеспечивается макросом. Если нет - я ничего не делаю. Я не знаю, должна ли функция ProcessEditorEvent возвращать результат типа "обработан / не обработан". Было бы логично, чтоб не вызывать остальные обработчики. Не нашёл, где такое может быть описано.
John Doe wrote: не менять содержимое редактора, а для работы открывать новый редактор
Да, это было бы хорошо. Но не представляю себе, как можно открыть новый редактор, а старый "спрятать" (чтоб на него нельзя было переключиться). Если этого не сделать, то исходный текст возможно будет править, что приведёт к рассинхронизации сжатого и несжатого текстов. Ну и вообще куча проблем.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

Реализация Condensed View

Post by John Doe » Sun 05 Jun, 2016 15:00

buniak_a_h wrote: Т.к. я не знаю, какое время жизни переменных
macroapi_manual.ru.chm
buniak_a_h wrote: Эти переменные присваиваются в функциях condition.
Возможно, но в самом определении макроса этого не видно, а присваивания эти не находятся в одном месте, а встречаются неоднократно и в разных функциях.
И используются присвоенные значения тоже повсеместно, а не только в функциях action.
buniak_a_h wrote: Не нашёл, где такое может быть описано.
А это тут при чём вообще.
Я описываю ситуацию, когда событие ProcessEditorEvent может придти для фонового редактора.
buniak_a_h wrote: Но не представляю себе, как можно открыть новый редактор, а старый "спрятать" (чтоб на него нельзя было переключиться).
Открыть модальный редактор.
buniak_a_h wrote: Если этого не сделать, то исходный текст возможно будет править,
Или просто запретить модификацию.

Post Reply

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