Scripts plugin

Discuss and announce AkelPad plugins
  • Author
  • Message
Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Re: another bug?

Post by Instructor »

Surveyor
ReplaceSel - is the command to insert specified text. If selection exists it will be replaced. Command(4155) is equal to AkelPad.ReplaceSel(AkelPad.GetClipboardText()).
If you want ReplaceSel work only with selection you can use the folowing code:

Code: Select all

var AkelPad=new ActiveXObject("AkelPad.document");

if (AkelPad.GetSelStart() != AkelPad.GetSelEnd())
  AkelPad.ReplaceSel("MyText");

Offline
Posts: 147
Joined: Fri Feb 08, 2008 6:41 pm
Location: British Columbia, Canada

Thanks - additional question

Post by Surveyor »

Instructor,

Thanks for the quick reply! You must have a computer tied to you!

Another issue (probably just an oversight, not an actual error):

Scripts-Methods.txt (included with Scripts.zip) says
AkelPad.TextFind ...
Return Value
Number. Character position of the next match.
Source code indicates it returns NOERROR. This results in 0=good, -1=not found. Is that the intended return? Or should it actually return the text position?

It wouldn't be a problem if the text position was NOT returned; if MDI search is done, script can't tell what document text was found in anyway. User has to check (visually) in AkelPad.

Also, I can't seem to get the MDI search to work! I have tried passing the handle to the main AkelPad window (instead of edit window) - still returns -1. What am I doing wrong? (Note: using FR_ALLFILES by itself DOES return 0, but text is not selected and MDI document is not activated, therefore, user probably cannot tell where text was found).

Sorry to be a pest :twisted: with these "bugs"; I am including sample scripts (JS and VBS) with each function and these little things turn up as I test them. I want to make sure the documentation is accurate.

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

Post by Instructor »

Surveyor
I corrected documentation - FR_ALLFILES available only inside AkelPad. See SearchAllMDI.js

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

Post by Instructor »

Changed: removed CreateMutex, OpenMutex, CloseMutex methods - implemented internally.

Added: double execution protection.
Added: dialog resizing.


Scripts plugin v4.0

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

В новой версии плагина LineBoard улучшен переход к строке с закладкой.
Так вот, нельзя ли сделать делать аналогичное в SearchReplace.js – чтобы найденное оказывалось посередине окна, а не где-то с краю.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Похоже всё-таки баг.

При передаче параметров %f и %d в скрипты внутри получаем разные результаты: Exec возвращает полный путь (как и положено), а Call - путь до 1-го пробела, т.е. у меня это "C:\Program".
Last edited by VladSh on Thu Apr 16, 2009 9:31 pm, edited 1 time in total.

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

Post by Instructor »

VladSh

Code: Select all

-"Test" Call("Scripts::Main", 1, "Test.js", `"%f"`, 0)

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

ПОЛУЧЕНИЕ АРГУМЕНТОВ В СКРИПТЕ (2 варианта):


1. При передаче параметра внутри символов ``

Code: Select all

"ActionName" Call("Scripts::Main", 1, "ScriptName.js", `"paramValue"`, 0)
Проверку на валидность параметров нужно делать так:

Code: Select all

function getArgValue()
{
	if (WScript.Arguments(0) != "")
		return WScript.Arguments(0);
	else
		return 'Your default value';
}
2. При передаче параметров без ``, т.е.:

Code: Select all

"ActionName" Call("Scripts::Main", 1, "ScriptName.js", "paramValue", 0)
Проверку на валидность параметров нужно делать так (идею взял из кода Infocatcher'а):

Code: Select all

function getArgValue()
{
	if (WScript.Arguments.Count() && WScript.Arguments(0) != "undefined")
		return WScript.Arguments(0);
	else
		return 'Your default value';
}
1-й вариант корректнее, т.к. если во 2-м варианте передавать параметр с пробелом, то в скрипте получаем только кусок параметра, находящийся перед пробелом!

Думаю, лучше внести это в документацию по плагину.

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

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

По команде "Выполнить"

Post by VladSh »

Instructor wrote:Added: variable %u - URL address (work in "URL menu" only)

ContextMenu plugin v4.6
%u работает отлично! Смог в скрипте получить адрес сайта. Не подскажете, как перейти к сайту, т.е. открыть полученую ссылку в браузере?
Желательно как в конкретном браузере, так и в браузере "по умолчанию".
"По умолчанию" - можно было бы открыть как в командной строке (например Start -> Run). Существует ли какой-то аналог команды "Выполнить" с похожими параметрами?


Upd:
Instructor wrote:Added: environment variables support. For example:

Code: Select all

Exec(`%windir%\notepad.exe`)
ContextMenu plugin v4.5
Следующие строки в Start -> Run работает отлично:

Code: Select all

hh ms-its:%windir%\Help\ntcmds.chm::/ntcmds_o.htm
hh mk:@MSITStore:%windir%\Help\ntcmds.chm::/ntcmds.htm
hh ms-its:%windir%\Help\ntcmds.chm::/dos_diffs.htm
Но с помощью WshShell.Exec() мне заставить работать эти строки так и не удалось.
Пробовал различные варианты:

Code: Select all

"hh %windir%\Help\ntcmds.chm::/ntcmds_o.htm"
"hh `%windir%\Help\ntcmds.chm::/ntcmds_o.htm`"
"hh `%windir%\Help\ntcmds.chm`"
Слэш '\' после %windir% съедается :(

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Re: По команде "Выполнить"

Post by Infocatcher »

VladSh wrote:открыть полученую ссылку в браузере?
Желательно как в конкретном браузере, так и в браузере "по умолчанию".
Пример для браузера по умолчанию:

Code: Select all

"&Содержание" Exec('rundll32.exe shell32,ShellExec_RunDLL "%a\AkelFiles\Docs\AkelHelp-Rus.htm"')

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Re: По команде "Выполнить"

Post by VladSh »

Infocatcher

Да, что-то я затупил... Работает так:

Code: Select all

WshShell.Exec('rundll32.exe shell32,ShellExec_RunDLL "' + site + '"');
а так что-то всё равно не хочет (ошибка "Не удаётся найти указанный файл"):

Code: Select all

WshShell.Exec('iexplore.exe "' + site + '"');
хотя если вставить в Start -> Run, то открывает; мистика какая-то...

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Re: По команде "Выполнить"

Post by Infocatcher »

VladSh wrote:а так что-то всё равно не хочет (ошибка "Не удаётся найти указанный файл"):

Code: Select all

WshShell.Exec('iexplore.exe "' + site + '"');
хотя если вставить в Start -> Run, то открывает; мистика какая-то...
Я думаю, дело в том, что rundll32.exe лежит в system32\, а ассоциация
iexplore.exe <-> c:\ ... \iexplore.exe
– где-то в реестре (?).
А iexplore.exe, например, из консоли (cmd.exe) тоже не видно.

Code: Select all

var wss = new ActiveXObject("WScript.shell");
wss.Exec('"%programfiles%\\Internet Explorer\\iexplore.exe" http://akelpad.sf.net/');

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Re: По команде "Выполнить"

Post by VladSh »

Infocatcher
Щас был в туалете :mrgreen:, и, как всегда, "случайно, а не нарочно" (с) С лёгким паром :lol: вспомнил как я когда-то похожую задачку у себя в проекте заводил с толкача:

Code: Select all

WshShell.Exec('explorer.exe "' + site + '"');
- Можно, мы с Новосельцевым поставим лошадь в шкаф?
- А она там поместится?
- Впихнём!!! (с) Служебный роман
:lol:

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Почему-то иногда крашится при вызове скрипта без каких бы то ни было адекватных причин.
Есть подозрения на проблемы при выполнении кода вида

Code: Select all

var AkelPad = new ActiveXObject("AkelPad.document");
var hWndEdit = AkelPad.GetEditWnd();
var oFunction = AkelPad.SystemFunction();

function toggleRedraw(hWnd, bRedraw) {
	AkelPad.SendMessage(hWnd, 11 /*WM_SETREDRAW*/, bRedraw, 0);
	if(!bRedraw)
		return;
	oFunction.AddParameter(hWnd);
	oFunction.AddParameter(0);
	oFunction.AddParameter(true);
	oFunction.Call("user32::InvalidateRect");
}

toggleRedraw(hWndEdit, false);
// Do something...
toggleRedraw(hWndEdit, true);
Однако тот же код на том же файле, запущенный при тех же условиях, может и не привести к падению. Но когда прямо сейчас упало несколько раз подряд, помогла заглушка вида

Code: Select all

function toggleRedraw(hWnd, bRedraw) {
	return;
А вот по возвращении исходного кода – падений как не бывало. :shock:

Еще перед системным сообщением об упавшем AkelPad.exe видно, что подсветка синтаксиса какая-то не полная.

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

Post by Instructor »

Added: optional parameter to MemAlloc, MemCopy, MemRead, MemFree to work with exe memory.


Scripts plugin v4.3
Post Reply