AkelPad Forum Index AkelPad
Support forum
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Работа скриптов в автоматическом режиме
Goto page 1, 2  Next
 
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian)
View previous topic :: View next topic  
Author Message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5423

PostPosted: Sun Apr 24, 2011 4:21 pm    Post subject: Работа скриптов в автоматическом режиме Reply with quote

1. Примеры скриптов, которые после запуска останутся в памяти и будет реагировать на определенные события в AkelPad'е:

AutoScript-Sample1.js

Code:
//// 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*/);
}



AutoScript-Sample2.js

Code:
//// 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*/);
}



AutoScript-OpenCancelledBinary.js

Code:
//// 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*/);
    }
  }
}



AutoScript-UndoReopen.js

Code:
//// 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*/)
  {
    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(wParam, 3090 /*AEM_DETACHUNDO*/, 0, 0);
  }
  else if (uMsg == 0x436 /*AKDN_OPENDOCUMENT_FINISH*/)
  {
    if (hUndoStack)
    {
      AkelPad.SendMessage(wParam, 3091 /*AEM_ATTACHUNDO*/, 0, hUndoStack);
      hUndoStack=0;
    }
  }
}



AutoScript-AddToRecent.js

Code:
//// 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:
/Call("Scripts::Main", 2, "AutoScript-Sample1.js")


Last edited by Instructor on Mon Jul 07, 2014 5:44 am; edited 19 times in total
Back to top
View user's profile Send private message Send e-mail
DrakonHaSh



Joined: 19 Mar 2011
Posts: 117

PostPosted: Mon Apr 25, 2011 4:28 pm    Post subject: Reply with quote

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

у предложенного варианта есть маленький недостаточек - необходимость модификации командной строки открытия файлов, т.е. модификации реестра (файловые ассоциации) и настроек программ, вызывающих akel, а в идеале хотелось чтобы обработка событий была более универсальной (т.е. встроенной в akel или какой нить плагин)
Back to top
View user's profile Send private message
Instructor
Site Admin


Joined: 06 Jul 2006
Posts: 5423

PostPosted: Mon Apr 25, 2011 5:59 pm    Post subject: Reply with quote

DrakonHaSh
В 4.6.0 будут доступны два новых ручных параметра: "CmdLineBegin" и "CmdLineEnd". В "CmdLineBegin" можно будет указать
Code:
/Call("Scripts::Main", 2, "AutoScript.js")


Last edited by Instructor on Wed May 11, 2011 7:30 pm; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
DrakonHaSh



Joined: 19 Mar 2011
Posts: 117

PostPosted: Wed Apr 27, 2011 7:59 am    Post subject: Reply with quote

класс ! спасибо !
Back to top
View user's profile Send private message
F. Phoenix



Joined: 24 Dec 2011
Posts: 124

PostPosted: Thu Jan 10, 2013 2:04 am    Post subject: Reply with quote

...

Если ты обо мне, то лучше сразу плагин, позволяющий биндить команды на события - вмиг 100500 проблем решит Rolling Eyes Вот только чую, кодер все ж полегче расширить. А резидентные скрипты вечно запущенными держать ради такой штуки как-то и не тянет - скорее уж лишнюю кнопку на тулбар прилеплю. Просто было бы удобно, если б и сами нормально детектились.
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2054
Location: Vinnitsa, Ukraine

PostPosted: Thu Jan 10, 2013 9:52 am    Post subject: Reply with quote

F. Phoenix, состояниме на "сейчас" скрипы могут лишь чуть меньше чем могут плагины(с точки зрения взаимодействия с АР). Совсем на капельку меньше. 2 из 3 моих плагинов можно переписать на скрипты без потери функционала.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Thu Jan 10, 2013 1:17 pm    Post subject: Reply with quote

Quote:
плагин, позволяющий биндить команды на события

Хорошая идея, в самом деле.
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2054
Location: Vinnitsa, Ukraine

PostPosted: Thu Jan 10, 2013 3:15 pm    Post subject: Reply with quote

Fr0sT, ну дык Scripts же! У меня как-то чесались руки такое сделать, так себе всё идеально представлял... но до дела просто не дошло. Скажем так, тогда не хотелось так особо тратить время на то, что никому и не нужно.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Fr0sT



Joined: 24 Jul 2007
Posts: 876

PostPosted: Fri Jan 11, 2013 6:47 am    Post subject: Reply with quote

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

Предложение: хотя бы ini опцию, чтобы быстрой командой "сохранить как" сохранять в utf8 БЕЗ BOM. Либо добавлять этот вариант в список доступных кодировок. Поясню, почему: это меню намного быстрее для сохранения файла в нужной кодировке, чем "Файл->Сохранить как..." Ну а сам BOM, как показывает опыт, скорее вреден, чем полезен: до сих пор прорва утилит на нём затыкается.
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2054
Location: Vinnitsa, Ukraine

PostPosted: Fri Jan 11, 2013 10:27 am    Post subject: Reply with quote

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

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

Ну дык а кто нам помешает этот самый список организовать. Скрипт диспетчер выдаст на гора интерфейс, в котором будут перечисленны события, и можно будет тупо птичками оставить разрешить/запретить обработчики.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
F. Phoenix



Joined: 24 Dec 2011
Posts: 124

PostPosted: Mon Jan 14, 2013 11:42 pm    Post subject: Reply with quote

Кстати, скриптом, забинденным на открытие файлов, еще было бы удобно кодировку детектить в некоторых форматах Rolling Eyes
Back to top
View user's profile Send private message
FeyFre



Joined: 07 Aug 2007
Posts: 2054
Location: Vinnitsa, Ukraine

PostPosted: Tue Jan 15, 2013 12:13 am    Post subject: Reply with quote

Можно. Но делать то кому?
Если я возьмусь за что-то полезное, то к счастью АР у меня далеко не на первом месте.
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
[Yustas.NeO]



Joined: 12 Mar 2007
Posts: 258

PostPosted: Thu Mar 27, 2014 5:56 am    Post subject: Re: Работа скриптов в автоматическом режиме Reply with quote

Instructor wrote:
AutoScript-UndoReopen.js

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


Fr0sT wrote:
сохранять в utf8 БЕЗ BOM. Либо добавлять этот вариант в список доступных кодировок.
Поддерживаю всеми руками и ногами!
Back to top
View user's profile Send private message
Drugmix



Joined: 08 Apr 2013
Posts: 446

PostPosted: Thu Mar 27, 2014 10:45 am    Post subject: Re: Работа скриптов в автоматическом режиме Reply with quote

[Yustas.NeO] wrote:
А с помощью него реально сделать, чтобы AkelPad не прибивал буфер отмен когда переоткрывается сохраненный файл?

https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoableReopen.js
но этот скрипт не поддерживает автозагрузку, его надо вызывать вручную после ответа "нет" на вопрос акелпада "файл был изменён, переоткрыть?"
Back to top
View user's profile Send private message
DV



Joined: 16 Nov 2006
Posts: 852
Location: Kyiv, Ukraine

PostPosted: Thu Mar 27, 2014 12:57 pm    Post subject: Re: Работа скриптов в автоматическом режиме Reply with quote

Drugmix wrote:
https://github.com/Infocatcher/AkelPad_scripts/blob/master/undoableReopen.js

А в чём функциональное отличие этого скрипта от предложенного Инструктором, помимо того, что второй работает автоматически? --
AutoScript-UndoReopen.js
В смысле, в чём проявляется различие в работе с буфером Undo?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    AkelPad Forum Index -> Discussion (Russian) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


SourceForge.net Logo Powered by phpBB © 2001, 2005 phpBB Group