Condensed View

Здесь выкладываются готовые к использованию макросы и скрипты.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

Latest post of the previous page:

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: Если этого не сделать, то исходный текст возможно будет править,
Или просто запретить модификацию.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

John Doe wrote: buniak_a_h писал(а):
Источник цитаты Т.к. я не знаю, какое время жизни переменных
macroapi_manual.ru.chm
А если несколько экземпляров FAR - переменные общие, или нет? А editor.info.id - уникальный? Или всё в пределах одного экземпляра? Что как-то они между собой взаимодействуют - я понял. Во всяком случае, пока ВСЕ экземпляры не закроются, значение, занесённое в _G, остаётся доступным. Впрочем, начерно, _G.EditorsCondView можно заменить на local EditorsCondView - попробую.
John Doe wrote: А это тут при чём вообще.
Тут это - ни при чём. Просто нужно же иметь механизм прерывания цепочки обработчиков события (типа done). Просто чтоб другой обработчик не вмешался в работу макроса.
John Doe wrote: Я описываю ситуацию, когда событие ProcessEditorEvent может придти для фонового редактора.
1. Не знаю, что такое "фоновый редактор".
2. Если фоновый редактор в состоянии condenced, то обрабатывать надо независимо от того, фоновый он или нет. В начале функции ProcessEditorEvent я же проверяю if not _G.EditorsCondView[id] then return end - т.е. включен ли сжатый режим. И что тут не так?
John Doe wrote: Открыть модальный редактор
И потерять возможность переключаться в другие окна??? Ну ничего себе! Нужно запретиь переход только на исходный редактор, а не вообще на любой!
John Doe wrote: Или просто запретить модификацию.
Опять же не представляю, как запретить модификацию без перехвата нажатий клавиш. Собственно, я запретил модификацию в сжатом режиме.
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

John Doe
Может, поможете с таким вопросом:
Я в документации (macroapi_manual.ru.chm, раздел "Обработчики событий") нашёл такую фразу:
Функции condition и action обработчика вызываются с теми же параметрами, с которыми вызывается соответствующая экспортируемая функция (см. мануал LuaFAR).
Что такое "соответствующая экспортируемая функция"? Поиск по condition ничего не дал, в разделе export.ProcessEditorEvent параметры абсолютно не соответствующие тем, что получают функции (первый параметр я получаю таблицу, а описан EditorID: integer.
Я использовал то, что подсмотрел в других макросах (в частности, LuaSpell.lua, EditWrap.lua). И почему-то работает. Чего-то я не понимаю... :(
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

О! Как-то мимо моего внимания Ваш пост проскочил...
John Doe wrote: Я тут критикую избыточную область действия переменных ei, EID, объявленных в самом начале скрипта.
Утверждаю, что общие переменные необходимы только в макросах, для передачи значений из condition в action (поскольку других механизмов для этого не предусмотрено).
Так у меня именно так и делается (и именно для этого и используются)! В функции IsEditorActive эти переменные присваиваются, а используются в функциях action. Т.е. в точности то, что Вы написали...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
Shmuel
Posts: 6834
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

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

Post by Shmuel »

buniak_a_h wrote:в разделе export.ProcessEditorEvent параметры абсолютно не соответствующие тем, что получают функции (первый параметр я получаю таблицу, а описан EditorID: integer.
Довольно серьёзное заявление. Можете доказать на примере, чтобы не было голословно?
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

buniak_a_h wrote: А если несколько экземпляров FAR - переменные общие, или нет?
Разные экземпляры никак между собой не взаимодействуют.
buniak_a_h wrote: Тут это - ни при чём.
Значит и нечего мешать всё в кучу. Если что-то в Энциклипедии не ясно, значит надо спросить, но в соответствующей теме.
buniak_a_h wrote: В начале функции ProcessEditorEvent я же проверяю if not _G.EditorsCondView[id] then return end - т.е. включен ли сжатый режим. И что тут не так?
А то, что id может оказаться не равным EID, если редактор фоновый (т.е. не является активным окном).
buniak_a_h wrote: Нужно запретить переход только на исходный редактор, а не вообще на любой!
И так можно, всё в ваших руках.
buniak_a_h wrote: Собственно, я запретил модификацию в сжатом режиме.
Оказывается умеете.
buniak_a_h wrote: не представляю, как запретить модификацию без перехвата нажатий клавиш.
И перехватить можно, да.
buniak_a_h wrote: Может, поможете с таким вопросом:
Разумеется. В соответствующей теме.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

buniak_a_h wrote: Т.е. в точности то, что Вы написали...
Нет же.
Пример:
Здесь область действия переменной ограничена двумя функциями, и это видно невооружённым глазом, соответственно откуда пришло значение очевидно, и также можно не беспокоиться о том, что переменная будет модифицирована где-то в другом месте.

А у вас:
1. Переменные общие для нескольких макросов (нормально, но уже надо быть внимательнее)
2. Визуально проконтроллировать сложно, поскольку используются переменные не в теле action/condition, а в ранее определённых функциях, которые откуда только не вызываются (не только из макросов).
3. Таких функций много, одна вызывается из другой и т.п. (ну можно же передавать значения параметрами, почему не пользуетесь)
4. Эти же переменные используется в обработчиках событий, и в этом случае мне уже совсем неясно, где предполагается их инициализация.

Я даже готов поверить, что вы свой код видите насквозь, и всё там предусмотрено.
Я только утверждаю, что практика эта плохая. Такой код сложно понимать, и модифицировать.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

John Doe
Т.е. если я вместо вызова функций в каждом condition буду делать одно и то же (получение Editor.ID-а), то это будет хорошая практика, а объединение одинакового кода в функцию - для LUA считается плохой? Ну, перенести кусок текста - дело секундное. Видимо, я неправильно понимаю стиль и критерии эффективности LUA и FAR
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

buniak_a_h wrote: объединение одинакового кода в функцию - для LUA считается плохой?
Ну зачем Вы передёргиваете? Ничего такого тут никто не утверждал. Впрочем, предлагаю придерживаться конструктивного русла.
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

buniak_a_h wrote: то это будет хорошая практика
Хорошая вот:

Я не утверждаю что надо вот прям только так, но надо стремиться к ясности
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

John Doe wrote: Хорошая вот
Заранее прошу прощения за нубский вопрос: а что мешает нам поместить переменную a прямо в „таблицу“ (?) Macro?
Где бы почитать, что эти Macro собой представляют с точки зрения виртуальной машины Lua?
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

John Doe wrote: Хорошая вот:
1. Насколько я понимаю, код в принципе нерабочий. condition должна возвращать или boolean, или число-приоритет. а a в Вашем примере - это (в моём контексте) пара (ei, EID).
2. Да я, вроде, практически так и написал. Замените f1 на IsEditorActive, f2 на CondViewOff (или CondViewOn) - получится тот же код
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

HaRT wrote: Где бы почитать, что эти Macro собой представляют с точки зрения виртуальной машины Lua?
В определении макроса это всего лишь вызов функции с именем Macro и параметром-таблицей.
HaRT wrote: в „таблицу“ (?) Macro?
Нет такой таблицы.
User avatar
John Doe
Бюрократ
Posts: 13851
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 428 times
Contact:

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

Post by John Doe »

buniak_a_h wrote: Насколько я понимаю, код в принципе нерабочий.
Не думал что вы буквально поймёте.
Да, в коде condition недостаёт return, добавьте самостоятельно.
buniak_a_h wrote: Да я, вроде, практически так и написал.
Так, да совсем не так.
User avatar
buniak_a_h
Posts: 4262
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 644 times
Contact:

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

Post by buniak_a_h »

John Doe wrote: а, в коде condition недостаёт return, добавьте самостоятельно.
Это я как раз понял. Не в этом ошибочка. return a не годится (a - пара ei, EID, а нужна или boolean, или number); видимо, под [b]a[/b] имеется в виду внешняя (по отношению к функциям) local a; а тогда зачем передавать её в f2 параметром?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании
User avatar
HaRT
Moderator
Posts: 10858
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 221 times
Been thanked: 358 times

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

Post by HaRT »

buniak_a_h wrote: return a не годится (a - пара ei, EID, а нужна или boolean, или number)
Так вроде никто и не предлагал возвращать a.
buniak_a_h wrote: тогда зачем передавать её в f2 параметром?
Чтобы уменьшить размер разделяемого состояния — чтобы было проще понимать и поддерживать (maintain) код.
Фар есть инструмент, а не нянька. © 2009 DrKnS
Post Reply

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