Что нового

SciTE 3.5.5.101 для AutoIt

KarSar

Новичок
Сообщения
15
Репутация
0
Приветствую!
Благодарю за отличную версию SciTE!!! :laugh:

Но я никак не могу настроить его так, чтобы при запуске кода в консоли (Output) кроме адреса запускаемого файла печатался бы и дата + врем ( затем если без ошибок печатается >Exit code: 0 Time: 2.547)
Я честно потратил час времени на формулировку и поиск параметра, который отвечает за данные в print output.
Если кто знает как это сделать, поделитесь пожалуйста. :IL_AutoIt_1:
 
Сообщения
137
Репутация
-2
Добрый вечер,

Редактор действительно шикарный и простой в работе. Я использовал всегда версию Portable и она у меня начала глючить. При запуске слева мигает поле чёрным цветом, прыгают строки...подскажите, пожалуйста, как это исправить.
 

RavdonikaS

Новичок
Сообщения
68
Репутация
4
По поводу "Auto Calltip" и "Auto Autocomplete" читал тут несколько разных багов было у людей
У меня на Win10 работало все как положено с последней версией SciTE от Yashied а вот на Win7 не сохранялись при выходе из программы галочки на этих пунктах меню
Т.е. поставишь галочки подсказки показываются а когда выключаешь SciTE и включаешь по новой то галочки уже не стоят Приходилось каждый раз при запуске выставлять их
Решил изменением в файле au3.properties
В разделе [Advanced] строчки со звездочками значения с 0 на 1
#~Totally disable autocomplete or calltips when set to 0
* use.auto.autocomplete.au3=1
* use.auto.calltips.au3=1

Осталась та же проблема с цветовой темой SciTE в редакторе тем при выходе опять сбрасывается на стандартную Может кто нашел где поменять?
 

Webarion

Осваивающий
Сообщения
143
Репутация
24
А нельзя ли в lua сделать перехват клика например CTRL+ЛКМ, изменить кликнутую строку, удалив в консоли кавычки, далее чтобы обычным двойным можно было открывать?

Небольшой костылёк, который помогает переходить к строке ошибки в другом файле по клику. Хотя, это ещё далеко до иделала.
Код:
If StringInStr($cmdlineraw, "*") = 0 Then
    Opt("TrayIconHide", 1)

    $x = Run('"Autoit3.exe" "' & @ScriptFullPath & '" *')

    ProcessWait($x, 5)
    While ProcessExists($x)
        If WinActive("AutoIt Error") Then _OnAutoItError(WinGetText("AutoIt Error"))
        Sleep(20)
    WEnd
    Exit
EndIf

Func _OnAutoItError($txt)
    Send("{ENTER}")
    $aTxt = StringSplit($txt, @CRLF, 1)
    Local $aLine = StringRegExp($txt, '(?s)^.*Line\h+(\d+)', 1)
    Local $aFile = StringRegExp($txt, '(?s)^.*Line\h+\d+\h+\(File\h+"(.+)"\):', 1)
    Local $aErrBrp = StringRegExp($txt, '(?s)^.*Line\h+\d+\h+\(File\h+".+"\):\h*\r?\n\r?\n?(.*)\r?\nError:.*$', 1)
    Local $aErrTxt = StringRegExp($txt, '(?s)^.*Line\h+\d+\h+\(File\h+".+"\):.*\r?\nError:\h+(.+)\r?\n?$', 1)
    Local $sLine = IsArray($aLine) And $aLine[0] ? $aLine[0] : ''
    Local $sFile = IsArray($aFile) And $aFile[0] ? $aFile[0] : ''
    Local $sErrBrp = IsArray($aErrBrp) And $aErrBrp[0] ? $aErrBrp[0] : ''
    Local $sErrTxt = IsArray($aErrTxt) And $aErrTxt[0] ? $aErrTxt[0] : ''
    $sTextError = $sFile & ' (' & $sLine & ') : ==> ' & $sErrTxt & $sErrBrp
    ConsoleWrite($sTextError)
    Exit
EndFunc

; Создаём ошибку
Global Const $SWP_SHOWWINDOW = 0x0040
#include <AutoItConstants.au3>
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Тогда уже лучше так:

Код:
_SciTE_ErrorFix()

; Создаём ошибку
Global Const $SWP_SHOWWINDOW = 0x0040
#include <AutoItConstants.au3>

Func _SciTE_ErrorFix()
    Local $sTmp = @TempDir & '\SciTE_ErrorFix.tmp'
    
    Local $sScript = _
    '#NoTrayIcon' & @CRLF & _
    'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
    '    Sleep(10)' & @CRLF & _
    'WEnd' & @CRLF & _
    'Sleep(250)' & @CRLF & _
    '$sText = ControlGetText("[CLASS:SciTEWindow]", "", "[CLASS:Scintilla; INSTANCE:2]")' & @CRLF & _
    'If StringRegExp($sText, """.*?"" \(\d+\) : ==>") Then' & @CRLF & _
    '    $sText = StringRegExpReplace($sText, """(.+?)""( \(\d+\) : ==>)", "\1\2")' & @CRLF & _
    '    ;ControlSetText("[CLASS:SciTEWindow]", "", "[CLASS:Scintilla; INSTANCE:2]", $sText, 1)' & @CRLF & _
    '    ClipPut($sText)' & @CRLF & _
    '    ControlSend("[CLASS:SciTEWindow]", "", "[CLASS:Scintilla; INSTANCE:2]", "^a+{INS}")' & @CRLF & _
    'EndIf' & @CRLF & _
    'FileDelete("' & $sTmp & '")' & @CRLF
    
    $hFile = FileOpen($sTmp, 2)
    FileWrite($hFile, $sScript)
    FileClose($hFile)
    
    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTmp & '"')
    Sleep(100)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Более надёжный вариант:

Код:
_SciTE_ErrorFix()

; Создаём ошибку
Global Const $SWP_SHOWWINDOW = 0x0040
#include <AutoItConstants.au3>

Func _SciTE_ErrorFix()
    If @Compiled Then
        Return
    EndIf
    
    Local $sScript = _
        '#NoTrayIcon' & @CRLF & _
        'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
        '    Sleep(10)' & @CRLF & _
        'WEnd' & @CRLF & _
        '$iTimer = TimerInit()' & @CRLF & _
        'Do' & @CRLF & _
        '    $sText = ControlGetText("[CLASS:SciTEWindow]", "", "[CLASS:Scintilla; INSTANCE:2]")' & @CRLF & _
        '    If TimerDiff($iTimer) > 2000 Then Exit' & @CRLF & _
        'Until StringRegExp($sText, """.*?"" ?\(\d+\) : ==>")' & @CRLF & _
        '$sCmd = "extender:dostring scite.MenuCommand(IDM_CLEAROUTPUT)"' & @CRLF & _
        '$stCmd = DllStructCreate("char[" & StringLen($sCmd) + 1 & "]")' & @CRLF & _
        'DllStructSetData($stCmd, 1, $sCmd)' & @CRLF & _
        '$stCOPYDATA = DllStructCreate("ptr;dword;ptr")' & @CRLF & _
        'DllStructSetData($stCOPYDATA, 2, StringLen($sCmd) + 1)' & @CRLF & _
        'DllStructSetData($stCOPYDATA, 3, DllStructGetPtr($stCmd))' & @CRLF & _
        'DllCall("User32.dll", "None", "SendMessage", "HWnd", WinGetHandle("[CLASS:DirectorExtension;TITLE:DirectorExtension]"), "Int", 74, "HWnd", 0, "Ptr", DllStructGetPtr($stCOPYDATA))' & @CRLF & _
        '$sText = StringRegExpReplace($sText, """(.*?)""( \(\d+\) : ==>)", "\1\2")' & @CRLF & _
        '$sText = "output:" & StringRegExpReplace(StringReplace(StringReplace($sText, "\", "\\"), @TAB, "\t"), "[\r\n]+", "\\r\\n")' & @CRLF & _
        '$stCmd = DllStructCreate("char[" & StringLen($sText) + 1 & "]")' & @CRLF & _
        'DllStructSetData($stCmd, 1, $sText)' & @CRLF & _
        '$stCOPYDATA = DllStructCreate("ptr;dword;ptr")' & @CRLF & _
        'DllStructSetData($stCOPYDATA, 2, StringLen($sText) + 1)' & @CRLF & _
        'DllStructSetData($stCOPYDATA, 3, DllStructGetPtr($stCmd))' & @CRLF & _
        'DllCall("User32.dll", "None", "SendMessage", "HWnd", WinGetHandle("[CLASS:DirectorExtension;TITLE:DirectorExtension]"), "Int", 74, "HWnd", 0, "Ptr", DllStructGetPtr($stCOPYDATA))'
    
    Local $sTmp = @TempDir & '\SciTE_ErrorFix.tmp'
    Local $hFile = FileOpen($sTmp, 2)
    FileWrite($hFile, $sScript)
    FileClose($hFile)
    
    Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTmp & '"')
    Sleep(200)
    FileDelete($sTmp)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Ещё проще:yahoo::

Пишем в SciTE\properties\au3.properties:
Код:
autoit.cmd.go="$(SciteDefaultHome)\Tools\ErrOutFix.exe" "$(AutoIt3Dir)\AutoIt3.exe" /ErrorStdOut "$(FilePath)" $(1) $(2) $(3) $(4)
autoit.cmd.go64="$(SciteDefaultHome)\Tools\ErrOutFix.exe" "$(AutoIt3Dir)\AutoIt3_x64.exe" /ErrorStdOut "$(FilePath)" $(1) $(2) $(3) $(4)
autoit.cmd.syntaxcheck="$(SciteDefaultHome)\Tools\ErrOutFix.exe" "$(AutoIt3Dir)\Au3Check.exe" "$(FilePath)"

И кладём в папку SciTE\Tools следующий скомпилированный скрипт (ErrOutFix.exe):
Код:
#NoTrayIcon

If $CmdLine[0] = 0 Then
    MsgBox(16, @ScriptName, 'Fix for error output in SciTE - Internal usage only')
    Exit
EndIf

$iPID = Run($CmdLineRaw, '', @SW_HIDE, 6)
If @error Or Not $iPID Then Exit

ProcessWaitClose($iPID)
ConsoleWrite(StringRegExpReplace(StdoutRead($iPID), '"(.*?)" ?(\([,\d]+\) :)', '\1 \2'))


Проблема решена!
Работает как для ошибок при запуске скрипта (F5), так и для ошибок при проверке синтаксиса (F8).
 
Последнее редактирование:

Webarion

Осваивающий
Сообщения
143
Репутация
24
Ещё проще:yahoo::

Пишем в SciTE\properties\au3.properties:
Код:
autoit.cmd.go="$(SciteDefaultHome)\Tools\ErrOutFix.exe" "$(AutoIt3Dir)\AutoIt3.exe" /ErrorStdOut "$(FilePath)" $(1) $(2) $(3) $(4)
autoit.cmd.go64="$(SciteDefaultHome)\Tools\ErrOutFix.exe" "$(AutoIt3Dir)\AutoIt3_x64.exe" /ErrorStdOut "$(FilePath)" $(1) $(2) $(3) $(4)
autoit.cmd.syntaxcheck="$(SciteDefaultHome)\Tools\ErrOutFix.exe" "$(AutoIt3Dir)\Au3Check.exe" "$(FilePath)"

И кладём в папку SciTE\Tools следующий скомпилированный скрипт (ErrOutFix.exe):
Код:
#NoTrayIcon

If $CmdLine[0] = 0 Then
    MsgBox(16, @ScriptName, 'Fix for error output in SciTE - Internal usage only')
    Exit
EndIf

$iPID = Run($CmdLineRaw, '', @SW_HIDE, 6)
If @error Or Not $iPID Then Exit

ProcessWaitClose($iPID)
ConsoleWrite(StringRegExpReplace(StdoutRead($iPID), '"(.*?)" ?(\([,\d]+\) :)', '\1 \2'))


Проблема решена!
Работает как для ошибок при запуске скрипта (F5), так и для ошибок при проверке синтаксиса (F8).

Это круто! :clapping::yahoo:
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Посредник между SciTE и AutoIt уже обсуждался и даже реализовывался.
Просто напоминаю, вдруг кому пригодится (пост #178)
Причина указана чуть ранее (см. пост #173)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Исправленная версия, теперь если из SciTE нажать Stop, то остановится и выполнение самого скрипта.

Код:
#NoTrayIcon

If $CmdLine[0] = 0 Then
    MsgBox(16, @ScriptName, 'Fix for error output in SciTE - Internal usage only')
    Exit
EndIf

$iPID = Run($CmdLineRaw, '', @SW_HIDE, 6)
If @error Or Not $iPID Then Exit

;Termination monitor
$sTmp = @TempDir & '\ErrOutFix_Mon.tmp'

$sScript = _
    '#NoTrayIcon' & @CRLF & _
    'While ProcessExists(' & @AutoItPID & ')' & @CRLF & _
    '    Sleep(10)' & @CRLF & _
    'WEnd' & @CRLF & _
    'ProcessClose(' & $iPID & ')' & @CRLF & _
    'FileDelete("' & $sTmp & '")'

$hFile = FileOpen($sTmp, 2)
FileWrite($hFile, $sScript)
FileClose($hFile)

Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTmp & '"')

ProcessWaitClose($iPID)
ConsoleWrite(StringRegExpReplace(StdoutRead($iPID), '"(.*?)" ?(\([,\d]+\) :)', '\1 \2'))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Альтернативный вариант...
Добавляем в начало скрипта SciTE\lua\AutoItAutoComplete.lua:
Код:
sLast_Output_Text = ''

AddEventHandler("OnUpdateUI", function(c)
    sOutput = output:GetText()
    
    sPattern1 = '([\r\n]+)"([^"]+)" ?(%([,%d]+%) : error:)'
    sPattern2 = '([\r\n]+)"([^"]+)" ?(%([,%d]+%) : ==>)'
    
    if not (sOutput == sLast_Output_Text) and (string.gmatch(sOutput, sPattern1) or string.gmatch(sOutput, sPattern2)) then
        sOutput = string.gsub(sOutput, sPattern1, '%1%2 %3')
        sOutput = string.gsub(sOutput, sPattern2, '%1%2 %3')
        
        sLast_Output_Text = sOutput
        
        iPos = output.CurrentPos
        output:SetText(sOutput)
        output:GotoPos(iPos)
    end
end)

и наслаждаемся, при этом ничего больше не надо :blush:
 
Последнее редактирование:
  • Like
Реакции: xXx

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
У кого то есть идеи как обойти проблему с запуском скрипта в отдельном процессе если в нём указана директива #RequireAdmin?
Проблема в том, что при использовании #RequireAdmin после запуска из SciTE параметр /ErrorStdOut бесполезен, т.к никакие ошибки и записи в консоль не будут отображаться в SciTE, я уже не говорю о невозможности убить процесс из SciTe (Stop Executing).
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
идеи как обойти проблему с запуском скрипта в отдельном процессе если в нём указана директива #RequireAdmin
AutoIt3Wrapper в текущей полной версии SciTE (27-11-2019) умеет это делать:
Код:
+>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
->12:23:53 Script requires Admin rights while SciTE is at normal level -> Starting new AutoIt3Wrapper with #RequireAdmin to run the script.
+>12:24:02 Script started, waiting for output. (pid=2636)
-##>12:24:02 Restarted AutoIt3Wrapper with #RequireAdmin. (pid=2636)
Причём работают и вывод в текущую консоль SciTE и указанные хоткеи.
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
Насколько я помню, админский токен выдаётся при старте процесса и может наследоваться. Следовательно, легальных способов два: или запускать SciTE с правами администратора, или отключать UAC. Всё остальное - костыли.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
запускать SciTE с правами администратора
О, это уже что то...
Остаётся вопрос как сделать так, чтобы при запуске SciTE определялось наличие директивы #RequireAdmin, и если есть таковая, то запускать с правами администратора...
 
Последнее редактирование:

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AutoIt3Wrapper в текущей полной версии SciTE (27-11-2019) умеет это делать:
Интересно как оно это делает, я пытался сделать похожий врапер но только для этих целей, и ничего не вышло...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Вот тут есть решение в виде изменения manifest для SciTE.exe, но тогда невозможно использование при запуске из под обычной учётной записи (не админ).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Короче вот такое решение сделал пока что:

1. Закрываем полностью SciTE.
2. Копируем файл SciTE.exe в SciTE.RA.
3. Открываем файл SciTE.RA в ResHacker и меняем в ресурсе manifest (24 --> 1 --> 1033) строку level="asInvoker" на level="requireAdministrator" и сохраняем файл.
4. Открываем файл SciTE\lua\SaveSettings.lua, находим в нём функцию local function SaveSettings() и добавляем запись SaveKey('require.admin').
5. Также открываем файл SciTE\settings.properties и дописываем в конец require.admin=0.
6. Далее в файле меню (SciTE\menu\menu.properties) находим command.submenu.name.4.*=Settings и добавляем под ней следующий блок:
Код:
    command.parent.43.*=4
    command.name.43.*=Execution Level: "requireAdministrator"
    command.43.*=dostring \
                iIsRA = (tonumber(props['require.admin']) == 1) \
                iRA = (iIsRA and io.popen('if exist "' .. props['SciteDefaultHome'] .. '\\SciTE.RA" (echo 1)'):read'*l' == '1') \
                iNRA = (not iIsRA and io.popen('if exist "' .. props['SciteDefaultHome'] .. '\\SciTE.NRA" (echo 1)'):read'*l' == '1') \
                if iRA or iNRA then \
                    shell.msgbox('This option already have been set, please restart SciTE (all instances).', 'Attention', 48) \
                else \
                    ToggleProp('require.admin') \
                    sWait = 'Start /Wait "" "' .. props['AutoIt3Dir'] .. '\\AutoIt3.exe" /AutoIt3ExecuteLine "ProcessWaitClose(""SciTE.exe"")"' \
                    sRen = 'Ren "SciTE.exe" "SciTE.RA" & Ren "SciTE.NRA" "SciTE.exe"' \
                    if tonumber(props['require.admin']) == 1 then \
                        sRen = 'Ren "SciTE.exe" "SciTE.NRA" & Ren "SciTE.RA" "SciTE.exe"' \
                    end \
                    shell.exec('CMD /C CD "' .. props['SciteDefaultHome'] .. '" & ' .. sWait .. ' & ' .. sRen, nil, true, false) \
                    shell.msgbox('Please restart SciTE (all instances).', 'Attention', 48) \
                end
    command.mode.43.*=subsystem:lua,savebefore:no
    command.checked.43.*=$(require.admin)

Теперь в меню Tools\Settings у нас есть пункт Execution Level: "requireAdministrator" который позволит переключать между обычным SciTE, и версией с требованием прав администратора.
Естественно после каждого переключения нужно перезапускать SciTE, сделать это автоматический не получилось, по причине наследования прав у запускаемого процесса.
 
Последнее редактирование:
Верх