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

Russian main discussion
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

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

Post 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")
Last edited by Instructor on Sun Dec 13, 2015 11:35 am, edited 22 times in total.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

однозначно круто, что akel такой гибкий и настраиваемый скриптами почти на все, что угодно. и однозначный респект Автору за это.

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

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

Post by Instructor »

DrakonHaSh
В 4.6.0 будут доступны два новых ручных параметра: "CmdLineBegin" и "CmdLineEnd". В "CmdLineBegin" можно будет указать

Code: Select all

/Call("Scripts::Main", 2, "AutoScript.js")
Last edited by Instructor on Wed May 11, 2011 7:30 pm, edited 1 time in total.

Offline
Posts: 122
Joined: Sat Mar 19, 2011 10:20 pm

Post by DrakonHaSh »

класс ! спасибо !

Offline
Posts: 176
Joined: Sat Dec 24, 2011 4:05 pm

Post by F. Phoenix »

...

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

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

Post by FeyFre »

F. Phoenix, состояниме на "сейчас" скрипы могут лишь чуть меньше чем могут плагины(с точки зрения взаимодействия с АР). Совсем на капельку меньше. 2 из 3 моих плагинов можно переписать на скрипты без потери функционала.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

плагин, позволяющий биндить команды на события
Хорошая идея, в самом деле.

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

Post by FeyFre »

Fr0sT, ну дык Scripts же! У меня как-то чесались руки такое сделать, так себе всё идеально представлял... но до дела просто не дошло. Скажем так, тогда не хотелось так особо тратить время на то, что никому и не нужно.

Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

FeyFre, Scripts-ом надо ко всему ручками цеплять, а тут был бы список, как макросы в Ворде: OnAppStart, OnDocLoad и т.п.

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

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

Post by FeyFre »

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

Offline
Posts: 176
Joined: Sat Dec 24, 2011 4:05 pm

Post by F. Phoenix »

Кстати, скриптом, забинденным на открытие файлов, еще было бы удобно кодировку детектить в некоторых форматах :roll:

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

Post by FeyFre »

Можно. Но делать то кому?
Если я возьмусь за что-то полезное, то к счастью АР у меня далеко не на первом месте.

Offline
Posts: 267
Joined: Mon Mar 12, 2007 3:45 pm

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

Post by [Yustas.NeO] »

Instructor wrote:AutoScript-UndoReopen.js
А с помощью него реально сделать, чтобы AkelPad не прибивал буфер отмен когда переоткрывается сохраненный файл?
(открыли файл, откредактировали, сохранили, перешли в тоталкоммандер, выбрали этот файл и нажали F4 — в AkelPad'е у файла пропал буфер отмен)

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

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

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

Post by Drugmix »

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

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

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

Post by DV »

А в чём функциональное отличие этого скрипта от предложенного Инструктором, помимо того, что второй работает автоматически? --
AutoScript-UndoReopen.js
В смысле, в чём проявляется различие в работе с буфером Undo?
Post Reply