mozers
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: -- Автодополнение объектов их методами и свойствами -- Точка после имени объекта вызывает список его методов/свойств (берутся из соответствующего api файла) -- Пробел, скобка или точка изменяют регистр символов в имени объекта в соответствии с записью в api файле -- (например "ucase" при вводе автоматически заменяется на "UCase") -- mozers™ icq#256106175 -- version 0.8 function AutocompleteObject(char) if not (char == "." or char == ":" or char == " " or char == "(") then return false end -- get api file (not use pattern in prop! local api_filename = props['api.*.'..props['FileExt']] local api_file = io.open(api_filename) if not api_file then return false end -- get object name local object = GetWordLeft() local len_obj = string.len(object) if len_obj == 0 then return false end -- find methods and properties object's in api file (create UserList) local object_api = '' local user_list = {} for line in api_file:lines() do local api_object = string.sub(line,1,len_obj+1) if string.upper(api_object) == string.upper(object)..char then object_api = string.sub(api_object,1,len_obj) if not (char == " " or char == "(") then local str_method = string.sub(line,len_obj+2) local end_str = string.find(str_method,'[^a-zA-Z]') if end_str ~= nil then str_method = string.sub(str_method, 1, end_str-1) end table.insert (user_list,str_method) end end end api_file:close() -- correct register of symbols (sample: wscript -> WScript) if object_api ~= '' then local s = pos - 1 - len_obj editor:SetSel(s, pos - 1) editor:ReplaceSel(object_api) editor:CharRight() end -- show UserList local list_count = table.getn(user_list) if list_count > 0 then table.sort(user_list) local s = table.concat(user_list, " ") editor:UserListShow(10, s) return true else return false end end function GetWordLeft() pos = editor.CurrentPos editor:CharLeft() editor:WordLeftExtend() local sel_text = editor:GetSelText() editor:CharRight() editor:CharRight() sel_text = string.gsub(sel_text, ".*[.:]", '') return sel_text end function InsertProp(tp,sel_value) if tp == 10 then local pos_new = editor.CurrentPos if pos_new ~= pos then editor:SetSel(pos, pos_new) editor:DeleteBack() end editor:InsertText(-1, sel_value) pos = pos + string.len(sel_value) editor.CurrentPos = pos editor:CharRight() return true else return false end end -- ====================================================== -- Стандартные события SciTE, обработку которых выполняют расположенные выше скрипты function OnChar(charAdded) local ret = AutocompleteObject(charAdded) return ret end function OnUserListSelection(tp,sel_value) InsertProp(tp,sel_value) end | Для обеспечения работоспособности надо добавить в соответствующие .properties строку типа: Код: api.*.vbs=$(SciteDefaultHome)\api\vbscript.api | Паттерны скрипт не понимает поэтому для каждого расширения надо создавать отдельную строку: Код: api.*.js=$(SciteDefaultHome)\api\jscript.api api.*.lua=$(SciteDefaultHome)\api\lualib5_annot_scite.api | Естественно, соответствующие api файлы должны у вас быть (если нет - скачайте нашу сборку). Ну а теперь создайте пустой файл test.vbs и поробуйте написать в нем что нибудь типа: Код: Ну как - понравилось? Кстати, и прежний способ автодополнения (по Ctrl+Enter) так же работает | Всего записей: 2187 | Зарегистр. 03-01-2002 | Отправлено: 23:08 01-07-2006 | Исправлено: mozers, 21:35 09-07-2006 |
|