Автор Тема: Внешние дополнения к редактору SciTE  (Прочитано 29825 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7806
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
« Последнее редактирование: Январь 24, 2012, 01:10:24 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Внешние дополнения к редактору SciTE
« Отправлен: Май 09, 2010, 16:06:58 »

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Re: Внешние дополнения к редактору SciTE
« Ответ #1, Отправлен: Май 11, 2010, 15:18:54 »
Внес изменения в скрипт

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

Код: 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)
 



Сильно не проверял, скорее всего нужно доводить до ума.
« Последнее редактирование: Май 11, 2010, 23:02:08 от Suppir, Причина: Объединение сообщений »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7806

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Внешние дополнения к редактору SciTE
« Ответ #2, Отправлен: Май 11, 2010, 17:59:52 »
Suppir  [?]
Цитировать
нужно доводить до ума
Ага, нужен ещё поиск по всему скрипту, чтобы определить не объявлена ли уже переменная...

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Re: Внешние дополнения к редактору SciTE
« Ответ #3, Отправлен: Май 11, 2010, 19:17:41 »
Так мы и берем в буфер весь скрипт целиком. Соответственно, все необъявленные переменные будут учитываться.


Русское сообщество AutoIt

Re: Внешние дополнения к редактору SciTE
« Ответ #3 Отправлен: Май 11, 2010, 19:17:41 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7806

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Внешние дополнения к редактору SciTE
« Ответ #4, Отправлен: Май 11, 2010, 21:50:58 »
Suppir  [?]
Цитировать
Так мы и берем в буфер весь скрипт целиком

Цитирую себя:
[?]
Цитировать
Скрипт Lua (хотя не обязательно), который умеет грамотно объявлять переменные. Он должен найти все необъявленные переменные (желательно и опционально в выделенном коде)



Добавлено: Май 11, 2010, 21:51:50
Suppir
И для чего там проверка на «(BitAND|BitNOT|BitOR)»?

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Re: Внешние дополнения к редактору SciTE
« Ответ #5, Отправлен: Май 11, 2010, 22:13:40 »
CreatoR  [?]
Цитировать
И для чего там проверка на «(BitAND|BitNOT|BitOR)»?

Это не проверка, это образание лишних переменных.

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


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


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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7806

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Внешние дополнения к редактору SciTE
« Ответ #6, Отправлен: Май 11, 2010, 22:49:24 »
Suppir  [?]
Цитировать
переменные $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION заранее объявлять не нужно, поэтому мы отрезаем их вот так
На самом деле и «$iMINGuiX, $iMINGuiY» тоже не нужно объявлять, нам нужно сразу получать переменные которым напряму присваивается значение, всё остальное это мусор.

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

Запускать скрипт из SciTE примерно так:
Код: (properties) [Выделить]
  1. command.150.$(au3)="$(autoit3dir)\AutoIt3.exe" "$(autoit3dir)\Tools\GenerateUnDeclaredVarsList.au3" "$(FilePath)" "$(CurrentSelection)"

Сам скрипт:
Код: AutoIt [Выделить]
#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


Теперь при выделение кода будет сгенерирован список не объявленных переменных.
« Последнее редактирование: Январь 16, 2012, 04:03:34 от CreatoR »

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Re: Внешние дополнения к редактору SciTE
« Ответ #7, Отправлен: Май 11, 2010, 22:56:45 »
Что-то я не пойму, как это добро из SciTE запустить. Наверное, это работает только из полной версии, а у меня усеченная автоитовская.

Русское сообщество AutoIt

Re: Внешние дополнения к редактору SciTE
« Ответ #7 Отправлен: Май 11, 2010, 22:56:45 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7806

  • Автор темы
  • Репутация: 2279
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Внешние дополнения к редактору SciTE
« Ответ #8, Отправлен: Май 12, 2010, 01:10:26 »
Suppir  [?]
Цитировать
как это добро из SciTE запустить
В «SciTE\properties\au3.properties» добавить в конец:

Код: (properties) [Выделить]
  1. #~ GenerateUnDeclaredVarsList Item
  2. command.41.$(au3)="$(SciteDefaultHome)\GenerateUnDeclaredVarsList.exe" "$(FilePath)" $(CurrentSelection)
  3. command.name.41.$(au3)=Генерировать список необъявленных переменных
  4. command.shortcut.41.$(au3)=Ctrl+2
  5. command.is.filter.41.$(au3)=1
  6. command.save.before.41.$(au3)=0

41 это последовательный номер в меню, нужно заменить на последний номер в твоём меню + 1.

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

Оффлайн Vlasssov [?]

  • Осваивающий
  • **
  • Сообщений: 416
  • Репутация: 25
  • Пол: Мужской
  • Гопломах
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Внешние дополнения к редактору SciTE
« Ответ #9, Отправлен: Май 12, 2010, 09:33:53 »
Сам язык Lua ОЧЕНЬ похож на c++. Единственная проблема - отсутствие вменяемого руководства по свойствам редактора Scite, которые используются для обработки текста. Если кто найдет структурное описание  - тогда и любой скрипт буде написать не проблема...

Оффлайн beve [?]

  • Осваивающий
  • **
  • Сообщений: 104
  • Репутация: 30
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Внешние дополнения к редактору SciTE
« Ответ #10, Отправлен: Май 12, 2010, 10:37:50 »
Vlasssov  [?]
Цитировать
Если кто найдет структурное описание  - тогда и любой скрипт буде написать не проблема...
Создай скрипт *.lua и открой его в  SciTe (русской версии) переключись на язык-подсветку Lua набери чего нибудь, и нажми клавишу F1 и будет тебе детальная справка на русском по lua.
« Последнее редактирование: Май 12, 2010, 10:44:26 от beve »
Верь в возможность того, что ты делаеш, крепко держи это у себя в сердце и перед глазами - и оно произойдет!

Оффлайн Vlasssov [?]

  • Осваивающий
  • **
  • Сообщений: 416
  • Репутация: 25
  • Пол: Мужской
  • Гопломах
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Внешние дополнения к редактору SciTE
« Ответ #11, Отправлен: Май 12, 2010, 10:46:52 »
Не хочу быть источником дурных вестей....
Есть в скрипты Autoit.lua следующая конструкция
Цитировать
editor:insert(editor.CurrentPos, s_indent .. indentchar)
выделенное жирным - объект Scite, у которого есть как минимум метод :insert и есть как минимум свойство .CurrentPos - вот это описание где взять???
Это та же ситуация, что и с Visual Basic for application. Можно сколько угодно знать Visual Basic, но не разбираться, как его применить в конкретном приложении.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Внешние дополнения к редактору SciTE
« Ответ #12, Отправлен: Май 12, 2010, 11:05:51 »
Vlasssov
c:\Program Files\SciTE\tools\Helper\SciTE.Helper_rus.html

Оффлайн Vlasssov [?]

  • Осваивающий
  • **
  • Сообщений: 416
  • Репутация: 25
  • Пол: Мужской
  • Гопломах
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Внешние дополнения к редактору SciTE
« Ответ #13, Отправлен: Май 12, 2010, 11:46:43 »
И что там?
Цитировать
Freeware ActiveX компонент для организации взаимодействия между текстовым редактором SciTE и любыми скриптами и приложениями поддерживающими COM интерфейс.
Зачем это? Ну можно word запустить...  Ну можно что-нибудь сделать...

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Внешние дополнения к редактору SciTE
« Ответ #14, Отправлен: Май 12, 2010, 12:02:30 »
Vlasssov
ты чего-то напутал. а я не дочитал. вся объектная модель Scite описана в хелпе которую я указал. ну а то что ты написал это методы не Scite, а директивы языка lua. копай в его хелпе, чтобы узнать больше

Русское сообщество AutoIt

Re: Внешние дополнения к редактору SciTE
« Ответ #14 Отправлен: Май 12, 2010, 12:02:30 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
13 Ответов
8766 Просмотров
Последний ответ Декабрь 01, 2009, 10:43:53
от Loopback
0 Ответов
2116 Просмотров
Последний ответ Февраль 08, 2011, 02:44:17
от `p r o x y
3 Ответов
7174 Просмотров
Последний ответ Апрель 03, 2011, 00:25:26
от CreatoR
2 Ответов
4171 Просмотров
Последний ответ Июнь 22, 2011, 13:10:25
от Vlasssov
33 Ответов
36643 Просмотров
Последний ответ Февраль 19, 2016, 21:20:07
от AZJIO
0 Ответов
1555 Просмотров
Последний ответ Январь 24, 2012, 01:07:13
от CreatoR
1 Ответов
1678 Просмотров
Последний ответ Февраль 28, 2013, 13:53:05
от asdf8
11 Ответов
4707 Просмотров
Последний ответ Апрель 30, 2013, 14:25:10
от mef-t
7 Ответов
2884 Просмотров
Последний ответ Март 17, 2014, 18:49:21
от asdf8
7 Ответов
1503 Просмотров
Последний ответ Февраль 03, 2015, 23:00:29
от Yashied