Ru-Board.club
← Вернуться в раздел «Программы»

» SciTE - Open Source Text Editor for Windows & Linux

Автор: mozers
Дата сообщения: 14.09.2006 17:14
Реализация записи макросов с помощью LUA
Ну, че, народ? Начинаем жить!

А со мной поделился кодом Мишель Форал. Теперь из встроенного LUA можно выполнять команды вида
scite.MenuCommand(IDM_WHATEVER)

C удовольствием убираю оба пункта из списка Нерешенные задачи и вопросы
Автор: Moon_aka_Sun
Дата сообщения: 14.09.2006 23:48

Цитата:
Ты не против?
Да чего ж возражать?

Я ещё придумал, как можно запрашивать ввод от пользователя - через виндовс скрипт. [more=Таким примерно макаром]Таким примерно макаром:

function input_box(prompt,default,title)
local txt = 'WScript.Echo InputBox("'..prompt..'","'..title..'","'..default..'")'
local tmp = "C:\\TMP\\"
local tmp1, tmp2 = tmp.."SCRPT.VBS", tmp.."RESLT.TMP"
local f = io.open(tmp1, 'wb') f:write(txt) f:close()
os.execute("cscript //Nologo "..tmp1.." > "..tmp2)
f = io.open(tmp2) local out = f:read('*all') f:close()
return out
end

Правда, os.execute вываливает консольное окно и легко это не побороть.[/more]
Автор: mozers
Дата сообщения: 15.09.2006 09:59
Moon_aka_Sun
Думал я о таком способе... Если HTA пользовать, то не только InputBox, а вообще любую форму ввода можно выводить. Только способ передачи данных из формы в скрипт с помощью временного файла мне не нравится. С помощью COM-сервера все делается более элегануто

Цитата:
os.execute вываливает консольное окно и легко это не побороть
Ага, противная вещь. Достало не только тебя. Тут группа товарищей придумала метод io.popen (cmd) который выполняет команду без этого окна. Я пытался использовать этот код да что то не получилось Глянь - может у тебя получится? (Посмотри личный ящик)
Автор: mozers
Дата сообщения: 15.09.2006 16:24
Сборка Мишеля Форала
mirk уже как то восхищался этим чудом...
Так вот я взял Offline Explorer и тупо выкачал все файло с его SVN Репозитария.
Потом разделил на 2 части и запаковал RAR-ом.
Получились исходники и откомпилированный пакет.
Над кодом Мишель поиздевался немало. Есть весьма интересные решения.
Думаю что некоторые из его ходов будут использованы нашими специалистами
Автор: Moon_aka_Sun
Дата сообщения: 15.09.2006 23:17
mozers

Цитата:
io.popen (cmd)
Да, через попен лучше должно быть. Или длл прикрутить (в Луа 5.1 у меня это работает, в 5.0.2, который в SciTE - нет). Или Луу саму модифицировать
Автор: vladvro
Дата сообщения: 19.09.2006 08:40
2 mozers

Цитата:
Очень бы хотелось задать несколько вопросов...
(В форуме это было бы удобнее

с удовольствием пообщаюсь и отвечу по возможности на все вопросы,
хотя меня и смутил этот форум своим единственным топиком для всех вопросов по редактору
Автор: mozers
Дата сообщения: 19.09.2006 14:15
vladvro
Во-первых - поздравляю с регистрацией!
Не Скайтом единым жив человек и когда понадобится тебе найти свежую версию какой то софтины (со всеми делами, конечно) или получить толковую консультацию по какой то важной теме то ты поймешь что Ru-Board - самый толковый форум в рунете. Такого обилия совершенно уникальной информации нет нигде.

Теперь что касается единственного топика по SciTE.
Попытки сделать большой и ветвистый форум предпринимались не раз. Mirk и сейчас подумывает об этом.
Лично я - против. Во-первых, нас (не тех, кто качает, а кто делает и обсуждает) - слишком мало.
Во-вторых здесь все обсуждаемые темы на виду, а не разбросаны по тредам и "держать руку на пульсе" гораздо проще. Ну а почтовое оповещение с полным текстом всех сообщений - это вообще - песня

Теперь - о тебе
Очень хотелось увидеть здесь, в нашем сборочном цеху, еще одного умного человека. Просто порой бывает очень сложно найти ответ на тот или иной вопрос... Если мы будем держаться вместе, то мы сможем решать такие задачи.
Народ! Это - тот гений, что запустил таки макросы в SciTE! Сколько разговоров было, только вот сделал - только он
Может быть тебя заинтересуют какие то из еще нерешенных вопросов? (в шапке)

А насчет макросов я, честно говоря, до конца не въехал...
Где же они хранятся? С именами - ясно, а сами команды? Можно ли их выудить из памяти и записать в файл?
Автор: unreal666
Дата сообщения: 19.09.2006 20:41
mozers
Я как-то спрашивал

Цитата:
Есть в SciTE переменная, содержащая имя активного в данный момент лексера?
Хочу добавить отображение активного лексера в строку состояния.

Ты дал код какой-то функции GetLexerName() .
И что мне с ней делать? Как сделать, чтобы в строке состояния показывался текущий лексер (тот код вставил в SciTEStartup.lua)?
Автор: Jus
Дата сообщения: 20.09.2006 11:06
Сборка Moon_aka_Sun порадовала тем что нормально работает calltips (проверял при работе со скриптами Python) в отличии от SciTE 1.70 Ru-Board Edition где список подсказок почему-то не появляется после ввода точки и его приходится специально вызывать по Ctrl+Space. А также большое спасибо Moon_aka_Sun за достаточно полный python.api
Пробовал просто скопировать python.api из сборки Moon_aka_Sun в Ru-Board Edition - результат не важный - не все подсказки из файла python.api попадают в список (например sys.api_version).

Подскажите как подлечить эти проблемки в Ru-Board Edition?
Автор: mozers
Дата сообщения: 20.09.2006 11:47
unreal666
Цитата:
И что мне с ней делать?
Вставить ее вызов в стандартный эвент, например так:
Код: function OnUpdateUI()
props["lexer.name"] = GetLexerName()
end
Автор: unreal666
Дата сообщения: 20.09.2006 11:55
mozers

Цитата:
Я вообще думал что сам догадаешся...

Я вообще предполагал, что нужно создавать какую-то переменную, связанную с событиями. Но я не знаю, какие события вообще есть в Скайте.
Где взять список этих стандартных событий?

Еще вопрос
Где устанавливается максимальная длина строки состояния? А то у меня уже не влазит в строку состояния всё нужное мне.

И надо как-то поправить исходники Скайта, что при поиска русских слов он искал без учета регистра.

mozers
Сделал все как ты написал. Нифига не показывает текущий лексер. Просто пустые [] выводятся.

ЗЫ. Функцию OnUpdateUI() тоже добавил в SciTEStartup.lua.
Автор: mozers
Дата сообщения: 20.09.2006 12:19
Билин! Какой Moon_aka_Sun хитрый! Он сделал оказывается, то, чего я так добивался от Нейла и его отказ вынудил меня написать скрипт для автодополнения!
Его SciTE позволяет использовать точку в качестве символа запускающего автодополнение! Таааак... Интересно... Копаем дальше... Как ты это сделал?....
Автор: gansA
Дата сообщения: 20.09.2006 12:21
mozers

Цитата:
А со мной поделился кодом Мишель Форал. Теперь из встроенного LUA можно выполнять команды вида scite.MenuCommand(IDM_WHATEVER)

Вот это действительно мощная вещь ))))
Тока где применять её практически хз , можно пару примеров.

Автор: mozers
Дата сообщения: 20.09.2006 12:46
unreal666

Цитата:
Где взять список этих стандартных событий?
\SciTE\help\SciTEExtension.html

Цитата:
Еще вопрос
Где устанавливается максимальная длина строки состояния?
Это не вопрос, а пожелание (я так же присоединяюсь) для наших программистов
Можно, конечно, писать не в statusbar.text.1 а в statusbar.text.2 или в другие, но как то кликать по статусбару мне обломно

Цитата:
Нифига не показывает текущий лексер
Все должно работать. Что то ты не так сделал. Вставь в OnUpdateUI че нить типа print("test") и погляди. Потом замени на props["lexer.name"]=test . Ну и т.д.... У меня - работает - значит и у тебя будет.


Добавлено:
gansA
Даже не знаю... (С новыми идеями - вообще туго). Мне это понадобилось для того чтобы автоматизировать переключение раскраски С++ со стандартной на ту классическую, что сделал mimir. Как выяснилось, добавление строчки import languages\cpp_style_classic_ ничего не дает - надо обязательно сохранить измененный файл. Как??? Сейчас - запросто:
Код: scite.MenuCommand(106)
Автор: unreal666
Дата сообщения: 20.09.2006 13:12
mozers
Нашел, где была проблема. Просто оказывается у меня уже была такая функция, а я создал такую же в начале файла.
Перенес props["lexer.name"] = GetLexerName() в существующую функцию и все стало ОК.
Сенкс.
Автор: Jus
Дата сообщения: 20.09.2006 14:44
mozers
calltip.pyton.parameters.start= (
autocomplete.pyton.start.characters=.
Установленны уже изначально - вот как раз то когда вставляешь точку в код Питона список автодополнения не появляется, а если его принудетельно вызвать то этот список явно не полный...
Прошу прощения, а как отключить скрипт с алгоритмом автозаполнения?
Автор: mozers
Дата сообщения: 20.09.2006 14:58
Jus
Я же выше написал, что дело - не в этом! Просто Moon_aka_Sun правил код чтобы точка срабатывала! В оригинале она не работает или работает только со скриптом (который надо маленько настроить).
Тот список, что появляется по Ctrl+Enter не зависит ни от скрипта ни от кода (только от api-файла)
Вообще то я подключил python.api от Moon_aka_Sun (он действительно значительно полнее). И теперь у меня по Crll+Enter возникает классический список автодополнения, а при записи вида operator. после нажатия на точку - срабатывает скрипт и возникает список свойств/методов operator.

Добавлено:
Добил список Нерешенные задачи и вопросы.
Вообще то если бы в меню Language (Lexer) ставились галочки при выборе пункта, то вопроса unreal666 могло бы и не быть...
Автор: Moon_aka_Sun
Дата сообщения: 20.09.2006 18:51
я написал:

Цитата:
(про вызов ехе без создания окна) Или Луу саму модифицировать
Оказалось проще всего. Сделал os.execute через CreateProcess и теперь у него три параметра - cmd_line, start_path, flags. Естественно, для совместимости можно не указыать второй и третий параметры. В flags можно, напрмер, написать 134217728, что есть 0x08000000 (Луа 5.0.2 не понимает хекс) или, по-человечески, CREATE_NO_WINDOW (см. документацию по CreateProcess). Будет в следующем билде

mozers написал:

Цитата:
Как
Хм. Скорее всего, не знаю. Я в этом не копался. Может М.Форал что-то менял, я у него брал некоторые изменения. Или ещё кто. А разве точка раньше не работала?

Я помню, что раньше беда с числами была. Набираешь 1. и можно уходить за кофе - SciTE собирал дополнение со всего python.api, который был у меня под 1.5 мегабайта. Сейчас - лучше: 1) на числа автодополнение не реагирует, 2) разумно всё-таки разбить питоновский api на части, которыми действительно пользуешься и части, которые представляют чисто академический интерес.


Цитата:
Как бы увеличить допустимую длину строки в параметре
Очень похоже, что это ограничения (или скорее, умолчания) Виндовс.

В месте создания статусбара он "делится" на одну часть о четырёх тысячах пикселей:
    ::SendMessage(reinterpret_cast<HWND>(wStatusBar.GetID()),
     SB_SETPARTS, 1,
     reinterpret_cast<LPARAM>(widths)); // тут { 4000 }

SciTE просто берёт, что ему дают (s) и передаёт дальше:
    ::SendMessage(reinterpret_cast<HWND>(wStatusBar.GetID()),
     SB_SETTEXT, 0, reinterpret_cast<LPARAM>(s));

3/4 ширины окна, если не больше, отданы под сообщение.

Другое дело, что можно было бы переключение статусбара на клавишу навесить - надо обработку NM_CLICK в SciTEWinBar.cxx превратить в функцию, добавить IDM_команду и т.д. и т.п.
Автор: mozers
Дата сообщения: 20.09.2006 21:11
Moon_aka_Sun
Цитата:
Сделал os.execute через CreateProcess
Вах, молодец! Интересно, а на nix-ах это будет работать?

Цитата:
А разве точка раньше не работала?
А ты попробуй (только чтобы всплывающая подсказка при этом не пропала) У меня - так и не получилось. Вот написал скрипт - теперь радуюсь - родное автодополнение как и раньше по ctrl+Enter работает, а мое врубается автоматом как поставишь точку или двоеточие, причем выводит не всю конструкцию как родное, а как путные редакторы - только символы после точки. Попробуй - понравится
Кстати, подключив твой python.api сразу маленькую ошибочку в скрипте выявил.
Ща все путем - автодополнение и вплывающая подсказка работают как часы

Цитата:
Очень похоже, что это ограничения (или скорее, умолчания) Виндовс
Может и так Предельное число символов - где то как раз 256.

Цитата:
можно было бы переключение статусбара на клавишу навесить
Нахрена? Если мышой лень тыкать? Имхо - не стоит. Лучше подумать о том так ли уж необходима вся представленная инфа именно на 1й статусной строке. Может проще перенести ее на следующую?
А в случае с unreal666 идеальным решением было бы проставление галок в меню напротив выбранного лексера.


Добавлено:
Вопрос к знатокам LUA
Есть таблица со значениями, я ее отсортировал
Код: table.sort(my_table)
Автор: Moon_aka_Sun
Дата сообщения: 20.09.2006 22:12
mozers

Цитата:
Интересно, а на nix-ах это будет работать?
Нет, конечно. Там что-то другое должно быть. Я оттуда только fork знаю А, вспомнил, там spawn* и exec* есть. Но cmd.exe они не запускают. В общем, там всё по-другому. Может им и старого os.execute хватало.


Цитата:
Лучше подумать о том так ли уж необходима вся представленная инфа именно на 1й статусной строке. Может проще перенести ее на следующую?
У меня две строки. Вполне счастлив. Это я так, для поддержания беседы написал


Цитата:
автодополнение
Автодополнения я сейчас как следует не проверял. Помню, что в старом (1.68) почему-то не делались многострочные подсказки (но Форал теперь как-то лихо там всё обошёл). Что-то я ещё делал для посказок для констант и модулей, но всё пропало вместе со старым диском.

Автор: mozers
Дата сообщения: 20.09.2006 23:21

Цитата:
Нет, конечно. Там что-то другое должно быть

тогда может лучше вместо новой os.execute сделать новый метод типа os.run ? (а то нас люниксоиды побъют).

Цитата:
Автодополнения я сейчас как следует не проверял. Помню, что в старом (1.68) почему-то не делались многострочные подсказки (но Форал теперь как-то лихо там всё обошёл).
Я - про раскрывающийся список с автодополнением, а ты - про вплывающие подсказки!
А Форал действительно поступил элементарно просто - включил в список символов разрешенных в тексте подсказки \n и все

Ща все таки собрался и доделал SciTE.Helper (COM-сервер для управления SciTE).
Добавил всего один метод - Send. Смысл его в том что он с помощью SciTE Director Interface посылает Скайту команду (их достаточно много) и читает полученный результат. (Подробности - в файле SciTEDirector.html в дистрибутиве Скайта). С отсылкой проблем нет - все отправляется и послушно выполняется подопытным Скайтом. С получаемыми от Скайта - данными - такая комедия...
Ща пробую... Смеюсь и плачу...
Если кто хочет посмеятся (а еще лучше истолковать результат) - выложу
Автор: vladvro
Дата сообщения: 21.09.2006 08:48
mozers

Цитата:
Во-первых - поздравляю с регистрацией!

Ага, спасиб, только правильние было бы поздравлять с первым сообщением, зарегистрировался я (как сам с удивлением выяснил!) с полгода назад

Цитата:
Может быть тебя заинтересуют какие то из еще нерешенных вопросов ? (в шапке)

Может, особенно если пересекутся с моими пожеланиями в расширении функционала

Цитата:
А насчет макросов я, честно говоря, до конца не въехал...
Где же они хранятся? С именами - ясно, а сами команды? Можно ли их выудить из памяти и записать в файл?

Хранятся в глобальной переменной glb_macros_table в виде таблицы.
Извлекаются без проблем, предлагаю вашему вниманию функции для извлечения из памяти в текущий буфер (MacroFillToBuffer) и загрузку из выделенного текста (MacroLoadFromSelection),

Код: function MacroFillToBuffer ()
for i,macro in glb_macros_table do
editor:BeginUndoAction()
editor:append("\n--- record"..i.." ---\n")
for _,val in macro do
local c,lp,wp = unpack(val)
editor:append(c..";"..wp..";"..lp.."\n")
end
editor:EndUndoAction()
end
end

function MacroLoadFromSelection ()
local macro = {}
local text = editor:GetSelText().."\n"
for str in string.gfind(text, "([^\n]*)[\n]") do
if string.sub(str, 1, 3) == "---" then
MacroAddToList(macro)
macro = {}
else
for c,wp,lp in string.gfind(str, "(%d+);(%d+);(.*)") do
table.insert(macro, {c,lp,wp})
end
end
end
MacroAddToList(macro)
end

function MacroAddToList (macro)
if table.getn(macro) > 0 then
table.insert(glb_macros_table, 1, macro)
while table.getn(glb_macros_table) > MAX_MACRO_RECORDS do
table.remove(glb_macros_table)
end
end
end
Автор: mozers
Дата сообщения: 21.09.2006 13:31
vladvro
Цитата:
функции для извлечения из памяти в текущий буфер (MacroFillToBuffer) и загрузку из выделенного текста (MacroLoadFromSelection),
Круть! Работает
Только с порядком как то нелогично. Последний записанный макрос получает 1 номер. Первый - последний. При добавлении - то же... Поправить бы...

Цитата:
Можно сделать текстовое представление более читаемым, если добавить преобразование кода в название функции.
Вообще - мечта
Записал нужную последовательность действий, маленько отредактировал, заменив конкретные буквы и цифры на переменные, добавил цикл по условию - вот и готово очередное средство автоматизации - запускай где хошь и когда хошь только входные параметры меняй

Автор: St_MPA3b
Дата сообщения: 21.09.2006 21:47
Отличная прога

А вот оболочка для настроек: http://sourceforge.net/projects/tsct/

Добавлено:
Даже так
http://sourceforge.net/project/showfiles.php?group_id=152041&package_id=169261
Автор: Jus
Дата сообщения: 22.09.2006 08:04
mozers

Цитата:
Кстати, подключив твой python.api сразу маленькую ошибочку в скрипте выявил.

Обновленный скрипт где можно взять? или подскажи где и что поправить.

Скрипт gen_python_api.py для генерации python.api можно скачать тут:
http://www.scintilla.org/gen_python_api.zip
http://scintilla.sourceforge.net/gen_python_api.zip
Автор: vladvro
Дата сообщения: 22.09.2006 12:29
mozers

Цитата:
Только с порядком как то нелогично. Последний записанный макрос получает 1 номер. Первый - последний. При добавлении - то же... Поправить бы...

Согласен с порядком не логично получилось
В новой версии порядок идет четко по возрастающей, можно выбрать куда в списке будут добавлятся новые записанные макросы, за это отвечает параметр MACRO_LIST_NEW_RECORDED_POS
кроме того при загрузке макросов считываются и их имена, можно задать любое состоящее из букв, цифр и подчерка.
Новая версия выложена взамен старой:
http://scite.ruteam.ru/scite/realizaciya-zapisi-makrosov-s-pomoschyu-lua


Цитата:
Записал нужную последовательность действий, маленько отредактировал, заменив конкретные буквы и цифры на переменные, добавил цикл по условию - вот и готово очередное средство автоматизации - запускай где хошь и когда хошь только входные параметры меняй

Сперва я такую возможность даже не рассматривал, макросы на это не расчитаны, там нет управляющих конструкций (циклы, условия), да на мой взгляд и не особо нужно, всегда же можно написать функцию на Луа.
Но посмотрев на то, что получается в тектовом представлении макроса, решил что можно формировать и Луа скрипт, который можно уже использовать для написания своих функций, правда понятно что обратно в макрос это уже не загрузить
Автор: Grisper
Дата сообщения: 22.09.2006 15:05
Многострочные подсказки в SciTe:
\scite\src\SciTEBase.cxx
находим
SendEditorString(SCI_CALLTIPSHOW, lastPosCallTip - currentCallTipWord.length(), functionDefinition.c_str());
вставляем перед ней
functionDefinition.substitute("\\n", "\n");
всё.

идея Форала...
пересобрал бы кто .RU сборку с этой фичей....
Автор: mozers
Дата сообщения: 22.09.2006 16:27
Jus
Цитата:
Обновленный скрипт где можно взять? или подскажи где и что поправить.

Код: local end_str = string.find(str_method,'[^a-zA-Z_]')
Автор: mozers
Дата сообщения: 25.09.2006 12:22
Ядро 1.71 .17Ru
Source: SciTE_171_17Ru_src.rar [185kB] (только измененные файлы)
EXE + DLL: SciTE_171_17Ru.rar [375kB]
Список всех доработок: Version_Changes.txt

Компилировал в Visual Studio .NET 2003. Размер EXE и DLL получился поменьше и тот хитрый скрипт о котором я уже говорил не вызывает теперь крушения SciTE

Со сборкой ситуация хуже. Слишком много чего хотелось бы исправить и добавить. Не успел пока оформить все по человечески...
Автор: Grisper
Дата сообщения: 25.09.2006 15:00
билд 1.71.17

Код:
keywordclass2.lua4=word1 \
word2 word3 \
<пустая строка>
word4 \
word5

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: LeechGet


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.