Scripts discussion (3)

Discuss and announce AkelPad plugins
  • Author
  • Message

Offline
Posts: 366
Joined: Mon Jan 10, 2011 5:28 pm
Contact:

Post by Lenchik »

Instructor
Не могли бы Вы добавить в Keyboard.js выбор разных схем транслитерации из списка http://en.wikipedia.org/wiki/Romanizati ... tion_table
или Википедия — Сравнительная таблица систем транслитерации?

Offline
Posts: 2247
Joined: Tue Aug 07, 2007 2:03 pm
Location: Vinnitsa, Ukraine

Post by FeyFre »

New version of History.js
+ A function to clean list of non-existent items.
* Bugfixes

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

(из предыдущей части)
Skif_off wrote:

Code: Select all

au3: [ null, null, [";"] ],
Правда, есть еще блочные, но с ними неприятность небольшая:
Директивы #comments-start и #comments-end могут быть вложенными.
Можно также использовать сокращения #cs и #ce.
В дополнение, сами директивы также могут быть закомментированы!
Пока что вот так:
https://github.com/Infocatcher/AkelPad_scripts/issues/7
+ https://github.com/Infocatcher/AkelPad_ ... f961806463

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
<del>Что-то у меня с этой тестовой непонятное происходит.</del>
С релизным AkelPad 4.8.8 то же самое, Scripts 14.7.
Есть штука вида

Code: Select all

lpTimerCallback = oSys.RegisterCallback(timerProc);
oSys.Call("user32::SetTimer", hMainWnd, id, delay, lpTimerCallback);
И так в двух одновременно работающих скриптах.
То есть, как я понимаю, timerProc() должна вызываться только при срабатывании таймера с указанным id.
Но иногда почему-то прилетает чужой идентификатор.

Используется autoSaveSession.js (добавлена проверка, что пришел нужный nIDEvent) + tileTabs.js (текущий релиз) + timer.js (включен вывод отладочных сообщений).

Upd
Причем если сбой произошел, то при повторных вызовах tileTabs.js callback с нужным nIDEvent не вызывается. Если активен autoSaveSession.js, то вызывается (вроде бы) с его идентификатором. Если autoSaveSession.js выгрузить, то не вызывается вообще.

Upd #2
А вот эта версия, вроде, еще без этой проблемы (77 824 байт, MD5: f94e8b34a0bc03d07585a12bded8eb6b).

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:А вот эта версия...
Те исходники уже трансформировались, а вернее только фиксились. Видимо баги мешали друг другу :)

Могу предложить в версии 14.8 попробовать:

Code: Select all

oSys.Call("user32::SetTimer", AkelPad.ScriptHandle(0, 17 /*SH_GETSERVICEWINDOW*/), ...
вместо hMainWnd, т.к. в описании SetTimer указано, что в качестве окна должно выступать окно, принадлежащее вызывающему потоку (хотя с hMainWnd работало, наверное поэтому не обратил внимание).

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor
Но почему все-таки в той предрелизной версии все нормально (вроде бы) работает?
И ведь тогда выходит, что

Code: Select all

AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0)
уже не нужен?

Поменял:
https://github.com/Infocatcher/AkelPad_ ... est/timers
=> https://github.com/Infocatcher/AkelPad_ ... 706212a711
Все равно периодически падает на
Скрипт: ...\AkelFiles\Plugs\Scripts\Include\timer.js
Строка: 112
Символ: 2
Ошибка: Предполагается наличие объекта
Код: 800A138F
Источник: Ошибка выполнения Microsoft JScript
Вот тут:

Code: Select all

function timerProc(hWnd, uMsg, nIDEvent, dwTime) {
	var fn = timers.funcs[nIDEvent];
	if(timers.timeouts[nIDEvent])
		timers.clear(nIDEvent);
	fn(); // <--
}
Или окно все равно одно на все скрипты?

Upd
И снова если фильтровать чужие идентификаторы, то после первого сбоя callback (с нужными идентификаторами) перестает вызываться. И это очень странно, потому как KillTimer() не вызывается.

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Но почему все-таки в той предрелизной версии все нормально (вроде бы) работает?
Повторю - там были ошибки (в очередности обработки сообщений). Лог здесь.
И ведь тогда выходит, что

Code: Select all

AkelPad.SendMessage(hMainWnd, 1319 /*AKD_UNIQUEID*/, 0, 0)
уже не нужен?
Если использовать одновременно только один SetTimer в одном скрипте, то да.
Все равно периодически падает на
Так это не падение, а ошибка объекта.
Или окно все равно одно на все скрипты?
Сервисное окно создается для каждого скрипта.

Попробуйте вынести код из timer.js напрямую в используемые скрипты, т.е. без использования Include().

Еще можно точку останова поставить на:

Code: Select all

oSys.Call("user32::KillTimer", this.hWndTimer, id);

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Еще можно точку останова поставить на:

Code: Select all

oSys.Call("user32::KillTimer", this.hWndTimer, id);
Ничего интересного: два раза выходит на KillTimer() с разными идентификаторами. Хотя странно, если проверять выводом сообщений в заголовок окна, то там трижды выходит на KillTimer() – то есть с логикой работы, вроде, проблем никаких нет.
А потом (как, собственно, и раньше, AkelPad падает – вроде, все там же).
А если с логами, то вот такое выходит:

Code: Select all

set(true) 10      // одноразовый таймер
-> set(false) 11  // многоразовый таймер
-> _clear(10) #2  // дважды вызывается KillTimer(), но не думаю, что это должно мешать
-> set(false) 10  // многоразовый таймер с ID первого таймера
-> _clear(10)     // это в самом конце, KillTimer() для первого ID
-> _clear(11)     // и KillTimer() для второго ID
-> destroy        // UnregisterCallback()
Instructor wrote:Если использовать одновременно только один SetTimer в одном скрипте, то да.
Ммм... так тогда в рамках одного скрипта быстрее использовать свой счетчик для получения уникальных идентификаторов.
Instructor wrote:Так это не падение, а ошибка объекта.
От этого ничего принципиально не меняется... откуда там посторонние идентификаторы в вызовах callback'а?
Instructor wrote:Попробуйте вынести код из timer.js напрямую в используемые скрипты, т.е. без использования Include().
Если тупо скопировать в начало файла (и закомментировать вызов Include()), то проблемы все те же: иногда callback вызывается с посторонним идентификатором (по-прежнему, видимо, из autoSaveSession,js, а там ведь timer.js и так не используется), а иногда не вызывается вообще (визуально это выглядит как статичная надпись в строке состояния).

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher
Голова увеличивается в размерах от таких багов :) Scripts plugin v14.9

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Instructor wrote:Голова увеличивается в размерах от таких багов :) Scripts plugin v14.9
Спасибо, вроде, теперь нормально. :)
Но где же подробности? :roll:


Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Infocatcher wrote:Но где же подробности? :roll:
Уже.

Offline
Posts: 30
Joined: Sat Nov 26, 2011 1:52 pm

Post by Egor »

Привет! Можете проверить скрипт QuoteExtend.js он тут. У меня в нём не работает выделение текста внутри одинарных кавычек (выделение двойных кавычек и круглых скобок работает нормально).

Если я правильно понимаю, то "одинарные кавычки" — это символ ['] (на клавише "э" чуть левее "enter").

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Egor
А вы примеры использования скрипта (стр. 12-16) посмотрели?
Что-то мне подсказывает, что вы скрипт без параметров вызываете.
Сделайте вызов как показано в строке 15.
Locked