Page 1 of 2

Работа скриптов в автоматическом режиме

Posted: Sun Apr 24, 2011 4:21 pm
by Instructor
1. Примеры скриптов, которые после запуска останутся в памяти и будет реагировать на определенные события в AkelPad'е:

Code: Select all

//// Force turning on AECO_ENTIRENEWLINEDRAW setting for every edit window.

var hScript;

if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //Script is running, second call close it.
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
  //Script initialized after empty tab is already created.
  OnEditStart(AkelPad.GetEditWnd());

  if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x40B /*AKDN_EDIT_ONSTART*/))
  {
    //Allow other scripts running and unlock main thread from waiting this script.
    AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x40B /*AKDN_EDIT_ONSTART*/)
  {
    OnEditStart(wParam);
  }
}

function OnEditStart(hWnd)
{
  AkelPad.SendMessage(hWnd, 3228 /*AEM_SETOPTIONS*/, 2 /*AECOOP_OR*/, 0x8000 /*AECO_ENTIRENEWLINEDRAW*/);
}


Code: Select all

//// Turn on word wrap for .c, .cpp, .h files and turn off for others.

var hMainWnd=AkelPad.GetMainWnd();
var hScript;

if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //Script is running, second call close it.
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
  //Script initialized after empty tab is already created.
  OnEditStart(AkelPad.GetEditWnd());

  if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x40B /*AKDN_EDIT_ONSTART*/, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/, 0x438 /*AKDN_SAVEDOCUMENT_FINISH*/))
  {
    //Allow other scripts running and unlock main thread from waiting this script.
    AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x40B /*AKDN_EDIT_ONSTART*/)
  {
    OnEditStart(wParam);
  }
  else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/ ||
           uMsg == 0x438 /*AKDN_SAVEDOCUMENT_FINISH*/)
  {
    //Get current file extension
    var pFile=AkelPad.GetEditFile(0);
    var nExtPos=pFile.lastIndexOf(".");
    var pExt="";

    if (nExtPos != -1)
      pExt=pFile.substr(nExtPos).toLowerCase();
    if (pExt == ".c" || pExt == ".cpp" || pExt == ".h")
    {
      //Turn on word wrap for matched files
      if (!AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 17 /*FI_WORDWRAP*/, 0))
        AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
    }
  }
}

function OnEditStart(hWnd)
{
  //Turn off word wrap for any new window
  if (AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 17 /*FI_WORDWRAP*/, 0))
    AkelPad.Command(4209 /*IDM_VIEW_WORDWRAP*/);
}


Code: Select all

//// Open binary file in associated program, if user cancel opening in AkelPad.

var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hScript;
var pOpenFile;
var lpOpenFilePtr;

if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //Script is running, second call close it.
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x435 /*AKDN_OPENDOCUMENT_START*/, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
{
  //Allow other scripts running and unlock main thread from waiting this script.
  AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);
  AkelPad.WindowGetMessage();
  AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x435 /*AKDN_OPENDOCUMENT_START*/)
  {
    lpOpenFilePtr=AkelPad.MemRead(lParam + 0 /*offsetof(NOPENDOCUMENT, pFile)*/, 2 /*DT_QWORD*/);
    pOpenFile=AkelPad.MemRead(lpOpenFilePtr, _TSTR);
  }
  else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
  {
    if (lParam == -22 /*EOD_MSGCANCELBINARY*/)
    {
      oSys.Call("shell32::ShellExecute" + _TCHAR, hMainWnd, "open", pOpenFile, 0, 0, 1 /*SW_SHOWNORMAL*/);
      //Exit program, if file opened on program start
      if (AkelPad.SendMessage(hMainWnd, 1222 /*AKD_GETMAININFO*/, 90 /*MI_ONSTART*/, 0))
        AkelPad.Command(4109 /*IDM_FILE_EXIT*/);
    }
  }
}


Code: Select all

//// Allows undo file reopen. Require flag 1 of manual parameter "EditStyle".

var hMainWnd=AkelPad.GetMainWnd();
var hWndEdit;
var oSys=AkelPad.SystemFunction();
var hScript;
var hUndoStack=0;
var lpdwFlags;
var dwFlags;

if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //Script is running, second call close it.
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
  if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x435 /*AKDN_OPENDOCUMENT_START*/, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
  {
    //Allow other scripts running and unlock main thread from waiting this script.
    AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x435 /*AKDN_OPENDOCUMENT_START*/)
  {
    hWndEdit=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, wParam);
    lpdwFlags=AkelPad.MemRead(lParam + (_X64?40:20) /*offsetof(NOPENDOCUMENT, dwFlags)*/, 3 /*DT_DWORD*/);
    dwFlags=AkelPad.MemRead(lpdwFlags, 3 /*DT_DWORD*/);
    if (dwFlags & 0x100 /*OD_REOPEN*/)
      hUndoStack=AkelPad.SendMessage(hWndEdit, 3090 /*AEM_DETACHUNDO*/, 0, 0);
  }
  else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
  {
    if (hUndoStack)
    {
      hWndEdit=AkelPad.SendMessage(hMainWnd, 1223 /*AKD_GETFRAMEINFO*/, 2 /*FI_WNDEDIT*/, wParam);
      if (lParam == 0 /*EOD_SUCCESS*/)
        AkelPad.SendMessage(hWndEdit, 3091 /*AEM_ATTACHUNDO*/, 0, hUndoStack);
      else
        AkelPad.SendMessage(hWndEdit, 3079 /*AEM_EMPTYUNDOBUFFER*/, 0, hUndoStack);
      hUndoStack=0;
    }
  }
}


Code: Select all

//// Add every opened file (with associated extension) to system recent documents.

var hMainWnd=AkelPad.GetMainWnd();
var oSys=AkelPad.SystemFunction();
var hScript;

if ((hScript=AkelPad.ScriptHandle(WScript.ScriptName, 3 /*SH_FINDSCRIPT*/)) && AkelPad.ScriptHandle(hScript, 13 /*SH_GETMESSAGELOOP*/))
{
  //Script is running, second call close it.
  AkelPad.ScriptHandle(hScript, 33 /*SH_CLOSESCRIPT*/);
}
else
{
  if (AkelPad.WindowSubClass(1 /*WSC_MAINPROC*/, MainCallback, 0x436 /*AKDN_OPENDOCUMENT_FINISH*/))
  {
    //Allow other scripts running and unlock main thread from waiting this script.
    AkelPad.ScriptNoMutex(0x3 /*ULT_UNLOCKSCRIPTSQUEUE|ULT_UNLOCKPROGRAMTHREAD*/);

    //Message loop
    AkelPad.WindowGetMessage();

    AkelPad.WindowUnsubClass(1 /*WSC_MAINPROC*/);
  }
}

function MainCallback(hWnd, uMsg, wParam, lParam)
{
  if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
  {
    oSys.Call("shell32::SHAddToRecentDocs", _TSTR?0x3 /*SHARD_PATHW*/:0x2 /*SHARD_PATHA*/, AkelPad.GetEditFile(0));
  }
}




2. В командной строке запуска AkelPad'а или в ручном параметре "CmdLineBegin" добавляем следующую команду:

Code: Select all

/Call("Scripts::Main", 2, "AutoScript-Sample1.js")

Posted: Mon Apr 25, 2011 4:28 pm
by DrakonHaSh
однозначно круто, что akel такой гибкий и настраиваемый скриптами почти на все, что угодно. и однозначный респект Автору за это.

у предложенного варианта есть маленький недостаточек - необходимость модификации командной строки открытия файлов, т.е. модификации реестра (файловые ассоциации) и настроек программ, вызывающих akel, а в идеале хотелось чтобы обработка событий была более универсальной (т.е. встроенной в akel или какой нить плагин)

Posted: Mon Apr 25, 2011 5:59 pm
by Instructor
DrakonHaSh
В 4.6.0 будут доступны два новых ручных параметра: "CmdLineBegin" и "CmdLineEnd". В "CmdLineBegin" можно будет указать

Code: Select all

/Call("Scripts::Main", 2, "AutoScript.js")

Posted: Wed Apr 27, 2011 7:59 am
by DrakonHaSh
класс ! спасибо !

Posted: Thu Jan 10, 2013 2:04 am
by F. Phoenix
...

Если ты обо мне, то лучше сразу плагин, позволяющий биндить команды на события - вмиг 100500 проблем решит :roll: Вот только чую, кодер все ж полегче расширить. А резидентные скрипты вечно запущенными держать ради такой штуки как-то и не тянет - скорее уж лишнюю кнопку на тулбар прилеплю. Просто было бы удобно, если б и сами нормально детектились.

Posted: Thu Jan 10, 2013 9:52 am
by FeyFre
F. Phoenix, состояниме на "сейчас" скрипы могут лишь чуть меньше чем могут плагины(с точки зрения взаимодействия с АР). Совсем на капельку меньше. 2 из 3 моих плагинов можно переписать на скрипты без потери функционала.

Posted: Thu Jan 10, 2013 1:17 pm
by Fr0sT
плагин, позволяющий биндить команды на события
Хорошая идея, в самом деле.

Posted: Thu Jan 10, 2013 3:15 pm
by FeyFre
Fr0sT, ну дык Scripts же! У меня как-то чесались руки такое сделать, так себе всё идеально представлял... но до дела просто не дошло. Скажем так, тогда не хотелось так особо тратить время на то, что никому и не нужно.

Posted: Fri Jan 11, 2013 6:47 am
by Fr0sT
FeyFre, Scripts-ом надо ко всему ручками цеплять, а тут был бы список, как макросы в Ворде: OnAppStart, OnDocLoad и т.п.

Предложение: хотя бы ini опцию, чтобы быстрой командой "сохранить как" сохранять в utf8 БЕЗ BOM. Либо добавлять этот вариант в список доступных кодировок. Поясню, почему: это меню намного быстрее для сохранения файла в нужной кодировке, чем "Файл->Сохранить как..." Ну а сам BOM, как показывает опыт, скорее вреден, чем полезен: до сих пор прорва утилит на нём затыкается.

Posted: Fri Jan 11, 2013 10:27 am
by FeyFre
Предложение: хотя бы ini опцию, чтобы быстрой командой "сохранить как" сохранять в utf8 БЕЗ BOM.
Command(4137) - Save file as UTF8 without BOM - цепляете это на гор.клавишу, меню, тулбар.
FeyFre, Scripts-ом надо ко всему ручками цеплять, а тут был бы список, как макросы в Ворде: OnAppStart, OnDocLoad и т.п.
Ну дык а кто нам помешает этот самый список организовать. Скрипт диспетчер выдаст на гора интерфейс, в котором будут перечисленны события, и можно будет тупо птичками оставить разрешить/запретить обработчики.

Posted: Mon Jan 14, 2013 11:42 pm
by F. Phoenix
Кстати, скриптом, забинденным на открытие файлов, еще было бы удобно кодировку детектить в некоторых форматах :roll:

Posted: Tue Jan 15, 2013 12:13 am
by FeyFre
Можно. Но делать то кому?
Если я возьмусь за что-то полезное, то к счастью АР у меня далеко не на первом месте.

Re: Работа скриптов в автоматическом режиме

Posted: Thu Mar 27, 2014 5:56 am
by [Yustas.NeO]
Instructor wrote:AutoScript-UndoReopen.js
А с помощью него реально сделать, чтобы AkelPad не прибивал буфер отмен когда переоткрывается сохраненный файл?
(открыли файл, откредактировали, сохранили, перешли в тоталкоммандер, выбрали этот файл и нажали F4 — в AkelPad'е у файла пропал буфер отмен)

Fr0sT wrote:сохранять в utf8 БЕЗ BOM. Либо добавлять этот вариант в список доступных кодировок.
Поддерживаю всеми руками и ногами!

Re: Работа скриптов в автоматическом режиме

Posted: Thu Mar 27, 2014 10:45 am
by Drugmix
[Yustas.NeO] wrote:А с помощью него реально сделать, чтобы AkelPad не прибивал буфер отмен когда переоткрывается сохраненный файл?
https://github.com/Infocatcher/AkelPad_ ... eReopen.js
но этот скрипт не поддерживает автозагрузку, его надо вызывать вручную после ответа "нет" на вопрос акелпада "файл был изменён, переоткрыть?"

Re: Работа скриптов в автоматическом режиме

Posted: Thu Mar 27, 2014 12:57 pm
by DV
А в чём функциональное отличие этого скрипта от предложенного Инструктором, помимо того, что второй работает автоматически? --
AutoScript-UndoReopen.js
В смысле, в чём проявляется различие в работе с буфером Undo?