Прикольная двусмысленность получилась!

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");
}
А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек.ccaid wrote:Мне тоже интересно, почему, в частности, поиск регэкспами не был интегрирован в программу, а вынесен в скрипты. Не то чтобы это напрягало, просто непонятно.
А из программы нельзя воспользоваться регэкспами wscript? Я просто не в теме. А их преимущество я уже ощутил - \uXXXX.Infocatcher wrote: А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек.
Скажем, в Notepad++ реализация регулярных выражений своя, и она уступает тому, что дает wscript.exe.
Никто не говорит обходиться без них, просто код спрятать в прогу и всё. Или скомпиленый код не сможет работать с wscript.exe?Infocatcher wrote:А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек.
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
Обратные ссылки работают только если заменять на строку, а в случае с функцией они передаются в виде аргументов.Xephon wrote:Если в SearchReplace.js при замене на функцию сама функция содержит замену с использованием регулярных выражений, то не работают обратные ссылки внутреннего регулярного выражения.
Code: Select all
var str = $0; return str.replace(/\d+, \d+(?=;|$)/g, "$0 accordingly");
Раз уж вспомнили про $&, еще есть $` (строка до найденного) и $' (после найденного).Xephon wrote:Про $& раньше не знал.
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);
Ан-нет! Всё равно баг есть!!!VladSh wrote:sergeich, видимо AkelPad неверно работает команд AEM_GETMODIFY, которая определяет, были ли изменения или нет для конкретного файла. Потому и не срабатывает иногда, что AkelPad "думает", что изменений не было.
Спасибо Вам огромное, что вы дошли до причины! У себя тоже на всякий случай закоменчу эту строку.