Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 876
Joined: Tue Jul 24, 2007 8:54 am

Post by Fr0sT »

Вообще в доках по WSH есть такой пример (басик):

Code: Select all

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("C:\boot.ini")
Set TextStream = File.OpenAsTextStream(1)
MsgBox TextStream.ReadAll()
TextStream.Close
но из Акеля, как ни бился, ни черта не выходит :(

А в самом Акеле нету функции WriteFile, которая мне сейчас нужна.

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

Post by VladSh »

[Yustas.NeO]
Проверить на существование файла:

Code: Select all

var fso = new ActiveXObject("Scripting.FileSystemObject");
var bIsFileExist = fso.FileExists(pFile);
FileSystemObject

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

Post by Fr0sT »

Обновил Base64 скрипт.
* Полностью переделал логику, теперь строки конвертируются из WideChar в Multibyte перед кодированием, и наоборот. Используется текущая кодировка документа.
* Удалён параметр dec16
* Обработанный текст остаётся выделенным
* При ошибках конвертирования widechar <-> multibyte выдаётся код ошибки.

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

Post by [Yustas.NeO] »

FeyFre wrote:на MSDN
Уш пошлала, так пошлала (с) :)
Я пока еще только с "вашим" Сообщения главному окну пытаюсь разобраться, и никак не могу :) Тут не все такие "уверенные программисты" как вы ;)
Видать придется писать свой скрипт...
FeyFre wrote:А его не было когда я писал ответы, а потом ещё трижды исправлял пост. :P
Ага, то-то в том моем сообщении стоит пометка "редактировалось" ;)
FeyFre wrote:AkelPad.ReadFile() Вас чем не устраивает? Документацию читать нужно.
Это просто какая-то беда стала :( Смотрю в книгу вижу фигу :(


Fr0sT wrote:А в самом Акеле нету функции WriteFile, которая мне сейчас нужна.
И мне :(


VladSh wrote:[Yustas.NeO]
Проверить на существование файла:

Code: Select all

var fso = new ActiveXObject("Scripting.FileSystemObject");
var bIsFileExist = fso.FileExists(pFile);
FileSystemObject
Шикарно!

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

Fr0sT,
Обновил Base64 скрипт.
Скрипт теперь отлично работает, погонял его и так и сяк, работает как часы :).
В планах поддержка других инет-кодировок, если запал не пройдёт
Вот бы здорово было, подобный скрипт для Quoted-printable 8).

Instructor,

Если можно пару просьб по Вашим скриптам:

UrlEncode.js и UrlDecode.js - Не корректно работают с последним символом "?" (3F). Это ограничение какое-то или можно поправить?

DuplicateLines.js - Сейчас дублирует выделение, можно ли сделать так:
Если нет выделения - полностью дублировать строку на которой находиться курсор
Если есть выделение, дублировать строки, в которых есть выделение - полностью, не зависимо от выделенного текста?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

Deim0s wrote:DuplicateLines.js - Сейчас дублирует выделение, можно ли сделать так:
Если нет выделения - полностью дублировать строку на которой находиться курсор
Если есть выделение, дублировать строки, в которых есть выделение - полностью, не зависимо от выделенного текста?
This is done in the script: LinesMoveDuplicateSelect.js. Try it.

Offline
Posts: 139
Joined: Fri Feb 12, 2010 11:33 am

Post by Deim0s »

KDJ,
Sorry, I don't like multi-scripts. I like: one function - one script.

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

Post by VladSh »

[Yustas.NeO] wrote:
FeyFre wrote:AkelPad.ReadFile() Вас чем не устраивает? Документацию читать нужно.
Это просто какая-то беда стала :( Смотрю в книгу вижу фигу :(
Scripts-Rus.txt
Для справки по выделенному слову можно заюзать OpenScriptsHelp.js (работает с OpenHelpString.js), в них как раз есть пример ReadFile.
Ну и см. в теме "Сборник скриптов", за много лет кой-чего наворотили )) - много хороших идей и готового кода ;)

[Yustas.NeO] wrote:
Fr0sT wrote:А в самом Акеле нету функции WriteFile, которая мне сейчас нужна.
И мне :(
Пока можно сделать такой изврат:

Code: Select all

var hMainWnd = AkelPad.GetMainWnd();
var pContent = "";
var pFile = "";

//Код

//Получаем программно, а как же ещё ))
pContent = "sfhasdfj";
pFile = AkelPad.GetAkelDir() + "\\AkelFiles\" + "...";

AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4101 /*IDM_FILE_NEW*/, 0);		//Создание (закладки) нового файла

AkelPad.ReplaceSel(pContent);

AkelPad.SaveFile(AkelPad.GetEditWnd(), pFile);				//Сохраняем файл по пути и с именем pFile

AkelPad.SendMessage(hMainWnd, 273 /*WM_COMMAND*/, 4318 /*IDM_WINDOW_FRAMECLOSE*/, 0);		//Закрываем закладку только что созданного файла
Всё это будет так быстро, что на мощных компах даже не будет видно, что закладка мигает :)
Можно попробовать отключать прорисовку, но я не думаю, что это поможет, т.к. она отключает не прорисовку текущего окна редактирования (туда hEditWnd передаётся), а не всей проги.

Deim0s wrote:Sorry, I don't like multi-scripts. I like: one function - one script.
Это не всегда хорошо, особенно когда есть много общего кода: трудно поддерживать такой код...
Я использую несколько общих скриптов, как библиотеки функций, считаю, что это хорошим решением. Лучшим, чем копипаст. Копипаст хорош, когда одна меленькая функцейка, и только.

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

Post by FeyFre »

VladSh
Насчет WinHelp/HtmlHelp.
У MS действительно есть проблемы с ними.
1. Их вызов часто сопровождается утечками ресурсов.
2. В зависимости от способа их вызова, они могу блокировать/не блокировать окна приложений, вызываться/не вызываться дважды, завершаться/не завершаться после завершения родительского процесса.
3. У HtmlHelp есть свои заморочки по работе с InternetExpoler

Насчет "прорисовки окна редактирования"
WshShell.Run("%COMSPEC% /c " + "\"" + pChmKwPath + " " + pHelpPath + "\"", 0, true);
true означает "ждать пока порожденный процесс не завершится", т.е. Вы не закончите работать со справкой. А так как AkelPad у нас однопоточный, что автоматически означает что всё делается в GUI-потоке, то это означает что ни о каком взаимодействии с AkelPad не может идти речи(ни ввод/вывод, ни очередь сообщений, ни COM).
Поменяйте это флаг на false

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

Post by VladSh »

FeyFre
Спасибо огромное за чёткий ответ!
Хоть процесс cmd всё равно висит от AkelPad'а, но зато теперь можно продолжать работать в Akel'е.
8)

Offline
Posts: 767
Joined: Mon Sep 28, 2009 10:03 am
Location: Minsk, Belarus

Post by se7h »

LanguageHelp.js v1.6

1.6: corrected call-method

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

Log() snippet

Post by Fr0sT »

Чудеса, но сегодня методика вывода в файл заработала! Встречайте - Log() snippet. Также, разумеется, можно применять для любых других текстовых операций.
Файл создаётся рядом с Akelpad.exe и называется по имени вызывающего скрипта, также пишется время, правда, в дефолтном формате.

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

Re: Log() snippet

Post by VladSh »

Fr0sT wrote:Чудеса, но сегодня методика вывода в файл заработала!
Там имена функций (и всё такое) регистрозависимые, у меня когда-то тоже долго подобные траблы были...


Несколько замечаний по Log.js, не сочти за наезд :)

1. Очень плохо мусорить, тем более рядом с exe'шником. Файлы лучше ложить сюда:

Code: Select all

..:\Documents and Settings\USER\Local Settings\Temp\AkelPad\Logs\
либо в крайнем случае туда, куда сохраняет Sessions-плагин, т.е.:

Code: Select all

..:\Documents and Settings\USER\Application Data\AkelPad\Logs\
2. Формат времени можно вытягивать из настроек или прямо из AkelPad.ini, параметр DateLogFormat.

3. Сорри, но без отображения записей лога в отдельном окошке (внизу) онлайн, особого смысла в этом я не увидел. Может быть пока.

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

Post by FeyFre »

1. Очень плохо мусорить, тем более рядом с exe'шником. Файлы лучше ложить сюда:
В нашем случае лучше именно у екзешника:
1. Достаточно большой процент(хоть и по сути маленький) имеют по несколько копий Акела в системе(У меня лично три штуки). Если они будут пихать логи в одну дырку одновременно, они в конце концов поругаются, и пользователь просто ничего не сможет прочесть в них.
2. Чем дальше лог от приложения, тем хуже для сопровождения.
3. У нас лог не постоянный, а отладочный. Т.е. создается когда нужно. А не за два с половиной час 20-метровый лог(и так круглосуточно накапливается история до 20-метровых 10 логов).

В крайнем случае можете себе изменить путь сами.
3. Сорри, но без отображения записей лога в отдельном окошке (внизу) онлайн, особого смысла в этом я не увидел. Может быть пока.
Запускаем второй АкелПад, открываем файл лога, запускаем плаг просмотра лога и смотрим как прокручивается :)

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

Post by Fr0sT »

VladSh
да вроде всё копипастил из мануала, причем ошибка какая-то странная была... к тому же, когда не из Акеля запускал, всё срабатывало! Не знаю, мистика...

1. Ой, я фанат portable концепции и дико ненавижу раскидывать файлы и настройки по системе. Хотя на 7ке или под ограниченным юзером будут траблы... в этом случае можно сваливать логи в %TEMP%
2. Да, я смотрел InsertDate, но мне не показалось продуктивным в каждый вызов лога дёргать две системные функции. Так что сделал самое простое, что есть. Иначе код раздуется до сотни строк)
3. Да, действительно, можно сделать как сказал FeyFre, а можно и потом смотреть - меня лично на поиски способа вывода в лог натолкнул неприятный баг, который происходил в цикле на примерно 10ю итерацию (да ещё не каждый раз!) и рушил Акель. Для этих целей вывод в файл лучше всего.

В любом случае, это только набросок, и каждый волен переделать его по собственному желанию ;)
Locked