Page 10 of 97

Posted: Fri Jun 19, 2009 9:50 am
by VladSh
Instructor
Прикольная двусмысленность получилась! :mrgreen:

Posted: Fri Jun 19, 2009 2:32 pm
by sergeich
VladSh
Возвращаясь к несрабатыванию с первого раза скрипта UndoAllNoScroll, я заметил, что если убрать (закомментировать) одну строчку из скрипта, все начинает работать отлично с первого раза:

Code: Select all

/// Undo all changes without scroll (4.x.x only)

var AkelPad = new ActiveXObject("AkelPad.document");

var hMainWnd = AkelPad.GetMainWnd();
var hEditWnd = AkelPad.GetEditWnd();
var bAkelEdit = AkelPad.IsAkelEdit();
var oFunction = AkelPad.SystemFunction();

if (hMainWnd
   && bAkelEdit
   && AkelPad.SendMessage(hEditWnd, 3075 /*AEM_CANUNDO*/, 0, 0)
  /// && AkelPad.SendMessage(hEditWnd, 3086 /*AEM_GETMODIFY*/, 0, 0)
)
{
   var lpPoint = AkelPad.MemAlloc(8 /*sizeof(POINT)*/);
   if (lpPoint)
   {
      toggleRedraw(hEditWnd, false);
      AkelPad.SendMessage(hEditWnd, 1245 /*EM_GETSCROLLPOS*/, 0, lpPoint);

      while (AkelPad.SendMessage(hEditWnd, 3075 /*AEM_CANUNDO*/, 0, 0))
      {
         AkelPad.SendMessage(hEditWnd, 3077 /*AEM_UNDO*/, 0, 0)
      }

      AkelPad.SendMessage(hEditWnd, 1246 /*EM_SETSCROLLPOS*/, 0, lpPoint);
      toggleRedraw(hEditWnd, true);

      AkelPad.MemFree(lpPoint);
   }
}

function toggleRedraw(hWnd, bRedraw)
{
   AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
   if (!bRedraw)
      return;
   oFunction.AddParameter(hWnd);
   oFunction.AddParameter(0);
   oFunction.AddParameter(true);
   oFunction.Call("user32::InvalidateRect");
}
Кстати, скрипт UndoAll тоже не всегда срабатывает с первого раза. Понял это не сразу :-) Я там тоже убрал ту же строку, что и здесь и все стало работать. Можно это как то прокомментировать? Спасибо.

Posted: Sat Jun 20, 2009 11:18 am
by ccaid
Instructor
Мне тоже интересно, почему, в частности, поиск регэкспами не был интегрирован в программу, а вынесен в скрипты. Не то чтобы это напрягало, просто непонятно.
- Не понимаю, не понимаю... Зачем тогда говорить о вещах, которых не понимаешь!
Чтобы понять! :lol:

Posted: Sat Jun 20, 2009 11:52 am
by Infocatcher
ccaid wrote:Мне тоже интересно, почему, в частности, поиск регэкспами не был интегрирован в программу, а вынесен в скрипты. Не то чтобы это напрягало, просто непонятно.
А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек. :)
Скажем, в Notepad++ реализация регулярных выражений своя, и она уступает тому, что дает wscript.exe.

Posted: Sun Jun 21, 2009 8:01 am
by ccaid
Infocatcher wrote: А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек. :)
Скажем, в Notepad++ реализация регулярных выражений своя, и она уступает тому, что дает wscript.exe.
А из программы нельзя воспользоваться регэкспами wscript? Я просто не в теме. А их преимущество я уже ощутил - \uXXXX.

Posted: Mon Jun 22, 2009 1:40 pm
by VladSh
sergeich, видимо AkelPad неверно работает команда AEM_GETMODIFY, которая определяет, были ли изменения или нет для конкретного файла. Потому и не срабатывает иногда, что AkelPad "думает", что изменений не было.
Спасибо Вам огромное, что дошли до причины! У себя тоже на всякий случай закоменчу эту строку.
Infocatcher wrote:А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек.
Никто не говорит обходиться без них, просто код спрятать в прогу и всё. Или скомпиленый код не сможет работать с wscript.exe? :roll:

Posted: Mon Jun 22, 2009 9:28 pm
by Infocatcher
VladSh wrote:Никто не говорит обходиться без них, просто код спрятать в прогу и всё. Или скомпиленый код не сможет работать с wscript.exe? :roll:
Вероятно, все дело в том, что для этого нужна часть функционала плагина Scripts.
Хотя автору, разумеется, должно быть виднее. :)

Posted: Thu Aug 27, 2009 10:55 pm
by Xephon
Infocatcher, подскажите пожалуйста.
Если в SearchReplace.js при замене на функцию сама функция содержит замену с использованием регулярных выражений, то не работают обратные ссылки внутреннего регулярного выражения.

Пример:

Файл содержит строки

Code: Select all

!x1 = 1, 2 at y1 = 10, 20; x2 = 3 at y2 = 30; x3 = 5, 6 at y3 = 50, 60; x4 = 7, 8 at y4 = 70, 80
При замене

Code: Select all

^![^\r]+$
на

Code: Select all

var str = $0; return str.replace(/\d+, \d+(?=;|$)/g, "$0 accordingly");
вместо желаемого

Code: Select all

!x1 = 1, 2 at y1 = 10, 20 accordingly; x2 = 3 at y2 = 30; x3 = 5, 6 at y3 = 50, 60 accordingly; x4 = 7, 8 at y4 = 70, 80 accordingly
получается

Code: Select all

!x1 = 1, 2 at y1 = $0 accordingly; x2 = 3 at y2 = 30; x3 = 5, 6 at y3 = $0 accordingly; x4 = 7, 8 at y4 = $0 accordingly
Как добиться желаемого результата?

Posted: Fri Aug 28, 2009 5:02 pm
by Infocatcher
Xephon wrote:Если в SearchReplace.js при замене на функцию сама функция содержит замену с использованием регулярных выражений, то не работают обратные ссылки внутреннего регулярного выражения.
Обратные ссылки работают только если заменять на строку, а в случае с функцией они передаются в виде аргументов.

Так что для

Code: Select all

var str = $0; return str.replace(/\d+, \d+(?=;|$)/g, "$0 accordingly");
в каждой совпавшей с ^![^\r]+$ строке (переменная $0) производится замена /\d+, \d+(?=;|$)/g на "$0 accordingly".
При этом при замене на строку есть только $& (вся строка) и $1, $2, ...


Примерно вот так:
Что: ^![^\r]+$
Чем: return $0.replace(/(\d+, \d+)(;|$)/g, "$1 accordingly$2");

Ну, или так:
Чем: return $0.replace(/(\d+, \d+)(?=;|$)/g, "$1 accordingly");

(Если я правильно уловил суть преобразований. :))

Posted: Fri Aug 28, 2009 7:32 pm
by Xephon
Спасибо. Значит замены на $0 во внутреннем регекспе надо избегать.
Про $& раньше не знал.

Posted: Fri Aug 28, 2009 8:02 pm
by Infocatcher
Xephon wrote:Про $& раньше не знал.
Раз уж вспомнили про $&, еще есть $` (строка до найденного) и $' (после найденного).

Кстати, пожалуй, полезно будет добавить в SearchReplace.js:

Code: Select all

        pReplaceWithEsc='var args={}, l = arguments.length;'
                      + 'for (var i=0; i < l; ++i)\n'
                      + '  args["$" + i]=arguments[i];\n'
                      + 'args.offset=arguments[l - 2];\n'
                      + 'args.s=arguments[l - 1];\n'
                      + 'with (args)\n'
                      + '{\n'
                      +    pReplaceWithEsc
                      + '\n}';
        pReplaceWithEsc=new Function(pReplaceWithEsc);

Posted: Fri Aug 28, 2009 8:55 pm
by Xephon
Приятно ваши сообщения читать - постоянно что-то новое узнаешь :D.

Posted: Sun Aug 30, 2009 5:55 am
by Instructor
Infocatcher
Кстати, пожалуй, полезно будет добавить в SearchReplace.js:
Добавил. Также сейчас нормально позиционируется найденный текст после "Найти далее" (только для 4.x.x).

Posted: Thu Sep 03, 2009 1:19 pm
by VladSh
VladSh wrote:sergeich, видимо AkelPad неверно работает команд AEM_GETMODIFY, которая определяет, были ли изменения или нет для конкретного файла. Потому и не срабатывает иногда, что AkelPad "думает", что изменений не было.
Спасибо Вам огромное, что вы дошли до причины! У себя тоже на всякий случай закоменчу эту строку.
Ан-нет! Всё равно баг есть!!!
Что делаю: вставляю в только что созданное чистое окно текст, его обрабатываю скриптами (простое обрамление тегами), потом выделяю всё и вырезать, т.е. окно остаётся пустым, но что были изменения прога запоминает - звёздочка на вкладке отображается. Так вот делаю всё также несколько (4-5) раз, потом при пустом окне запускаю скрипт чтобы отменить всё, кое что отменяется (это видно по "дёрганию" проги), так вот в окне редактирования иногда(!) остаётся какой-то кусок, редактировавшийся в этом окне, вкладка со звёздочкой...
Instructor, Вы не в курсе, почему это может быть?

Posted: Sun Sep 06, 2009 5:40 am
by Instructor
VladSh
Какой код используется?