#Requires AutoHotkey v2.0
global TextToType := ""
global IsPaused := false
global IsStopped := false
global CharDelay := 40 ; задержка между символами, мс
global WordPause := 500 ; пауза после блока слов, мс
global LinePause := 900 ; пауза после новой строки, мс
global WordsPerPause := 3 ; после скольких слов делать паузу
F6::StartTyping()
F7::TogglePause()
F8::StopTyping()
MyGui := Gui()
MyGui.Title := "Code Auto Typer"
MyGui.AddText(, "Вставь код:")
InputText := MyGui.AddEdit("w650 h300 vInputText")
MyGui.AddText(, "Задержка между символами, мс:")
MyGui.AddEdit("w100 vCharDelay", "40")
MyGui.AddText(, "Пауза после блока слов, мс:")
MyGui.AddEdit("w100 vWordPause", "500")
MyGui.AddText(, "Пауза после новой строки, мс:")
MyGui.AddEdit("w100 vLinePause", "900")
MyGui.AddText(, "Пауза после каждых N слов:")
MyGui.AddEdit("w100 vWordsPerPause", "3")
MyGui.AddButton("w100", "Start").OnEvent("Click", StartTyping)
MyGui.AddButton("x+10 w120", "Pause/Resume").OnEvent("Click", (*) => TogglePause())
MyGui.AddButton("x+10 w100", "Stop").OnEvent("Click", (*) => StopTyping())
MyGui.AddText("xm y+15", "F6 = Start")
MyGui.AddText(, "F7 = Pause/Resume")
MyGui.AddText(, "F8 = Stop")
MyGui.Show()
StartTyping(*) {
global MyGui, TextToType, IsPaused, IsStopped
global CharDelay, WordPause, LinePause, WordsPerPause
Data := MyGui.Submit(false)
TextToType := Data.InputText
CharDelay := Integer(Data.CharDelay)
WordPause := Integer(Data.WordPause)
LinePause := Integer(Data.LinePause)
WordsPerPause := Integer(Data.WordsPerPause)
if TextToType = "" {
MsgBox "Сначала вставь текст."
return
}
IsPaused := false
IsStopped := false
MsgBox "После OK у тебя будет 3 секунды, чтобы кликнуть в нужное поле."
Sleep 3000
wordCount := 0
currentWord := ""
atLineStart := false
Loop Parse TextToType {
if IsStopped {
break
}
while IsPaused {
Sleep 100
}
char := A_LoopField
; Игнорируем carriage return
if char = "`r" {
continue
}
; Новая строка
if char = "`n" {
Send "{Enter}"
Sleep LinePause
wordCount := 0
currentWord := ""
atLineStart := true
continue
}
; После новой строки пропускаем пробелы и табы из исходного текста,
; потому что PyCharm / VS Code / IDE уже сама делает отступ
if atLineStart && (char = " " || char = "`t") {
continue
}
atLineStart := false
SendText char
Sleep CharDelay
; Считаем слова по разделителям
if IsWordSeparator(char) {
if currentWord != "" {
wordCount += 1
currentWord := ""
if wordCount >= WordsPerPause {
Sleep WordPause
wordCount := 0
}
}
} else {
currentWord .= char
}
}
}
IsWordSeparator(char) {
return char = " "
|| char = "`t"
|| char = "."
|| char = ","
|| char = ";"
|| char = ":"
|| char = "("
|| char = ")"
|| char = "{"
|| char = "}"
|| char = "["
|| char = "]"
}
TogglePause() {
global IsPaused
IsPaused := !IsPaused
}
StopTyping() {
global IsStopped, IsPaused
IsStopped := true
IsPaused := false
}