Page 3 of 10

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

Posted: Sat 25 Jul, 2015 13:35
by John Doe

Latest post of the previous page:

Добавил пункты 5..9 к замечаниям.
И пункты 4..5 к багам.

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

Posted: Sat 25 Jul, 2015 19:26
by buniak_a_h
John Doe, о багах.
John Doe wrote: 2) в момент его выгрузки редакторы могут быть ещё открыты (подозреваю в этом их надо "расконденсировать")
Как это может быть на практике? Ввели из командной строи нечто типа macro:load ? Ну да, такого я не рассматривал. Как-то это нежизненно. Да и не знаю, как сделать. А разбираться ради какой-то нереальной ситуации - ну это ж не моя работа. Просто сделал удобное, решил поделиться.
John Doe wrote: 3) editor.GetInfo() может вернуться с ошибкой
И что делать? Типа если не получилось, так и не выполнять ничего?
А на самом деле, почему это может произойти, если макрос вызывается в редакторе (area="Editor")? Из-за ошибки в самом FAR-е? На это, думаю, закладываться не стОит: если оболочка не работает, то вообще ничего нельзя делать...
John Doe wrote: 4) Конденсированный файл можно сохранить, т.к. EE_SAVE не обрабатывается.
Да, я знаю. Я писал среди того, что не сделано, но хотелось бы - блокировку сохранения. Как это сделать, я не знаю. Знаю, правда, где смотреть, но дело опять упирается в то, что мне долго... А Вы можете сделать это быстро: наверняка есть опыт...
John Doe wrote: 5) Отступы табуляциями не обрабатываются
Спасибо, посмотрю. Там что-то про editor.RealToTab, кажется.
---
Вопрос по форуму: как Вы делаете, что куси кода встраиваются прямо в текст поста (то, что у Вас зелёным по белому в рамке)?

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

Posted: Sat 25 Jul, 2015 19:34
by John Doe
buniak_a_h wrote: нечто типа macro:load ? Ну да, такого я не рассматривал. Как-то это нежизненно.
Очень даже жизненно. И для этого есть event: ExitFAR.
buniak_a_h wrote: И что делать? Типа если не получилось, так и не выполнять ничего?
Что-то типа этого:

Code: Select all

local ei=editor.GetInfo()
if not ei then return end
buniak_a_h wrote: но хотелось бы - блокировку сохранения. Как это сделать, я не знаю.
Сказано же: EE_SAVE
buniak_a_h wrote: Вопрос по форуму: как Вы делаете,[...]
Нажмите кнопку с кавычкой, и узнаете.

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

Posted: Sat 25 Jul, 2015 20:01
by buniak_a_h
John Doe wrote: Что-то типа этого:

Code: Select all

local ei=editor.GetInfo()
if not ei then return end
Я же не знаю идеологии: в какой момент выполняется присвоение в локальную переменную; если макрос вызывается из нескольких редакторов, то (а) будет ли вызываться этот оператор каждый раз, или только при загрузке макроса в память единожды; (б) возвращает ли вызов editor.GetInfo() одну и ту же таблицу, или зависит от копии редактора. Ну и интересно всё же узнать условия, при которых GetInfo() может возвращать nil... При том, что макрос вызван из редактора. Впрочем, я сделаю как Вы написали, это не проблема.
Насчёт event-ов ExitFAR и EE_SAVE - опять возвращаемся к обработке событий, которую я не понял совсем. И документация написана какими-то назывными предложениями; по-моему, чтобы её прочитать, надо сначала прочитать инструкция к инструкции... :-(

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

Posted: Sat 25 Jul, 2015 20:32
by John Doe
buniak_a_h wrote: будет ли вызываться этот оператор каждый раз
Основной блок выполняется однократно, при загрузке (и перезагрузке) скрипта.
А вот макросы и события могут приводить к многократному выполнению функций, назначенных на них.
buniak_a_h wrote: возвращает ли вызов editor.GetInfo() одну и ту же таблицу,
Разные экземпляры таблиц в любом случае. Или я не понял вопроса.
buniak_a_h wrote: Ну и интересно всё же узнать условия, при которых GetInfo() может возвращать nil...
Бывают определённые условия.
В простых макросах можно это ситуацию не учитывать, а вот при обработке событий крайне рекомендую.
buniak_a_h wrote: Насчёт event-ов ExitFAR и EE_SAVE - опять возвращаемся к обработке событий, которую я не понял совсем.
Но EditorInput вы же как-то обрабатываете.

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

Posted: Sat 25 Jul, 2015 22:25
by buniak_a_h
John Doe wrote: Но EditorInput вы же как-то обрабатываете.
Тупо скопировал с cross.. :-)

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

Posted: Sat 25 Jul, 2015 23:48
by buniak_a_h
John Doe wrote: 6) Вместо ProcessEditorInput не лучше ли привязаться к EE_REDRAW?
Вот в этом случае как раз и возникал Stack overflow. И это - ещё до того, как я стал "оперировать" с цветами, делал только Editor.SetTitle. Насколько я понимаю, причина была в том, что при SetTitle возникает событие EE_REDRAW, что вызывает обработчик и т.д. . И блокировка типа переменной Processing=true не помогала (возможно, из-за того, что перерисовка происходила асинхронно). Короче, с EE_REDRAW у меня не получилось.

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

Posted: Sun 26 Jul, 2015 03:24
by buniak_a_h
John Doe!
1. Обработать ExitFAR у меня не получилось. Такое ощущение, что пропадает контекст Undo-Redo. Т.е. при вызове макроса я отмечаю блок UNDO, а при выходе из макроса я делаю AltBS для восстановления первоначального состояния файла, но после перезагрузки macro:load это не срабатывает.
2.
John Doe wrote: 9) Что если вместо модификации активного редактора для Condenced View открывать новый?
Делать временную копию файла как-то некрасиво, плохой стиль... Уж очень по-микрософтовски... Хотя, наверно, некоторые проблемы и решились бы, но противно... Если б можно было редактировать некий файл в памяти... Но я не знаю, как это сделать.
3.
John Doe wrote: 5) Отступы табуляциями не обрабатываются
Исправлено...
============
Ну и по пунктам замечаний.
п.1, 5 исправлены.
пп. 2 и 7 сделаны (сам догадался) :-)
п.3 - хранение данных переработано так, что они заносятся при вызове макроса. Увы, editor.GetInfo приходится вызывать каждый раз, когда делается что-нибудь (перемещение по файлу, выход с или без сохранения позиции).
пп. 4, 8 и замечание про отступы в самом макросе: т.к. языка я не знаю, то брал куски кода из разных других макросов. Получилось смешение стилей...
п.6 - я отвечал раньше.
===
В любом случае, даже в таком виде этот макрос показался нам (разработчикам таможенного софта) полезным. Я не против, если Вы сможете довести его до товарного вида. Я и сейчас знаю, как его "уронить", но только это будут именно злонамеренные действия. В частности, если в сжатом виде снять режим R/O и нажать AltBS то вылетает со свистом. Просто это несколько не то, для чего скрипт писался... Раз уж на мои просьбы переписать старый Cindenced View под новый юникодный ФАР никто не откликнулся...

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

Posted: Sun 26 Jul, 2015 10:17
by John Doe
buniak_a_h wrote: при выходе из макроса я делаю AltBS
В мануале есть статья Ограничения в использовании некоторых функций
(и неужели так вы рассчитывали послать нажатие в неактивный редактор?)
buniak_a_h wrote: Такое ощущение, что пропадает контекст Undo-Redo.
Проверил с editor.UndoRedo, не пропадает.
buniak_a_h wrote: Если б можно было редактировать некий файл в памяти...
Созданный файл и будет только в памяти, до тех пор пока его явно не сохранить.

По остальному: что-то вы дров наломали.
luacheck предупреждений не выдаёт, но на самом деле стало хуже.

buniak_a_h wrote: п.1, 5 исправлены
Пункт 1 надо лучше было понять буквально.
buniak_a_h wrote: п.3 - хранение данных переработано так, что они заносятся при вызове макроса.
На это уже ответил выше под спойлером.
buniak_a_h wrote:Увы, editor.GetInfo приходится вызывать каждый раз, когда делается что-нибудь (перемещение по файлу, выход с или без сохранения позиции).
Естественно! Информация-то меняется.
buniak_a_h wrote: Получилось смешение стилей...
Отступы используются без системы, что делает применение скрипта к собственному коду проблематичным. Прямо парадокс какой-то.

P.S.
Надеюсь вы таки доведёте дело до конца.

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

Posted: Sun 26 Jul, 2015 10:53
by John Doe
buniak_a_h wrote: Насколько я понимаю, причина была в том, что при SetTitle возникает событие EE_REDRAW, что вызывает обработчик и т.д.
Это не так, и проверяется легко.
Найти ошибку можно и без отладчика, если начать с пустой функции, и добавлять код постепенно.

Но чёрт с ним, с EditorInput работает и ладно.

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

Posted: Sun 26 Jul, 2015 11:03
by buniak_a_h
John Doe wrote:
buniak_a_h wrote: Насколько я понимаю, причина была в том, что при SetTitle возникает событие EE_REDRAW, что вызывает обработчик и т.д.
(...)
Найти ошибку можно и без отладчика, если начать с пустой функции, и добавлять код постепенно.
Так и делал. Всё падало при добавлении editor.SetTitle() .

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

Posted: Sun 26 Jul, 2015 11:08
by John Doe
Обманываете однако.

Code: Select all

local F = far.Flags
Event{
  group="EditorEvent";
  action=function(EditorID,Event,Param)
    if Event==F.EE_REDRAW then
      editor.SetTitle(EditorID,tostring(EditorID))
    end
  end
}

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

Posted: Sun 26 Jul, 2015 11:33
by buniak_a_h
John Doe wrote: local ei, EID
Эти переменные у вас теперь общие для всех функций. Значит напортачить не сложнее чем с глобальными.
На самом деле они каждый раз инициализируются перед вызовом action в процедуре condition. Я подумал, что вся клауза action выполняется как одна транзакция, т.е. переключение на другой контекст до выхода из функции невозможно. Это не так? Если это так, то хуже стать всяко не должно... Или condition выполняется не всегда при нажатии на соответствующую горячую клавишу?

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

Posted: Sun 26 Jul, 2015 11:39
by Shmuel
buniak_a_h wrote: Или condition выполняется не всегда при нажатии на соответствующую горячую клавишу?
Зачем гадать, не легче ли прочитать соответствующую статью в документации (macroapi_manual.ru.chm), она не такая большая и не такая сложная. Это избавит вас от необходимости задавать вопросы, по которым сразу становится ясно, что документацию вы не читали.

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

Posted: Sun 26 Jul, 2015 11:40
by John Doe
buniak_a_h wrote: На самом деле они каждый раз инициализируются
Я понимаю.
Но это плохая практика, потенциальные грабли на ровном месте, и никаких плюсов взамен.

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

Posted: Sun 26 Jul, 2015 12:38
by buniak_a_h
John Doe wrote: Я бы записал так:
local function IsEditorActive()
 local ei = editor.GetInfo()
 return ei and EditorsCondView[ei.EditorID]
end;
, соответственно функция IsMacroActive вообще стала бы лишней.
Разбил на две функции (проверки наличия контекста редактора и активности макроса) при борьбе с ExitFAR. Не получилось, но возвращать обратно не стал, т.к. не мешает.
John Doe wrote: (...) и никаких плюсов взамен.
1. Не нужно каждый раз писать проверку, не nil ли GetInfo()
2. Не нужно при каждом вызове макроса перечитывать GetInfo, проверять существование EditorsCondView[EID]. Можно, конечно, оставить эти действия в процедуре (как сейчас), но тогда её вызывать в каждом action{/c]. А какая разница? Тоже самое, но один раз написал и забыл. Впрочем, дело вкуса.
3. А общие переменные для всех функций в данном случае, по-моему, это правильно. Отражает, что это - реально одно и то же.

[quote="Shmuel"][post]131522[/post] Зачем гадать, не легче ли прочитать соответствующую статью[/quote]
Прочитал, потому и был спокоен. Раз появились замечания, то (а) я неправильно понял описание; или (б) описание не соответствует программе (программирую с 1974-го года, с таким сталкивался часто. Если Вы не сталкивались - что ж, молод истчо! :quiet: ); или (в) из-за ошибки в программе есть ситуации, когда [b]condition[/b] не выполняется. Или в ФАРе нет ошибок?