Scripts discussion (1)

Discuss and announce AkelPad plugins
Locked
  • Author
  • Message
Offline
Posts: 3234
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Infocatcher wrote:Да-да, так оно гораздо быстрее правится.
Я просто думал, что нагружаю своими проблемами :-)

По _punctuationFixer.js остались баги:

Code: Select all

) ,
) :
) ;
– >
«текст! »
может быть Вы обновлённый файлик не залили себе на сайт?

Ещё у меня предложение: можно ли исправление символа, идущего после точни, на большой сделать параметром с возможностью передавать его из ContextMenu-плагина?
Просто свои тексты я пишу без таких лагов, но много использую сокращений. Сделал бы 2 разных вызова: для своих текстов и для чужих.
Infocatcher wrote:Если только втыкать на место курсора маркер в виде псевдослучайной строки, а потом его удалять и ставить туда курсор. Последнее изменение при таком раскладе выделить проще (точнее, это не должно сказаться на работе предыдущих замен). А вот что делать с положением прокрутки, я не знаю.
По-другому никак, видимо – пересчитывать положение при заменах весьма проблемно и может сказаться на быстродействии.
Проще всего, наверное, перед началом работы скрипта запомнить позицию курсора, а потом его установить туда же - погрешность будет небольшая.
А по прокрутке, разве не подходит код, что Instructor выкладывал?
Infocatcher wrote:Там какбэ не написано «вставить сюда /**/». К тому же, я не могу это воспроизвести – если возможны оба типа комментирования, у меня комментируется текущая строка в виде //
Сейчас скачал скрипт, сохранил, ничего внутри не меняя, пробовал на обычном текстовом файле - у меня ставится /**/
Infocatcher wrote:Надо бы сделать текстовый файлик с разными хитрыми ссылками[/url] для тестирования...
Вот такая ссылка:

Code: Select all

Notes://ServerName/C2256FF9002F289B//7D730EDA78A0517FC22571EA003FE6B2
очень похожа на обычную http, только 2 слэша подряд в середине.

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

Post by Infocatcher »

VladSh wrote:Я просто думал, что нагружаю своими проблемами :-)
Так кто ж меня нагружаться-то заставит. :)
А баги известные лучше багов неизвестных.
По _punctuationFixer.js остались баги:

Code: Select all

) ,
) :
) ;
– >
«текст! »
может быть Вы обновлённый файлик не залили себе на сайт?
Судя по комментам в скрипте, «– >» я точно правил.
С кавычками подправил, но пришлось немного попередвигать замены – могло и сломаться что-нибудь.
Еще может быть проблема с кэшированием, потому как соответствующие заголовки ответов сервера мне не подвластны. Впрочем, можно и так: _punctuationFixer.js?v=0.0.2.5 (хотя при таком способе я как-то наблюдал весьма странные баги).
Ещё у меня предложение: можно ли исправление символа, идущего после точни, на большой сделать параметром с возможностью передавать его из ContextMenu-плагина?
Каюсь, фича есть, а описания нету.

Code: Select all

var fixerForceUpperCase = true;
и
Call("Scripts::Main", 1, "punctuationFixer.js", "-ignorecase", 0)
Проще всего, наверное, перед началом работы скрипта запомнить позицию курсора, а потом его установить туда же - погрешность будет небольшая.
Хотя мне и не нравится, что оно едет, но

Code: Select all

var fixerSaveSelPos = true;
для переключения. :)
А по прокрутке, разве не подходит код, что Instructor выкладывал?
Оно и используется, но это запомнить и восстановить, а не прокрутить к нужному месту.
Сейчас скачал скрипт, сохранил, ничего внутри не меняя, пробовал на обычном текстовом файле - у меня ставится /**/
На обычном текстовом файле должно спрашивать расширение для определения способа комментирования.
Как бы там ни было, пока что исправил добавление комментариев на пустых строках при наличии только блочных комментариев. И убрал лишнее из функции для чтения и записи последнего использованного расширения в реестр (требуется для обработки несохраненных или неизвестных файлов): toggleComments.js.
Вот такая ссылка:

Code: Select all

Notes://ServerName/C2256FF9002F289B//7D730EDA78A0517FC22571EA003FE6B2
очень похожа на обычную http, только 2 слэша подряд в середине.
Что-то меня не радуют это двоящиеся слэши: ///getLinks.js (а работает). Но распознает и ладно. :)

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

Post by VladSh »

Infocatcher
Беглым просмотром - работает!

Code: Select all

"Punctuation Fixer alien" Exec(`WScript "%a\AkelFiles\Plugs\Scripts\PunctuationFixer.js" "-ignorecase"`)
Если что-то найду ещё, то буду терроризировать :D

Единственное, что не удалось заставить работать - это toggleComments.js.
Не очень хорошо, что он не заменяет выделенный текст, а добавляет спереди и сзади символы комментов. Получается отмена действия идёт не в 1 раз, а в несколько.
IMHO, лучше выделенный текст брать в переменную, её обрабатывать (добавлять именно к ней что-то), а потом заменять ей выделение. Тогда все действия будут вмещаться в одну отмену естественным образом.
Last edited by VladSh on Mon Jan 31, 2011 9:15 am, edited 1 time in total.

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

Post by Infocatcher »

VladSh wrote:"Punctuation Fixer alien"
:D
Единственное, что не удалось заставить работать - это toggleComments.js.
Ещё не очень хорошо, что он не заменяет выделенный текст, а добавляет спереди и сзади символы комментов. Получается отмена действия идёт не в 1 раз, а в несколько.
Ну, там перед обработкой вытаскивается весь текст через выделить все – получить выделенный текст, но замена текста в окне AkelPad'а производится только одна, так что и отменяться должно за один раз. Разве что выделение при этом не совсем удобное происходит.
Или приведите описание действий, приводящих к этому, а то я не могу повторить.

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

Post by VladSh »

Infocatcher wrote:Или приведите описание действий, приводящих к этому, а то я не могу повторить.
О-ё-ё-ёй!!! Нажимал на комбинацию клавиш и был свято уверен, что запускаю Ваш скрипт!
Оказалось, что запускаю какое-то старьё!
Сорри, ввёл Вас в заблуждение! Оказывается я всё это время скрипт по комментам "тестил" не тот! :shock:
Н-да... давно у меня не было такого маразма :? :mrgreen:

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

Post by Infocatcher »

VladSh wrote:У меня скрипты запускаются с помощью WScript, чтобы галочки в меню не было.
Тире перед названием:

Code: Select all

-"Что-нибудь" Call("Scripts::Main", 1, "someScript.js", "", 0)
– и галочки не будет.
Оказалось, что запускаю какое-то старьё!
Вот и разобрались. :D

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

Post by VladSh »

Infocatcher wrote:Тире перед названием:

Code: Select all

-"Что-нибудь" Call("Scripts::Main", 1, "someScript.js", "", 0)
– и галочки не будет.
И склероз, как оказывается, настиг))) Я ж это когда-то знал!
Кстати, не знаю почему, но Command гораздо быстрее работает, чем Exec.


Upd:
После замены всех Exec'ов на Call почему-то все скрипты стали вылетать на первой же строке с использованием WScript.Arguments; например, простенький старый скриптец CopyToCBFileName.js. Вызов:

Code: Select all

-"FileName" Call("Scripts::Main", 1, "CopyToCBFileName.js" "%f", 0)
Может кто-то прояснит ситуэйшен?
Можно ли откорректировать скрипт, чтобы он работал и при запуске и через Exec и через Call?

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

Post by Instructor »

VladSh
Запятая нужна:

Code: Select all

-"FileName" Call("Scripts::Main", 1, "CopyToCBFileName.js", "%f", 0)

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

Post by VladSh »

Instructor
:oops:
Спасибо!

Всё, надо идти отдыхать...

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

Post by VladSh »

Mr.Merak (Ср Апр 22, 2009 11:12 am) wrote:Если открыть AkelPad, что-то напечатать, а потом ВСЕ УДАЛИТЬ - то при закрытии будет запрос о сохранении. Т.е. нужна проверка - пустой ли файл.
Я тоже когда-то хотел такого :-) Но...

Есть пара путей решения:

1. Отменить всё и закрыть вкладку.
Нужно написать свой скрипт: для отмены всего можно использовать скрипт UndoAll.js, а для закрытия текущей вкладки можно выдрать строчку из нижеследующего скрипта.

2. Удалить "файл" без подтверждения.
Это делает DeleteFile.js. Принцип работы прост - даём команду Акелу, что "типа никаких изменений не было, так что не спрашивай сохранять изменения или нет" :-) потом просто удаляем файл с закрытием его вкладки.

Я использую 2-й способ, т.к. он более универсален - может удалять файл с диска, а может просто удалить текущую вкладку, т.е. как раз для случая, когда файл не сохранялся на диск.
Ещё 2-й способ удобен тем, что на этот скрипт я повесил виндовое сочетание клавиш удаления файла мимо корзины (для единообразия) - Shift+Del. Как это сделать используя клавишу Del подсказал Instructor. В итоге в Scripts.ini заменил DeleteFile.js=2349 на DeleteFile.js=2350.


N.B.
Не, убрал комбинацию Shift+Del. На нотеке работал (неудобно и непривычно), хотел выделить всю строку по Shift+End, а случайно получилось Shift+Del...
Итого, вывод: ну его нафиг! :) Лучше когда такое, жёсткое, удаление в контекстном меню сидит.

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

Post by Infocatcher »

toggleComments.js
Чуть больше настроек, задаваемых через аргументы:
-noSpaces | -noSpaces=false | -noSpaces=true
-preferLineComments | -preferLineComments=false | -preferLineComments=true
-ignoreBlockCommentsInSel | -ignoreBlockCommentsInSel=false | -ignoreBlockCommentsInSel=true
-multipleEnabled | -multipleEnabled=false | -multipleEnabled=true
Имена параметров регистронезависимы, порядок следования значения не имеет. Если значение не указано, оно принимается за true.
-preferLineComments позволяет всегда использовать однострочное комментирование вида

Code: Select all

//...
//...
, если это возможно.

+ исправлено добавление однострочных комментариев при наличии в выделении пустых строк.

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

Дискуссия по поводу NewFilebyExt.js (из лички)

Post by VladSh »

Infocatcher (Ср Апр 29, 2009 6:40 pm) wrote:про NewFilebyExt.js.
Не проще сделать папку с шаблонами и при наличии там подходящего шаблона делать AkelPad.ReadFile() ?
Удобнее настраивать будет.
VladSh (Чт Апр 30, 2009 1:53 pm) wrote:Я думаю, что так настраивать, конечно будет удобнее, но не будет ли это дольше работать? У меня все скрипты, которые работают с ReadFile и eval дольше работают. Или это моё субъективное мнение? Как оно есть на самом деле?

Если обсуждать чисто скорость.
- в таком варианте, как сейчас, время расходуется на switch;
- в варианте с ReadFile время расходуется на определение присутствия файла на диске + на операцию ReadFile + на операцию eval.

Я сам и предлагал такой вариант - вынести параметры в отдельные файлы, но сейчас сам задумался...

Вообще, если разобраться, то этот скрипт вообще не нужен, если бы Instructor согласился добавить параметр в AutoComplete, позволяющий чётко указать имя автоподстановки, которую сейчас вставлять! Например мы бы договорились, что автоподстановка с шаблоном для создания нового файла будет называться, к примеру, NEWFILETEMPLATE, и скриптом вызывали бы просто одну строку:

Code: Select all

AkelPad.Call("AutoComplete::Main", 1, Ext, "NEWFILETEMPLATE");
тогда шаблоны бы хранились в тех же файлах, что и автоподстановки - это было бы идеальным решением! Осталось бы только вызвать ещё одну строку с установкой подсветки и всё.

У меня был ещё один вариант.
Читал, что в JS все функции - это и объекты и строки одновременно. Т.е. функцию можно прямо-таки создать на лету.
У меня давно мечта - уйти от switch с помощью генерации имени функции, и вызывать уже ранее заготовленную функцию по заданному имени, например:

Code: Select all

function InsertTemplateFor_HTML()
{
	AkelPad.ReplaceSel('<!DOCTYPE ...');
}

function InsertTemplateFor_php()
{
	AkelPad.ReplaceSel('<?php\n\t\n?>');
}
и т.д.

А при выполнении кода вычислять имя функции и соответственно вызывать нужную.
Можно ли сделать такое?
Подозреваю, что можно вычислять через eval... а можно ли как-то более культурно?

Какой всё-таки вариант предпочтительнее для данного скрипта? Делаем всё-таки через ReadFile и eval?

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

Re: Дискуссия по поводу NewFilebyExt.js (из лички)

Post by Infocatcher »

VladSh wrote:Если обсуждать чисто скорость.
- в таком варианте, как сейчас, время расходуется на switch;
- в варианте с ReadFile время расходуется на определение присутствия файла на диске + на операцию ReadFile + на операцию eval.
Не думаю, что можно как-то уловить время, потраченное на switch. :)
А так –

Code: Select all

var d0 = new Date();
// code...
WScript.Echo(new Date() - d0);
– в миллисекундах.
Или через

Code: Select all

new Date().getTime()
Хотя должно и первое работать.
Читал, что в JS все функции - это и объекты и строки одновременно. Т.е. функцию можно прямо-таки создать на лету.
Ну, к объявленной функции можно обратиться по ее имени – если знать, «чьим свойством (методом)» она являются.

Code: Select all

var AkelPad = new ActiveXObject("AkelPad.document");
var hMainWnd = AkelPad["GetMainWnd"]();
А при выполнении кода вычислять имя функции и соответственно вызывать нужную.
Можно ли сделать такое?
Подозреваю, что можно вычислять через eval... а можно ли как-то более культурно?
Если это глобальные функции, то, наверное, как-то так:

Code: Select all

var ext = "php";
this["InsertTemplateFor_" + ext]();
Какой всё-таки вариант предпочтительнее для данного скрипта? Делаем всё-таки через ReadFile и eval?
switch почти наверняка быстрее, но отдельные файлы шаблонов удобнее править. Так что – в зависимости от разницы в быстродействии.

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

Post by Infocatcher »

Обновил highlighter.js.
Добавлено определение расширения для конструкций навроде <script> ... </script> в HTML (курсор должен находиться внутри).
Список для определения расширений настраивается.

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

Post by VladSh »

Infocatcher
Если бы при сохранении нового файла AkelPad каким-то образом понимал этот Set Extention и предлагал сохранить файл именно с этим расширением...

Интересно, может ли такое AkelPad?
Ну или через Scripts-плагин. Тогда нужен метод, чтобы опросить Highlight-плагин на предмет того, какая сейчас у него установлена подсветка. Потом вызов скрипта сажать на Ctrl+S... Чувствую, что скоро все стандартные команды AkelPad'а придётся для удобства заменять скриптами :?
Locked