Что нового

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

Новичок
Сообщения
62
Репутация
3
По поводу "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 в редакторе тем при выходе опять сбрасывается на стандартную Может кто нашел где поменять?
 

Vanguger

Новичок
Сообщения
50
Репутация
0
А нельзя ли в 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 262
Репутация
2 352
Тогда уже лучше так:

Код:
_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 262
Репутация
2 352
Более надёжный вариант:

Код:
_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 262
Репутация
2 352
Ещё проще: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).
 
Последнее редактирование:

Vanguger

Новичок
Сообщения
50
Репутация
0
Ещё проще: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 329
Репутация
1 167
Посредник между SciTE и AutoIt уже обсуждался и даже реализовывался.
Просто напоминаю, вдруг кому пригодится (пост #178)
Причина указана чуть ранее (см. пост #173)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 262
Репутация
2 352
Исправленная версия, теперь если из 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 262
Репутация
2 352
Альтернативный вариант...
Добавляем в начало скрипта 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 262
Репутация
2 352
У кого то есть идеи как обойти проблему с запуском скрипта в отдельном процессе если в нём указана директива #RequireAdmin?
Проблема в том, что при использовании #RequireAdmin после запуска из SciTE параметр /ErrorStdOut бесполезен, т.к никакие ошибки и записи в консоль не будут отображаться в SciTE, я уже не говорю о невозможности убить процесс из SciTe (Stop Executing).
 

InnI

AutoIT Гуру
Сообщения
4 329
Репутация
1 167
идеи как обойти проблему с запуском скрипта в отдельном процессе если в нём указана директива #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 329
Репутация
1 167
Насколько я помню, админский токен выдаётся при старте процесса и может наследоваться. Следовательно, легальных способов два: или запускать SciTE с правами администратора, или отключать UAC. Всё остальное - костыли.
 

CreatoR

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

CreatoR

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

CreatoR

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

CreatoR

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

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, сделать это автоматический не получилось, по причине наследования прав у запускаемого процесса.
 
Последнее редактирование:
Верх