Что нового

Lua скрипты для SciTE

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Для того, чтобы что-то автоматизировать в редакторе sciTE надо знать объектную модель SciTE, чтобы использовать lua. Ели кто-то видел ресурсы, которые описывают это с примерами, то просьба делится с этой теме при мерами.

Вот одна из задач. В дополнении
SideBar.lua
Которое выводит список всех функций в правой панели, хотелось дописать функцию, которая вставляет пользовательскую функцию, с параметрами, из этого списка. Понятно, что как-то этот список формируется, прежде чем отобразится в панели. В тексте скрипта, есть функция, которая перемещает на позицию, в окне редактора, по двойному щелчку

Код:
local function Functions_GotoLine()
	local sel_item = list_func:get_selected_item()
	if sel_item == -1 then return end
	local pos = list_func:get_item_data(sel_item)
	if pos then
		ShowCompactedLine(pos)
		editor:GotoLine(pos)
		gui.pass_focus()
	end
end

get_selected_item() - видимо получает элемент из списка
local pos = list_func:get_item_data(sel_item) - видимо значение данного элемента.
Я так понимаю, что там где-то в дебрях кода формируется сам список в виде gui, задаются колонки и какая колонка будет по умолчанию значением выбранного элемента. А мне вот надо значение другой колонки. Как его получить?
Подробного описания, я так и не нашел. Смотрел вот тут:
http://lua-users.org/wiki/SciteExtMan
Вот здесь
http://scite.ruteam.ru/engine/upfiles/mozers/SciTEDirector_rus.html
- но структурированного описания не обнаружил.
Так, обрывочные примеры.
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
После некоторого напряжения мозга, написал процедуру дополнения для скрипта SideBar.lua

Код:
function Functions_Getfun()
	
	local sel_item = list_func:get_selected_item()+1
	if sel_item == -1 then return end
	
	local line = editor:LineFromPosition(editor.CurrentPos) + 1
	local stroka = table_functions[sel_item][1] .. table_functions[sel_item][3]
	local stroka_m = string.gsub(stroka, "ByRef", "")
	local stroka_m = string.gsub(stroka_m, "ByVal", "")
	local stroka_m = string.gsub(stroka_m, "byval", "")
	local stroka_m = string.gsub(stroka_m, "byref", "")
	editor:LineEnd()
	editor:NewLine()
	editor:AddText(stroka_m)
	editor:LineDown()
	editor:Home()
	gui.pass_focus()
end
Если выделить элемент в панели, где список функций, нажать правую кнопку, и выбрать пункт меню Insert Function name, то в окно редактора вставится название функции и список аргументов.

Для того, чтобы изменить контекстное меню, надо в списке пунктов дописать свой (выделено жирным)
Код:
list_func:context_menu {
	'Sort by Order|Functions_SortByOrder',
	'Sort by Name|Functions_SortByName',
	'Show/Hide Flags|Functions_ToggleFlags',
	'Show/Hide Parameters|Functions_ToggleParams',
[b]	'Insert Function name|Functions_Getfun',[/b]
}

Регулярные выражения в формате, который используется в Autoit, Lua что-то не захотел обрабатывать.
Кстати, функция долго не хотела работать, потому что я написал вот так

Код:
local function Functions_Getfun()
Почему - та к и не понял, поскольку остальные функции из списка - работают и как local. :shok:
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Дополнение для sidabar вставляющий описание переменных функции

Код:
function Functions_Opis()
	-- Выбрынный элемент
	local sel_item = list_func:get_selected_item()+1
	if sel_item == -1 then return end
	--local line = editor:LineFromPosition(editor.CurrentPos) + 1
	-- Получаем строку с параметрами
	local stroka = table_functions[sel_item][3]
	local Name_fun = table_functions[sel_item][1]
	-- Позиция функции варедакторе
	local pos = list_func:get_item_data(sel_item-1)
	-- Обрабатываем строку
	 local stroka_m = ""
	  patt =  "[ ,(](\$%w+)"
	  for w in string.gmatch(stroka, patt) do
		 stroka_m = stroka_m .. ";"..w.. " - " .. string.char (10)
		 print(w)
     end
	stroka_m = "; --------" .. Name_fun .. " --------" .. string.char (10) .. stroka_m 
	stroka_m = string.char (10) .. stroka_m  .. "; --------/" .. Name_fun ..  " --------"
	editor:GotoLine(pos-1)
	editor:LineEnd()
	editor:NewLine()
	editor:AddText(stroka_m)
	editor:LineDown()
	editor:Home()
	gui.pass_focus()	
end
 
Верх