Что нового

Внешние дополнения к редактору SciTE

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
Скрипт для добавления заголовков ко всем UDF в скрипте.

В «SciTE\properties\au3.properties» добавить в конец:

Код:
#Insert AutoIt3 Function Header (for all UDFs) as per UDF guidlines
command.name.35.$(au3)=Add headers to all UDFs
command.35.$(au3)="$(autoit3dir)\AutoIt3.exe" "$(SciteDefaultHome)\AddFuncHeaders\AddFuncHeaders.au3" "$(FilePath)"
command.is.filter.35.$(au3)=1
command.save.before.35.$(au3)=1
command.shortcut.35.$(au3)=Ctrl+Alt+Shift+f
35 это последовательный номер в меню, нужно заменить на последний номер в вашем меню + 1.
Содержимое прикреплённого архива (вместе с папкой) нужно положить в папку SciTE.
 

Dm666

Осваивающий
Сообщения
217
Репутация
48
Внесу свои 5 копеек..
Маленький скрипт для выпиливания комментариев в выделенном блоке кода.
Скрипт сохранить как c:\Program Files\AutoIt3\SciTE\tools\drop_comments.lua
--Attachment:
--
--command.separator.136.*=2
--command.name.136.*=Remove comments in selection
--command.136.*=dostring dofile (props["SciteDefaultHome"].."\\tools\\drop_comments.lua")
--command.mode.136.*=subsystem:lua,savebefore:no
--command.shortcut.136.*=Ctrl+Alt+]


local xstart, xend= editor.SelectionStart, editor.SelectionEnd-1
local ch_del={}
for i=xstart, xend, 1 do
if IsComment(i) then
if ch_del[1]~=nil and i==ch_del[1][2]+1 then
ch_del[1][2]=i
else
table.insert(ch_del,1,{i,i+1})
end
end
end

editor:BeginUndoAction()
for _,i in pairs(ch_del) do
editor.SelectionStart, editor.SelectionEnd=i[1], i[2]
editor:DeleteBackNotLine()
end
editor:EndUndoAction()

Его бы еще доделать, чтобы он пустых строк после себя не оставлял и чтобы убивал только целиком закомментированные строки, а не все комменты вообще, цены б ему не было.
Но и в таком виде тоже ничего, периодически пользуюсь.
 

AZJIO

Меценат
Меценат
Сообщения
2 748
Репутация
1 145
А зачем их выпиливать? Обфускатор вполне справляется с этой задачей, например команда
Код:
"C:\AutoIt3\SciTE\Obfuscator\Obfuscator.exe" "%1" /SO
Ещё добавить Tidy и код в том же виде, но без комментариев, правда и пустые строки при этом исчезают, которые отделяли функции.
 

Dm666

Осваивающий
Сообщения
217
Репутация
48
Скрипт можно натравить на выделенный участок кода, а obfuscator обрабатывает весь текст, что как правило не нужно. Комментарии вещь полезная, пусть живут. А вот закомментированный мусор удалить полезно.
Лично у меня, например, к моменту завершения программы разводтится очень много строк вида
Код:
;~ MsgBox(0, '',$var)
;~ _ArrayDisplay($aData)

Вот тут-то скрипт и пригодится.
 

rollex

Чайник
Сообщения
66
Репутация
1
CreatoR
Сделал как описано, перезапустил редактор.
По нажатию Ctrl+Alt+Shift+f консоль говорит:

Код:
>"\AutoIt3.exe" "D:\Program Files\AutoIt3\SciTE\AddFuncHeaders\AddFuncHeaders.au3" "D:\Program Files\Properties\Sourse\1.au3"
‘Ё­в ЄбЁзҐбЄ п ®иЁЎЄ  ў Ё¬Ґ­Ё д ©« , Ё¬Ґ­Ё Ї ЇЄЁ Ё«Ё ¬ҐвЄҐ ⮬ .
>Exit code: 1    Time: 0.210

И ничего не меняется.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
rollex [?]
По нажатию Ctrl+Alt+Shift+f консоль говорит
Файл (обработчик) точно на месте?
И ещё, почему там «\AutoIt3.exe» а не полный путь к нему?
Возможно у тебя $(autoit3dir) не определён в конфигураций SciT'а.
 

rollex

Чайник
Сообщения
66
Репутация
1
CreatoR
Папка AddFuncHeaders с содержимым лежит в папке SciTE. Автоит установил новый v 3.3.8.0, SciTE v 2.28 установил после, все с правами админа.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322

rollex

Чайник
Сообщения
66
Репутация
1
CreatoR
Только что удалил SciTe и AutoIt, почистил папку. Опять скачал autoit-v3-setup.exe (v 3.3.8.0) с официального сайта и установил. SciTe дополнительно не скачивал и не устанавливал! В итоге SciTe который установился по умолчанию как раз таки и имеет версию 2.28, и что самое интересное, в нем нет папки properties, и тем более файла au3.properties. Где я ошибаюсь?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 499
Репутация
317
rollex
В том что SciTe идущая в комплекте с AutoIT - обрезана донельзя. У нее нет тех возможностей, которые Вы хотите сейчас поставить.
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1 499
Репутация
317
Creator наверное опечатался, потому что Scite4AutoIT можно скачать тут
 
A

Alofa

Гость
Интегрировал аббревиатуры некоторых ключевых слов (+сокращения основных веток реестра) с подсказками автозавершения.
И теперь, когда я в SciTE начинаю набирать, к примеру, "[url=http://autoit-script.ru/autoit3_docs/keywords/IfElseEndIf.htm]if[/url]" (лучше строчными буквами), то наблюдаю следующее меню:


И если далее выбрать, опять же к примеру, пункт "if_elseif_else_endif" и нажать клавишу пробела, то аббревиатура разворачивается в следующие строки:


Для того чтобы это работало нужно просто дополнить три файла SciTE следующей информацией:
Файл: "%LOCALAPPDATA%\AutoIt v3\SciTE\au3UserAbbrev.properties"
Код:
#; -- Abbreviate strings --
hkey_classes_root=HKCR
hkey_current_user=HKCU
hkey_local_machine=HKLM
hkey_users=HKU
hkey_current_config=HKCC

#; -- PreSelected Commands --
runwait_cmd=RunWait('"' & @ComSpec & '" /c |', '', @SW_HIDE)\n
msgbox_=MsgBox(0, '', '|')

#; -- Multiline Structures --
if_then=If | Then
if_then_endif=If | Then\n\t\nEndIf
if_else_endif=If | Then\n\t\nElse\n\t\nEndIf
if_elseif_else_endif=If | Then\n\t\nElseIf False Then\n\t\nElse\n\t\nEndIf
do_until=Do\n\t\nUntil |
for_to_step_next=For $i = | To  Step 1\n\t\nNext
for_in_next=For | In \n\t\nNext
func_return_endfunc=Func _|()\n\t\n\tReturn\nEndFunc\n
select_case_caseelse_endselect=Select\n\tCase |\n\tCase \n\tCase \n\tCase \n\tCase Else \nEndSelect\n
switch_caseto_caseelse_endswitch=Switch |\n\tCase \n\tCase \n\tCase  To \n\tCase  To ,  To \n\tCase Else \nEndSwitch\n
case_caseelse=|\nCase \nCase \nCase \nCase \nCase Else
while_wend=While |\n\t\nWEnd
with_endwith=With |\n\t\nEndWith

#; -- Start of Structures --
for_toubound_step_next=For $i = 0 To UBound(|) -1\n\t\nNext

Файл: "...\AutoIt3\SciTE\properties\au3.keywords.abbreviations.properties"
Код:
hkey_classes_root hkey_current_user hkey_local_machine hkey_users hkey_current_config runwait_cmd msgbox_ if_then \
if_then_endif if_else_endif if_elseif_else_endif do_until for_to_step_next for_in_next func_return_endfunc \
select_case_caseelse_endselect switch_caseto_caseelse_endswitch case_caseelse while_wend with_endwith for_toubound_step_next \

Файл: "%LOCALAPPDATA%\AutoIt v3\SciTE\au3.user.calltips.api"
Или файл: "...\AutoIt3\SciTE\api\au3.api"
Код:
case_caseelse
do_until
for_to_step_next
for_toubound_step_next
for_in_next
func_return_endfunc
hkey_classes_root
hkey_current_user
hkey_local_machine
hkey_users
hkey_current_config
if_then
if_then_endif
if_else_endif
if_elseif_else_endif
select_case_caseelse_endselect
switch_caseto_caseelse_endswitch
while_wend
with_endwith
msgbox_
runwait_cmd
Затем откройте "...\AutoIt3\SciTE\properties\au3.properties" и проконтролируйте параметр "api.$(au3)=...", тот файл .api в котором вы делали изменения должен быть прописан в данной строке.
Код:
api.$(au3)=$(SciteDefaultHome)\api\au3.api;$(SciteDefaultHome)\api\au3.autoit3wrapper.api;$(SciteUserHome)\au3.user.calltips.api

Файл: "...\AutoIt3\SciTE\abbrev\au3.user.abbrev"
Код:
#; -- Abbreviate strings --
hkey_classes_root=HKCR
hkey_current_user=HKCU
hkey_local_machine=HKLM
hkey_users=HKU
hkey_current_config=HKCC

#; -- PreSelected Commands --
runwait_cmd=RunWait('"' & @ComSpec & '" /c |', '', @SW_HIDE)\n
msgbox_=MsgBox(0, '', '|')

#; -- Multiline Structures --
if_then=If | Then
if_then_endif=If | Then\n\t\nEndIf
if_else_endif=If | Then\n\t\nElse\n\t\nEndIf
if_elseif_else_endif=If | Then\n\t\nElseIf False Then\n\t\nElse\n\t\nEndIf
do_until=Do\n\t\nUntil |
for_to_step_next=For $i = | To  Step 1\n\t\nNext
for_in_next=For | In \n\t\nNext
func_return_endfunc=Func _|()\n\t\n\tReturn\nEndFunc\n
select_case_caseelse_endselect=Select\n\tCase |\n\tCase \n\tCase \n\tCase \n\tCase Else \nEndSelect\n
switch_caseto_caseelse_endswitch=Switch |\n\tCase \n\tCase \n\tCase  To \n\tCase  To ,  To \n\tCase Else \nEndSwitch\n
case_caseelse=|\nCase \nCase \nCase \nCase \nCase Else
while_wend=While |\n\t\nWEnd
with_endwith=With |\n\t\nEndWith

#; -- Start of Structures --
for_toubound_step_next=For $i = 0 To UBound(|) -1\n\t\nNext

Файл: "...\AutoIt3\SciTE\properties\au3.keywords.abbreviations.properties"
Код:
hkey_classes_root hkey_current_user hkey_local_machine hkey_users hkey_current_config runwait_cmd msgbox_ if_then \
if_then_endif if_else_endif if_elseif_else_endif do_until for_to_step_next for_in_next func_return_endfunc \
select_case_caseelse_endselect switch_caseto_caseelse_endswitch case_caseelse while_wend with_endwith for_toubound_step_next \

Файл: "...\AutoIt3\SciTE\api\au3.user.api"
Код:
case_caseelse
do_until
for_to_step_next
for_toubound_step_next
for_in_next
func_return_endfunc
hkey_classes_root
hkey_current_user
hkey_local_machine
hkey_users
hkey_current_config
if_then
if_then_endif
if_else_endif
if_elseif_else_endif
select_case_caseelse_endselect
switch_caseto_caseelse_endswitch
while_wend
with_endwith
msgbox_
runwait_cmd

Примечания:
- Все интегрированные аббревиатуры переименованы для удобочитаемости
(а точнее это продублированные исходные аббревиатуры под новыми именами);
- Все имена аббревиатур состоят только из строчных букв (допускается использование знака нижнего подчеркивания "_").
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
Скрипт для создания аббревиатуры с выделенного текста:

Код:
--------------------------------------------------------------------------------
-- MakeAbbrev()
--
-- Make abbreviation from selected code (by G.Sandler).
--
-- Tool: AutoItTools.MakeAbbrev $(au3) 2 Alt+A Make Abbreviation
--------------------------------------------------------------------------------
function AutoItTools:MakeAbbrev()
	local sel_text = editor:GetSelText()
	
	if #sel_text < 1 then 
		print("!!! To make abbreviation, select some code !!!")
		return 
	end
	
	if #sel_text < 10 then  --Limit abbrev value by 10 chars minimum
		print("!!! To make abbreviation, please select code with minimum of 10 chars !!!")
		return 
	end
	
	local abbrev_name = sel_text:match("%w+")
	abbrev_name = shell.inputbox("Make Abbreviation", "Enter abbreviation name for selected code:", abbrev_name:lower(), function(name) return not name:match('[# \t=]') end)
	if abbrev_name == nil then return end
	
	abbrev_name = abbrev_name:lower()
	
	local user_abbrev_file = props["SciteDefaultHome"] .. "\\abbrev\\au3.user.abbrev"
	local user_abbrev_kwrds_file = props["SciteDefaultHome"] .. "\\properties\\au3.user.keywords.abbreviations.properties"
	
	local user_abbrev_read = ''
	
	local h_user_abbrev_file = io.open(user_abbrev_file)
	
	if h_user_abbrev_file then
		user_abbrev_read = h_user_abbrev_file:read('*a') .. "\n"
		h_user_abbrev_file:close()
	end
	
	local h_user_abbrev_kwrds_file = io.open(user_abbrev_kwrds_file)
	
	if h_user_abbrev_kwrds_file then
		local user_abbrev_kwrds_read = h_user_abbrev_kwrds_file:read('*a') .. " "
		h_user_abbrev_kwrds_file:close()
		
		io.output(user_abbrev_kwrds_file)
		io.write(user_abbrev_kwrds_read .. abbrev_name)
		io.close()
	else 
		print("!!! File not found: " .. user_abbrev_kwrds_file .. "!!!")
	end
	
	local eol = "\r\n"
	
    if editor.EOLMode == SC_EOL_CR then
        eol = "\r"
    elseif editor.EOLMode == SC_EOL_LF then
        eol = "\n"
    end
	
	sel_text = sel_text:gsub("\\", "\\\\"):gsub(eol, "\\n"):gsub("\t", "\\t")
	
	io.output(user_abbrev_file)
	io.write(user_abbrev_read .. abbrev_name .. "=" .. sel_text)
	io.close()
	
	scite.Perform("reloadproperties:")
	
	print("+ Abbreviation seccessfuly created, to call it type in SciTE: " .. abbrev_name .. " and press Space or Ctrl+B")
end
Добавить в menu:

Код:
  command.parent.33.$(au3)=1
	command.name.33.$(au3)=Make Abbreviation
	command.33.$(au3)=Invoke AutoItTools.MakeAbbrev
	command.mode.33.$(au3)=subsystem:lua,savebefore:no
	command.shortcut.33.$(au3)=Alt+A
33 это последовательный номер в меню, нужно заменить на свободный.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
Скрипт для генерирования не объявленных переменных в функции:
(пока что проверяет только в текущем скрипте)

AddUndeclaredVars.lua
Код:
--[[
	AddFuncUndeclaredVars()
	Add function uneclared variables.
	Author: G.Sandler (CreatoR)
--]]

-- Get the current line.
local iCurr_Pos = editor.CurrentPos
local iLine = editor:LineFromPosition(iCurr_Pos)
local sLine = editor:GetLine(iLine)

if sLine == nil then
	print("- Cursor not on function definition.")
	return
end

-- Get function name in original case registry
local sFunc_Name = sLine:match("^%s*[Ff][Uu][Nn][Cc] %s*([%w_]*)")

-- First we check if it's a function (in lower case).
if not sFunc_Name then
	print("- Cursor not on function definition.")
	return
end

-- Set up variables we'll be using throughout.
local sUnDclrd_Vars = ""
local sFunc_Body = sLine
local iFunc_Line = iLine
local aParams = sLine:gmatch("(%$[%w_]*)")
local aScope = {"local", "global", "dim", "const", "static"}
local aVars = {}

-- Get function body and vars
while iLine < editor.LineCount - 1 do
	iLine = iLine + 1
	sLine = editor:GetLine(iLine)
	
	if sLine:lower():match("^%s*endfunc") then
		sFunc_Body = sFunc_Body .. sLine
		break
	end
	
	-- Ignore commented lines
	if sLine:match("^%s*;") == nil then
		sFunc_Body = sFunc_Body .. sLine
		
		for var, str in sLine:gmatch("(%$[%w_]+)%s*=%s*") do
			aVars[var] = var
		end
	end
end

-- Get current doc content and remove all functions and all commented lines from it
local sDoc_Read = editor:GetText():lower():gsub("[\r\n^]%s*func %s*([%w_]*.-endfunc)", "")
sDoc_Read = sDoc_Read:gsub("[\r\n^]%s*;[^\r\n]*", "")
sDoc_Read = sDoc_Read:gsub("[\r\n^]%s*#cs%s*.-#ce", "")
sDoc_Read = sDoc_Read:gsub("[\r\n^]%s*#comments%-start%s*.-#comments%-end", "")

for sKey, sVar in pairs(aVars) do
	iFound = 0
	
	-- Check if the vars not declared in function params
	for sParam, str in aParams do
		if sVar:lower() == sParam:lower() then
			iFound = 1
			break
		end
	end
	
	-- Check if the vars not declared in function itself
	if iFound == 0 then
		-- for i = 1, #aScope do
		for _, sScope in ipairs(aScope) do
			if sFunc_Body:lower():match("[\r\n^]%s*" .. sScope:lower() .. " .*" .. sVar:lower() .. "%s*[=,\r\n]") then
				iFound = 1
				break
			end
		end
	end
	
	-- Check if the vars not declared globaly in entire file (only current script ATM)
	if iFound == 0 and sDoc_Read:match("[\r\n^]%s*global .*" .. sVar:lower() .. "%s*[=,\r\n]") then
		iFound = 1
	end
	
	if iFound == 0 then
		if sUnDclrd_Vars ~= "" then
			sUnDclrd_Vars = sUnDclrd_Vars .. ", "
		end
		
		sUnDclrd_Vars = sUnDclrd_Vars .. sVar
	end
end

if sUnDclrd_Vars == "" then
	print("> Undeclared variables not found in \"" .. sFunc_Name .. "\" function")
else
	editor:LineEnd()
	editor:NewLine()
	editor:ReplaceSel("Local " .. sUnDclrd_Vars)
	editor:NewLine()
	editor:GotoPos(iCurr_Pos)
end
Добавить в меню:
Код:
	command.parent.33.$(au3)=1
	command.name.33.$(au3)=Add function undeclared vars
	command.33.$(au3)=dofile(props["SciteDefaultHome"].."\\lua\\AddUndeclaredVars.lua")
	command.mode.33.$(au3)=subsystem:lua,savebefore:no
	command.shortcut.33.$(au3)=Ctrl+2
33 это последовательный номер в меню, нужно заменить на свободный.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
Хотелка:

Скрипт lua который будет брать подсказки к функциям (calltips), непосредственно с самой UDF.
Т.е чтобы если в подключаемой библиотеке есть заголовки к функциям (документация), то описание должно браться в первую очередь оттуда, а не с au3.api.
 
Верх