Condensed View

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

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

Post by John Doe » Sat 25 Jul, 2015 19:34

Latest post of the previous page:

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: Вопрос по форуму: как Вы делаете,[...]
Нажмите кнопку с кавычкой, и узнаете.

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sat 25 Jul, 2015 20:01

John Doe wrote: Что-то типа этого:

Code: Select all

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

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

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

Post by John Doe » Sat 25 Jul, 2015 20:32

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 вы же как-то обрабатываете.

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sat 25 Jul, 2015 22:25

John Doe wrote: Но EditorInput вы же как-то обрабатываете.
Тупо скопировал с cross.. :-)
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sat 25 Jul, 2015 23:48

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

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sun 26 Jul, 2015 03:24

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 под новый юникодный ФАР никто не откликнулся...
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

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

Post by John Doe » Sun 26 Jul, 2015 10:17

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.
Надеюсь вы таки доведёте дело до конца.

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

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

Post by John Doe » Sun 26 Jul, 2015 10:53

buniak_a_h wrote: Насколько я понимаю, причина была в том, что при SetTitle возникает событие EE_REDRAW, что вызывает обработчик и т.д.
Это не так, и проверяется легко.
Найти ошибку можно и без отладчика, если начать с пустой функции, и добавлять код постепенно.

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

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sun 26 Jul, 2015 11:03

John Doe wrote:
buniak_a_h wrote: Насколько я понимаю, причина была в том, что при SetTitle возникает событие EE_REDRAW, что вызывает обработчик и т.д.
(...)
Найти ошибку можно и без отладчика, если начать с пустой функции, и добавлять код постепенно.
Так и делал. Всё падало при добавлении editor.SetTitle() .
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

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

Post by John Doe » Sun 26 Jul, 2015 11:08

Обманываете однако.

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
}

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sun 26 Jul, 2015 11:33

John Doe wrote: local ei, EID
Эти переменные у вас теперь общие для всех функций. Значит напортачить не сложнее чем с глобальными.
На самом деле они каждый раз инициализируются перед вызовом action в процедуре condition. Я подумал, что вся клауза action выполняется как одна транзакция, т.е. переключение на другой контекст до выхода из функции невозможно. Это не так? Если это так, то хуже стать всяко не должно... Или condition выполняется не всегда при нажатии на соответствующую горячую клавишу?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

Shmuel
Posts: 5925
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 233 times

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

Post by Shmuel » Sun 26 Jul, 2015 11:39

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

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

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

Post by John Doe » Sun 26 Jul, 2015 11:40

buniak_a_h wrote: На самом деле они каждый раз инициализируются
Я понимаю.
Но это плохая практика, потенциальные грабли на ровном месте, и никаких плюсов взамен.

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

Post by buniak_a_h » Sun 26 Jul, 2015 12:38

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] не выполняется. Или в ФАРе нет ошибок?
Программировать просто. Знай, жми себе на кнопочки... © Владелец IT-компании

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

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

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

buniak_a_h wrote: Не нужно каждый раз писать проверку, не nil ли GetInfo()
Каждый раз перед использованием GetInfo надо вызывать, и продолжать работу только при наличии значения. Не вижу как общие переменные в этом могут помочь.
buniak_a_h wrote: Не нужно при каждом вызове макроса перечитывать GetInfo, проверять существование EditorsCondView[EID].
Избежать повторения одних и тех же операций в condition/action — это аргумент.
Но и в этом случае есть смысл максимально ограничить область действия общих переменных.
buniak_a_h wrote: А общие переменные для всех функций в данном случае, по-моему, это правильно. Отражает, что это - реально одно и то же.
Одинаковые имена переменных и параметров отражаю всё что надо.
А область действия переменных должна быть не больше, чем необходима.

Но можете конечно игнорировать моё мнение, я вообще не программист.

Shmuel
Posts: 5925
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 233 times

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

Post by Shmuel » Sun 26 Jul, 2015 13:21

buniak_a_h wrote: (программирую с 1974-го года, с таким сталкивался часто. Если Вы не сталкивались - что ж, молод истчо!
Да, против таких аргументов не попрёшь.

buniak_a_h
Posts: 1266
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 89 times
Been thanked: 80 times
Contact:

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

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

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-компании

Post Reply

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