Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

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

Offline
Posts: 22
Joined: Fri Aug 10, 2007 2:58 pm
Location: Москва

Post 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 тоже не всегда срабатывает с первого раза. Понял это не сразу :-) Я там тоже убрал ту же строку, что и здесь и все стало работать. Можно это как то прокомментировать? Спасибо.

Offline
Posts: 35
Joined: Mon Jun 15, 2009 3:46 pm

Post by ccaid »

Instructor
Мне тоже интересно, почему, в частности, поиск регэкспами не был интегрирован в программу, а вынесен в скрипты. Не то чтобы это напрягало, просто непонятно.
- Не понимаю, не понимаю... Зачем тогда говорить о вещах, которых не понимаешь!
Чтобы понять! :lol:

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

Post by Infocatcher »

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

Offline
Posts: 35
Joined: Mon Jun 15, 2009 3:46 pm

Post by ccaid »

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

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

sergeich, видимо AkelPad неверно работает команда AEM_GETMODIFY, которая определяет, были ли изменения или нет для конкретного файла. Потому и не срабатывает иногда, что AkelPad "думает", что изменений не было.
Спасибо Вам огромное, что дошли до причины! У себя тоже на всякий случай закоменчу эту строку.
Infocatcher wrote:А вот напишите движок регулярных выражений, чтобы можно было обойтись без wscript.exe и системных библиотек.
Никто не говорит обходиться без них, просто код спрятать в прогу и всё. Или скомпиленый код не сможет работать с wscript.exe? :roll:
Last edited by VladSh on Wed Jun 23, 2010 2:56 pm, edited 1 time in total.

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

Post by Infocatcher »

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

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post 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
Как добиться желаемого результата?

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

Post 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");

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

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Спасибо. Значит замены на $0 во внутреннем регекспе надо избегать.
Про $& раньше не знал.

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

Post 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);

Offline
Posts: 124
Joined: Tue Jun 03, 2008 10:32 pm

Post by Xephon »

Приятно ваши сообщения читать - постоянно что-то новое узнаешь :D.

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

Post by Instructor »

Infocatcher
Кстати, пожалуй, полезно будет добавить в SearchReplace.js:
Добавил. Также сейчас нормально позиционируется найденный текст после "Найти далее" (только для 4.x.x).

Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

VladSh wrote:sergeich, видимо AkelPad неверно работает команд AEM_GETMODIFY, которая определяет, были ли изменения или нет для конкретного файла. Потому и не срабатывает иногда, что AkelPad "думает", что изменений не было.
Спасибо Вам огромное, что вы дошли до причины! У себя тоже на всякий случай закоменчу эту строку.
Ан-нет! Всё равно баг есть!!!
Что делаю: вставляю в только что созданное чистое окно текст, его обрабатываю скриптами (простое обрамление тегами), потом выделяю всё и вырезать, т.е. окно остаётся пустым, но что были изменения прога запоминает - звёздочка на вкладке отображается. Так вот делаю всё также несколько (4-5) раз, потом при пустом окне запускаю скрипт чтобы отменить всё, кое что отменяется (это видно по "дёрганию" проги), так вот в окне редактирования иногда(!) остаётся какой-то кусок, редактировавшийся в этом окне, вкладка со звёздочкой...
Instructor, Вы не в курсе, почему это может быть?
Last edited by VladSh on Mon Sep 14, 2009 9:27 am, edited 1 time in total.

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

Post by Instructor »

VladSh
Какой код используется?
Locked