Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 330
1. msg147757]Скрипт объявления переменных для функций[[/hide]url]
2. [url=http://autoit-script.ru/index.php?topic=1836.msg56648.html[hide]msg56648]Скрипт для добавления заголовков ко всем UDF в скрипте[[/hide]url]
3. [url=http://autoit-script.ru/index.php?topic=1836.msg147397[hide]msg147397]Скрипт для создания аббревиатуры с выделенного текста[[/hide]url]

[
Раскрытый контент
]Эта тема в перспективе будет перенесена в раздел «[url=http://autoit-script.ru/index.php?board=14.0]Инструменты и помощь по AutoIt[
url]» и оформлена соответственно, а пока давайте её заполнять, и желательно не флеймом и офтопиком :ok:

На данный момент ищу такое дополнение:
- Скрипт Lua (хотя не обязательно), который умеет грамотно объявлять переменные. Он должен найти все не объявленные переменные (желательно и опционально в выделенном коде), и построить строчку в виде:

Код:
Local $MyVar1, $MyVar2
;и т.д.

Local это конечно зависит от нахождения этих переменных, если в функции то Local, если снаружи то Global, а если массив (определять только по наличию квадратных скобок на конце, ну или по определителю типа данных - $aMyArr), то Dim.
Кто нибудь встречал такое чудо? очень не хватает...[/#]
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Внес изменения в скрипт

Попробуй так: берешь в буфер обмена код AutoIt (например, этот скрипт) и выполняешь этот скрипт. Он возвращает необъявленные переменные.

Код:
#include <array.au3>

Global $aDefined[1], $aNotDefined[1], $Result

$Code = ClipGet()
;~ разрезаем данные из буфера обмена построчно
$aCode = StringSplit($Code, @CRLF, 1)

;~ начинаем перебирать эти строки
for $x = 1 to $aCode[0]
;~ 	добавлем пробел в конце каждой строки, чтобы нормально отрабатывали регулярные выражения ниже
    $aCode[$x] = $aCode[$x] & " "
;~ 	Если строка начинается с комментария, то удаляем ее. Чтобы переменные в комментариях не учитывались
	$aCode[$x] = StringRegExpReplace($aCode[$x], "^;.+", "", 1)
;~ 	отрезаем концы строк, где идет объявление переменных-стилей для GUI (так как их не нужно объявлять)
    $aCode[$x] = StringRegExpReplace($aCode[$x], " (BitAND|BitNOT|BitOR)\(.+", "")
;~ 	находим все переменные в строке и создаем массив из них
    Local $aMat = StringRegExp($aCode[$x], "(\$\w+)\W", 3)
    if @error = 0 Then
;~ 		если в этой строке есть Global, Dim, Local (т.е. если эти переменные объявляются)
        if StringRegExp($aCode[$x], "(?i:Global|Dim|Local)") Then
;~ 			то начинаем перебирать эти переменные
            for $i = 0 to Ubound($aMat) - 1
;~ 				если переменной нет в массиве aDefined, то заносим в этот массив
                if Not StringInStr(_ArrayToString($aDefined, " "), $aMat[$i]) Then _ArrayAdd($aDefined, $aMat[$i])
				Next
;~ 		а если в этой строке НЕТ Global, Dim, Local (т.е. если эти переменные НЕ объявляются)
        Else
;~ 			то начинаем перебирать эти переменные
            for $i = 0 to Ubound($aMat) - 1
;~ 				если переменной нет в массиве aDefined (т.е. если она не определена), то заносим ее в массив aNotDefined
                if Not StringInStr(_ArrayToString($aDefined, " "), $aMat[$i]) Then _ArrayAdd($aNotDefined, $aMat[$i])
            Next
        EndIf
    EndIf
Next

;~ оставляем только уникальные элементы в $aNotDefined
$aNotDefined = _ArrayUnique($aNotDefined)

;~ разделяем запятыми элементы aNotDefined и выводим в консоль
For $x = 1 to UBound($aNotDefined) - 1
    $Result = $Result & $aNotDefined[$x] & ", "
Next

$Result = StringTrimLeft($Result, 2)
$Result = StringTrimRight($Result, 2)

ConsoleWrite($Result & @CRLF)



Сильно не проверял, скорее всего нужно доводить до ума.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 330
Suppir [?]
нужно доводить до ума
Ага, нужен ещё поиск по всему скрипту, чтобы определить не объявлена ли уже переменная...
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Так мы и берем в буфер весь скрипт целиком. Соответственно, все необъявленные переменные будут учитываться.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 330
Suppir [?]
Так мы и берем в буфер весь скрипт целиком
Цитирую себя:
[?]
Скрипт Lua (хотя не обязательно), который умеет грамотно объявлять переменные. Он должен найти все необъявленные переменные (желательно и опционально в выделенном коде)


Добавлено:
Сообщение автоматически объединено:

Suppir
И для чего там проверка на «(BitAND|BitNOT|BitOR)»?
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR [?]
И для чего там проверка на «(BitAND|BitNOT|BitOR)»?
Это не проверка, это образание лишних переменных.

Допустим, у нас есть строка:
Код:
$Form1 = GUICreate("NSR-авто", $iMINGuiX, $iMINGuiY, -1, -1, BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION))


переменные $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION заранее объявлять не нужно, поэтому мы отрезаем их вот так:
Код:
$Form1 = GUICreate("NSR-авто", $iMINGuiX, $iMINGuiY, -1, -1,


и в оставшейся строке ищем переменные.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 330
Suppir [?]
переменные $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION заранее объявлять не нужно, поэтому мы отрезаем их вот так
На самом деле и «$iMINGuiX, $iMINGuiY» тоже не нужно объявлять, нам нужно сразу получать переменные которым напряму присваивается значение, всё остальное это мусор.

В общем у меня вот что получилось:

Запускать скрипт из SciTE примерно так:
Код:
command.150.$(au3)="$(autoit3dir)\AutoIt3.exe" "$(autoit3dir)\Tools\GenerateUnDeclaredVarsList.au3" "$(FilePath)" "$(CurrentSelection)"
Сам скрипт:
Код:
#NoTrayIcon

If $CmdLine[0] = 0 Then Exit

$sScriptFile = $CmdLine[1]

If $CmdLine[0] > 1 Then
	$sSelectedCode = StringRegExpReplace($CmdLineRaw, "/Selection:(.*)$", "\1")
Else
	$sSelectedCode = ClipGet()
EndIf

$sScriptRead = FileRead($sScriptFile)
$sScriptContent = StringRegExpReplace($sScriptRead, "(?is)[\r\n]+?\h*Func\h+\w+\(.*EndFunc", "")
$sFuncsContent = StringRegExpReplace($sScriptRead, "(?is).*(\h*Func\h+\w+\(.*EndFunc[^\r\n]*).*", "\1")

$sVars = _GenerateUnDeclaredVarsList($sSelectedCode, $sScriptContent, $sFuncsContent, "Local")

$hGUI = GUICreate("UnDeclared Vars List", 400, 120)
GUICtrlCreateLabel("Copy undeclared variables list?", 20, 20)
$nVars_Input = GUICtrlCreateInput($sVars, 20, 50, 360, 20)
$nOK_Btn = GUICtrlCreateButton("OK", 20, 90, 70, 20)
$nCancel_Btn = GUICtrlCreateButton("Cancel", 100, 90, 70, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3, $nCancel_Btn
			Exit
		Case $nOK_Btn
			ClipPut(GUICtrlRead($nVars_Input))
			Exit
	EndSwitch
WEnd

Func _GenerateUnDeclaredVarsList($sSelCode, $sScriptContent, $sFuncsContent, $sDimMethod = "Local")
	Local $sFuncParamsLine, $aVars, $sVars, $i
	
	If StringRegExp($sSelCode, 'Func\h*\w+\(.*\)(?s).*\r?\n\h*Func\h*\w+\(.*\)') Then
		MsgBox(48, @ScriptName, 'Please select only ONE function (including the "Func Name()" part).')
		Exit
	EndIf
	
	$sFuncParamsLine = StringRegExpReplace($sSelCode, '(?si).*(?:\r?\n)?\h*Func\h*\w+\(((?-s).*)\).*', '\1')
	
	If @error Or @extended = 0 Then
		MsgBox(48, @ScriptName, 'Please select function (including the "Func Name()" part).')
		Exit
	EndIf
	
	$sSelCode = StringRegExpReplace($sSelCode, '(?si)(?:\r?\n)?\h*Func\h*\w+\(.*?\)', '')
	$aVars = StringRegExp($sSelCode, "[^\(=,]?(\$\w+)\h*(?:\[[^\[\]]+\])?\h*?=", 3)
	$sVars = ""
	
	For $i = 0 To UBound($aVars)-1
		If Not StringRegExp($sFuncParamsLine, "(,\h*)?\Q" & $aVars[$i] & "\E(,\h*|\h*=)?") And _
			Not StringRegExp($sScriptContent, "(?i)[\r\n]*?\h*?Global\h+(\$\w+,\h*?)?\Q" & $aVars[$i] & "\E") And _
			Not StringInStr("," & $sVars & ",", "," & $aVars[$i] & ",") Then
			
			$sVars &= $aVars[$i] & ","
		EndIf
	Next
	
	$sVars = StringRegExpReplace($sVars, ",+$", "")
	$sVars = StringRegExpReplace($sVars, ",", ", ")
	
	If $sVars = '' Then
		MsgBox(48, @ScriptName, 'Variables not found.')
		Exit
	EndIf
	
	Return $sDimMethod & " " & $sVars
EndFunc


Теперь при выделение кода будет сгенерирован список не объявленных переменных.
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Что-то я не пойму, как это добро из SciTE запустить. Наверное, это работает только из полной версии, а у меня усеченная автоитовская.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 330
Suppir [?]
как это добро из SciTE запустить
В «SciTE\properties\au3.properties» добавить в конец:

Код:
#~ GenerateUnDeclaredVarsList Item
command.41.$(au3)="$(SciteDefaultHome)\GenerateUnDeclaredVarsList.exe" "$(FilePath)" $(CurrentSelection)
command.name.41.$(au3)=Генерировать список необъявленных переменных
command.shortcut.41.$(au3)=Ctrl+2
command.is.filter.41.$(au3)=1
command.save.before.41.$(au3)=0
41 это последовательный номер в меню, нужно заменить на последний номер в твоём меню + 1.

скрипт «GenerateUnDeclaredVarsList.au3» должен находиться в корневой папке SciTE.
 

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Сам язык Lua ОЧЕНЬ похож на c++. Единственная проблема - отсутствие вменяемого руководства по свойствам редактора Scite, которые используются для обработки текста. Если кто найдет структурное описание - тогда и любой скрипт буде написать не проблема...
 

beve

Осваивающий
Сообщения
104
Репутация
30
Vlasssov [?]
Если кто найдет структурное описание - тогда и любой скрипт буде написать не проблема...
Создай скрипт *.lua и открой его в SciTe (русской версии) переключись на язык-подсветку Lua набери чего нибудь, и нажми клавишу F1 и будет тебе детальная справка на русском по lua.
 

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Не хочу быть источником дурных вестей....
Есть в скрипты Autoit.lua следующая конструкция
editor:insert(editor.CurrentPos, s_indent .. indentchar)
выделенное жирным - объект Scite, у которого есть как минимум метод :insert и есть как минимум свойство .CurrentPos - вот это описание где взять???
Это та же ситуация, что и с Visual Basic for application. Можно сколько угодно знать Visual Basic, но не разбираться, как его применить в конкретном приложении.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Vlasssov
Код:
c:\Program Files\SciTE\tools\Helper\SciTE.Helper_rus.html
 

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
И что там?
Freeware ActiveX компонент для организации взаимодействия между текстовым редактором SciTE и любыми скриптами и приложениями поддерживающими COM интерфейс.
Зачем это? Ну можно word запустить... Ну можно что-нибудь сделать...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Vlasssov
ты чего-то напутал. а я не дочитал. вся объектная модель Scite описана в хелпе которую я указал. ну а то что ты написал это методы не Scite, а директивы языка lua. копай в его хелпе, чтобы узнать больше
 

Vlasssov

Осваивающий
Сообщения
428
Репутация
25
Мда.. Ну народ пишет, ну шифрует.. есть там ссылка на команды:
file:///c:/Program Files/AutoIt3/SciTE/doc/SciTEDirector_rus.html
Вот там всё есть...
 

AZJIO

Меценат
Меценат
Сообщения
2 751
Репутация
1 146
Посмотрел подробно все инструменты NirSoft, очень интересно для программирования...

DLL Export Viewer - показывает функции содержащиеся в dll, даже не знал, что их там так много, в user32.dll 732 штук. А если суммарную информацию смотреть, так несколько тысяч.

WinExplorer v1.30 - информация об окнах, типа Au3Info.exe. Стили окон показывает не в цифре.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
OffTopic:
AZJIO
В NirSoft-овской WinExplorer v1.30 используется psapi.dll 1998 года. В ней 19 функций, а в современной - 24. А грамотное использование функций из системных dll можно посмотреть в WinAPIEx от Yashied`a
 

beve

Осваивающий
Сообщения
104
Репутация
30
CreatoR [?]
Вобщем у меня вот что получилось:
Попробовал я и вот результат:
• Если запустить выделенный код в SciTe на обработку (590 строчек кода), то вылетает ошибка:
Error while launching:
""D:\Programs\AutoIt_v3.3.6.0\SciTE\AutoitUtil\GenerateUnDeclaredVarsList.exe" with Params:
""C:\Documents and Settings\Admin\Рабочий стол\тест.au3"
... и дальше весь код.
Команда запуска такая:
Код:
command.13.*.au3="$(SciteDefaultHome)\AutoitUtil\GenerateUnDeclaredVarsList.exe" "$(FilePath)" $(CurrentSelection)
• Если убрать из параметров запуска $(CurrentSelection), а запускать на обработку не выделенный код, а скопированный в буфер обмена код, то обработка проходит нормально, появляется InputBox в строчке которого перечислены все необъявленные ранее переменные, но:
если просто копировать вручную этот список и вставить где нужно, то весь список вставляется правильно (в списке около 30 штук переменных),
если же нажать на кнопку ок, для автоматичесского копирования, то после вставки куда нужно, список не полный, где то до 15 переменных а дальше список обрывается - окончание списка такое $TrayIconId2, $. Если, например, переменную $TrayIconId2 объявить, и произвести обработку, то все тоже самое, только в обрывающемся списке место этой переменной займет, следующая по счету переменная, но больше не будет.

Прошу автора поправить скрипт, ввиду данных проблем.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 166
Репутация
2 330
beve [?]
Если запустить выделенный код в SciTe на обработку (590 строчек кода), то вылетает ошибка
Какой у тебя SciTE? у меня нет такой ошибки, SciTE тот что поставлялся с AutoIt.

если же нажать на кнопку ок, для автоматичесского копирования, то после вставки куда нужно, список не полный, где то до 15 переменных а дальше список обрывается
Да, я это заметил. Нужно сделать GUI или сразу копировать.


Добавлено:
Сообщение автоматически объединено:

Обновил скрипт.
 
Верх