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 

Scripts discussion (2)
Goto page Previous  1, 2, 3 ... 40, 41, 42 ... 94, 95, 96  Next
 
Post new topic   This topic is locked: you cannot edit posts or make replies.    AkelPad Forum Index -> Plugins
View previous topic :: View next topic  
Author Message
FeyFre



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

PostPosted: Mon Jul 02, 2012 12:06 am    Post subject: Reply with quote

Visitor7, доки Вам не нужны, а вот без окна не обойдетесь. Я пока другого способа контроля не нашел(точнее не пробовал).
Во-первых, окно - как связующий мост между экземплярами скрипта. Первый создает(CreateWindowEx), второй находит(FindWindow)его и просит закруглятся(AkelPad.SendMessage(dock, 16 /*WM_CLOSE*/, 0, 0)Wink.
Во-вторых, окно как метод фонового "ничегонеделания". Фактически фоновость выполнения скрипта обеспечивает AkelPad.WindowGetMessage(); но вся соль именно в том, что оно будет сидеть в этом вызова до посинения. Выкинуть из него может только одна вещь - oSys.Call("user32::PostQuitMessage", 0); а её можно вызвать лишь единым способом - когда WindowGetMessage() вызовет что-то, что вызовет это. Это "что-то" - оконная процедура любого окна созданного скриптом. Т.е окно нужно всегда(окна бывают невидимыми, т.е. фактически работают как диспетчер команд).
Вся трудность в том, что действительной многопоточной модели в скриптах не реализовать - мешает реализация WSH, а потому приходится использовать то что есть и минимумы того что нету(причем хорошо отлаженные). У меня History.js тоже иногда падает. В плагине написать это на много проще было бы, но пока не судьба(три своих подтянуть не доходят руки, четвертого пока не очень хочется заводить).
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Visitor7



Joined: 03 Jun 2012
Posts: 88

PostPosted: Mon Jul 02, 2012 11:18 am    Post subject: Reply with quote

FeyFre
Ладно, спасибо, окно так окно.
Но все равно странно что оконная процедура выполняется в отдельном потоке, а процедура перехвата событий в потоке со скриптом.
Я как то глянул исходники плагинов - более сложный синтаксис, более низкоуровненвые методы и куча функций. Это надо знать среду, акелпад и написанные к нему библиотеки как свои пять пальцев.
Back to top
View user's profile Send private message
Visitor7



Joined: 03 Jun 2012
Posts: 88

PostPosted: Tue Jul 03, 2012 11:04 am    Post subject: Reply with quote

FeyFre
Получается, что QuitMutext = true не нужен.
И это не нужно:
Code:
   if(umsg == AKDN_MAIN_ONFINISH)
   {
      AkelPad.SendMessage(g_hDockWnd, WM_CLOSE, 0, 0);
      while(!QuitMutext)
      {
         oSys.Call("kernel32::SwitchToThread");
      }
   }

В случае с использованием объекта(окна, дока), мы сюда попросту вовсе не попадаем. А команды close и destroy AkelPad сам дает окну при выходе.
Даже перехват закрытия нашего окна при выключении AkelPad
Code:
    if(umsg == 16 /*WM_CLOSE*/)
       return 1;

не позволяет попасть в обработку события AKDN_MAIN_ONFINISH.
Странно все это. Без окна попадаем, с окном - нет.
Back to top
View user's profile Send private message
FeyFre



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

PostPosted: Wed Jul 04, 2012 11:28 am    Post subject: Reply with quote

AutohideTab.js
Code:
   if(umsg == (1046 || 1078))      //AKDN_  FRAME_ACTIVATE, OPENDOCUMENT_FINISH
       OneTabHide();
 
Чего-чего?
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Visitor7



Joined: 03 Jun 2012
Posts: 88

PostPosted: Wed Jul 04, 2012 7:51 pm    Post subject: Reply with quote

FeyFre )))) Спасибо, исправил.
Back to top
View user's profile Send private message
KDJ



Joined: 06 Mar 2010
Posts: 1338
Location: Poland

PostPosted: Wed Jul 04, 2012 8:13 pm    Post subject: Reply with quote

Visitor7

AutohideTab.js
It seems to me that it is unnecessary lpBuffer variable and memory allocation:
var lpBuffer;
if (lpBuffer=AkelPad.MemAlloc(256 * _TSIZE))
AkelPad.MemFree(lpBuffer);
Back to top
View user's profile Send private message
Visitor7



Joined: 03 Jun 2012
Posts: 88

PostPosted: Wed Jul 04, 2012 11:21 pm    Post subject: Reply with quote

KDJ Благодарю, действительно ненужное, тоже исправил.
Back to top
View user's profile Send private message
Andrey_A_A



Joined: 03 Jun 2010
Posts: 547
Location: Сочи, Хоста

PostPosted: Tue Jul 10, 2012 1:16 pm    Post subject: Reply with quote

Подскажите как сделать так, чтобы не вылетало диалоговое окно когда я пытаюсь сохранить безымянную вкладку о том, что "Строка содержит символы, которые будут утеряны..."

т.е. цель сохранить безымянную вкладку в Ansi , если есть спец символы в UTF-8

но при
Code:
If AkelPad.SaveFile(0, File) < 0 Then Call AkelPad.SaveFile(0, File, 65001, 1)


всё равно вылетает окно. Может есть метод, чтобы этого избежать?
Back to top
View user's profile Send private message Send e-mail Visit poster's website
opk44



Joined: 16 Jan 2010
Posts: 324

PostPosted: Tue Jul 10, 2012 1:56 pm    Post subject: Reply with quote

Andrey_A_A wrote:
Может есть метод, чтобы этого избежать?
1. Сохранять сразу в UTF чтобы ничего не терялось.
2. В параметрах командной строки есть опции "/L+", "/L-", "/L". Поэтому можно затем запустить AkelPad в командной строке и "заказать" ему обработку того же файла(-ов) с пересохранением его(их) в кодировке ANSI c параметром "/L-" (не сохранять файл, если потеряются символы в указанной кодировке).
Т.е. так он пересохранит кого сможет в ANSI, а кого не сможет, оставит в UTF.
P.S. Но можно было бы и просто на пункте 1 успокоиться :)
Back to top
View user's profile Send private message
Andrey_A_A



Joined: 03 Jun 2010
Posts: 547
Location: Сочи, Хоста

PostPosted: Tue Jul 10, 2012 4:20 pm    Post subject: Reply with quote

Quote:
В параметрах командной строки есть опции "/L+", "/L-", "/L"

Как-то некрасиво получается...
Сохранить, Закрыть, Открыть...
Может ещё есть варианты
Back to top
View user's profile Send private message Send e-mail Visit poster's website
wallywalters



Joined: 12 Aug 2011
Posts: 6

PostPosted: Wed Jul 11, 2012 12:52 am    Post subject: Simple script help needed Reply with quote

Can someone show me how to write a script that will search for every appearance of the word "upper" and replace it with "UPPER?"

I know I can create a macro to do this, but I'd like to write a script to search and replace a (predefined) list of words, and though I don't know the first thing about scripting, I thought I could use this as a template.

Thank you.
Back to top
View user's profile Send private message
Visitor7



Joined: 03 Jun 2012
Posts: 88

PostPosted: Wed Jul 11, 2012 10:45 am    Post subject: Re: Simple script help needed Reply with quote

wallywalters
You can use SearchReplace.js script.
The "What" field: (wordone|wordtwo|wordthree)
The "With" field": $0.toUpperCase();
Check "Regular expressions", "Case sensitive" and "Replace with function".
This will replace the word "wordone" with "WORDONE", "wordtwo" with "WORDTWO", "wordthree" with "WORDTHREE".
Uncheck "Case sensitive" then this will replace the words "wordone", "wOrdonE", "WORDONE" with "WORDONE"; "wordtwo", "WorDtwo", "WORDTWO" with "WORDTWO"... etc.
Change "What" field: (a |the | |un)(wordone|wordtwo|wordthree)(ing|er| )
then this will replace the phrases "worDtwo", "a WordoNeing", "The wordtow", "wordthreeer", "unwordone" to uppercase.
Back to top
View user's profile Send private message
wallywalters



Joined: 12 Aug 2011
Posts: 6

PostPosted: Wed Jul 11, 2012 3:16 pm    Post subject: Re: Simple script help needed Reply with quote

Visitor7, thanks for your assistance. And my apologies, because I miscommunicated what I want to do. I actually want to be able to search a document and replace every instance of "apple" with "banana" and every "blue" with "green." But unfortunately my word choice made it look like I was trying to replace lower-case words with upper-case.

How can I write a script that replaces one list of words with another (without calling up any dialog boxes)?
Back to top
View user's profile Send private message
FeyFre



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

PostPosted: Wed Jul 11, 2012 4:12 pm    Post subject: Reply with quote

It is rather simple script. Just follow instruction.
replacer.js
Code:
var text = AkelPad.GetTextRange(0, -1)

text = text
.replace(/apple/mig,"banana")
.replace(/blue/mig,"green")
//! Repeat this as match as you need(case insensitive)
// .replace(/expression-to-search/mig,"expression-to-be-replaced-by")
//! NOTE: in expression-to-search You MUST escape with "\" all entries of symbols  /()[]{}*?+ and \ itself.
//! I.e. in order to find expression "Hello \*/" you MUST use this: .replace(/Hello \\\*\//mig,"expression-to-be-replaced-by")

AkelPad.SetSel(0,-1)
AkelPad.ReplaceSel(text)
Back to top
View user's profile Send private message AIM Address Yahoo Messenger MSN Messenger
Visitor7



Joined: 03 Jun 2012
Posts: 88

PostPosted: Thu Jul 12, 2012 12:24 am    Post subject: Reply with quote

Or something like this:
script
Code:
var hMainWnd = AkelPad.GetMainWnd();
var hWndEdit = AkelPad.GetEditWnd();
var lpFrameInit;
var lpFrame;
var i;
var replaceFlags = 0x00200001 /*FR_DOWN|FR_BEGINNING*/;
var replacePair;
var fastUndo = true; //true - collects all changes in a single Undo action, false - collects every change in own Undo action
var wholeWord = true; //true - whole word, false - any part of the word
var caseSensitive = false; //true - case sensitive, false - ignore case
var allDocs = false; //true - all opened documents, false - current only
var replaceArr = ["green:red", "banana:apple","white:black","etc:et cetera"];

if (hMainWnd && hWndEdit)
{
   if (!AkelPad.IsMDI())
      allDocs = false;
   if ((!allDocs) && (AkelPad.GetSelEnd() - AkelPad.GetSelStart()))
      replaceFlags = 0x00400001 /*FR_DOWN|FR_SELECTION*/;
   if (wholeWord)
      replaceFlags += 0x00000002 /*FR_WHOLEWORD*/;
   if (caseSensitive)
      replaceFlags += 0x00000004 /*FR_MATCHCASE*/;
   lpFrameInit = AkelPad.SendMessage(hMainWnd, 1288 /*AKD_FRAMEFIND*/, 1 /*FWF_CURRENT*/, 0);
   lpFrame = lpFrameInit;
   for (;lpFrame;)
   {
      if (fastUndo)
      {
          AkelPad.SendMessage(hWndEdit, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
          AkelPad.SendMessage(hWndEdit, 3081 /*AEM_BEGINUNDOACTION*/, 0, 0);
      }
      for (i in replaceArr)
      {
         replacePair = replaceArr[i].split(':');
         AkelPad.TextReplace(0, replacePair[0], replacePair[1], replaceFlags , true);
      }
      if (fastUndo)
      {
         AkelPad.SendMessage(hWndEdit, 3082 /*AEM_ENDUNDOACTION*/, 0, 0);
         AkelPad.SendMessage(hWndEdit, 3080 /*AEM_STOPGROUPTYPING*/, 0, 0);
      }
      if (!allDocs) break;
      lpFrame = AkelPad.Command(4316 /*IDM_WINDOW_FRAMENEXT*/);
      if (lpFrame == lpFrameInit) break;
   }
}
//See "Java Script manual", "Akelpad Scripts Methods" in "Scripts AkelPad plugin" help, "AkelDLL.h", "AkelEdit.h".


Last edited by Visitor7 on Thu Jul 12, 2012 10:48 pm; edited 3 times in total
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies.    AkelPad Forum Index -> Plugins All times are GMT
Goto page Previous  1, 2, 3 ... 40, 41, 42 ... 94, 95, 96  Next
Page 41 of 96

 
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