| View previous topic :: View next topic |
| Author |
Message |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Mon Jul 02, 2012 12:06 am Post subject: |
|
|
Visitor7, доки Вам не нужны, а вот без окна не обойдетесь. Я пока другого способа контроля не нашел(точнее не пробовал).
Во-первых, окно - как связующий мост между экземплярами скрипта. Первый создает(CreateWindowEx), второй находит(FindWindow)его и просит закруглятся(AkelPad.SendMessage(dock, 16 /*WM_CLOSE*/, 0, 0) .
Во-вторых, окно как метод фонового "ничегонеделания". Фактически фоновость выполнения скрипта обеспечивает AkelPad.WindowGetMessage(); но вся соль именно в том, что оно будет сидеть в этом вызова до посинения. Выкинуть из него может только одна вещь - oSys.Call("user32::PostQuitMessage", 0); а её можно вызвать лишь единым способом - когда WindowGetMessage() вызовет что-то, что вызовет это. Это "что-то" - оконная процедура любого окна созданного скриптом. Т.е окно нужно всегда(окна бывают невидимыми, т.е. фактически работают как диспетчер команд).
Вся трудность в том, что действительной многопоточной модели в скриптах не реализовать - мешает реализация WSH, а потому приходится использовать то что есть и минимумы того что нету(причем хорошо отлаженные). У меня History.js тоже иногда падает. В плагине написать это на много проще было бы, но пока не судьба(три своих подтянуть не доходят руки, четвертого пока не очень хочется заводить). |
|
| Back to top |
|
 |
Visitor7
Joined: 03 Jun 2012 Posts: 88
|
Posted: Mon Jul 02, 2012 11:18 am Post subject: |
|
|
FeyFre
Ладно, спасибо, окно так окно.
Но все равно странно что оконная процедура выполняется в отдельном потоке, а процедура перехвата событий в потоке со скриптом.
Я как то глянул исходники плагинов - более сложный синтаксис, более низкоуровненвые методы и куча функций. Это надо знать среду, акелпад и написанные к нему библиотеки как свои пять пальцев. |
|
| Back to top |
|
 |
Visitor7
Joined: 03 Jun 2012 Posts: 88
|
Posted: Tue Jul 03, 2012 11:04 am Post subject: |
|
|
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 |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Wed Jul 04, 2012 11:28 am Post subject: |
|
|
AutohideTab.js | Code: | if(umsg == (1046 || 1078)) //AKDN_ FRAME_ACTIVATE, OPENDOCUMENT_FINISH
OneTabHide();
| Чего-чего? |
|
| Back to top |
|
 |
Visitor7
Joined: 03 Jun 2012 Posts: 88
|
Posted: Wed Jul 04, 2012 7:51 pm Post subject: |
|
|
| FeyFre )))) Спасибо, исправил. |
|
| Back to top |
|
 |
KDJ
Joined: 06 Mar 2010 Posts: 1066 Location: Poland
|
Posted: Wed Jul 04, 2012 8:13 pm Post subject: |
|
|
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 |
|
 |
Visitor7
Joined: 03 Jun 2012 Posts: 88
|
Posted: Wed Jul 04, 2012 11:21 pm Post subject: |
|
|
| KDJ Благодарю, действительно ненужное, тоже исправил. |
|
| Back to top |
|
 |
Andrey_A_A
Joined: 03 Jun 2010 Posts: 477 Location: Сочи, Хоста
|
Posted: Tue Jul 10, 2012 1:16 pm Post subject: |
|
|
Подскажите как сделать так, чтобы не вылетало диалоговое окно когда я пытаюсь сохранить безымянную вкладку о том, что "Строка содержит символы, которые будут утеряны..."
т.е. цель сохранить безымянную вкладку в Ansi , если есть спец символы в UTF-8
но при
| Code: | | If AkelPad.SaveFile(0, File) < 0 Then Call AkelPad.SaveFile(0, File, 65001, 1) |
всё равно вылетает окно. Может есть метод, чтобы этого избежать? |
|
| Back to top |
|
 |
opk44
Joined: 16 Jan 2010 Posts: 183
|
Posted: Tue Jul 10, 2012 1:56 pm Post subject: |
|
|
| Andrey_A_A wrote: | | Может есть метод, чтобы этого избежать? | 1. Сохранять сразу в UTF чтобы ничего не терялось.
2. В параметрах командной строки есть опции "/L+", "/L-", "/L". Поэтому можно затем запустить AkelPad в командной строке и "заказать" ему обработку того же файла(-ов) с пересохранением его(их) в кодировке ANSI c параметром "/L-" (не сохранять файл, если потеряются символы в указанной кодировке).
Т.е. так он пересохранит кого сможет в ANSI, а кого не сможет, оставит в UTF.
P.S. Но можно было бы и просто на пункте 1 успокоиться :) |
|
| Back to top |
|
 |
Andrey_A_A
Joined: 03 Jun 2010 Posts: 477 Location: Сочи, Хоста
|
Posted: Tue Jul 10, 2012 4:20 pm Post subject: |
|
|
| Quote: | | В параметрах командной строки есть опции "/L+", "/L-", "/L" |
Как-то некрасиво получается...
Сохранить, Закрыть, Открыть...
Может ещё есть варианты |
|
| Back to top |
|
 |
wallywalters
Joined: 12 Aug 2011 Posts: 6
|
Posted: Wed Jul 11, 2012 12:52 am Post subject: Simple script help needed |
|
|
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 |
|
 |
Visitor7
Joined: 03 Jun 2012 Posts: 88
|
Posted: Wed Jul 11, 2012 10:45 am Post subject: Re: Simple script help needed |
|
|
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 |
|
 |
wallywalters
Joined: 12 Aug 2011 Posts: 6
|
Posted: Wed Jul 11, 2012 3:16 pm Post subject: Re: Simple script help needed |
|
|
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 |
|
 |
FeyFre
Joined: 07 Aug 2007 Posts: 1888 Location: Vinnitsa, Ukraine
|
Posted: Wed Jul 11, 2012 4:12 pm Post subject: |
|
|
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 |
|
 |
Visitor7
Joined: 03 Jun 2012 Posts: 88
|
Posted: Thu Jul 12, 2012 12:24 am Post subject: |
|
|
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 |
|
 |
|
|
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
|
Powered by phpBB © 2001, 2005 phpBB Group
|