Тема: AHK: Исправление набранного в неверной раскладке текста
Я тут накатал скриптик для исправления текста набранного в неверной раскладке (случается такое, когда забыл переключить раскладку и напечатал что-то не смотря на экран).
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
StringCaseSense, On
#SingleInstance, Force
SetBatchLines, -1
SetKeyDelay, 10
en := "``qwertyuiop[]asdfghjkl;'zxcvbnm,./~@#$^&QWERTYUIOP{}|ASDFGHJKL:""ZXCVBNM<>?"
ru := "ёйцукенгшщзхъфывапролджэячсмитьбю.Ё""№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"
$<^<+Space::
KeyWait LCtrl
KeyWait LShift
KeyWait Space
savedClip := Clipboard
Sleep 1
Send ^{vk41}^{vk43}
Sleep 1
Clipboard ~= "i)[a-z]" ? (layoutIn := en, layoutOut := ru) : (layoutIn := ru, layoutOut := en)
Loop, Parse, Clipboard
{
IfNotInString, layoutIn, %A_LoopField%
newChar := A_LoopField
Else
StringReplace, newChar, A_LoopField, %A_LoopField%, % SubStr(layoutOut, InStr(layoutIn, A_LoopField, True), 1), All
outputStr .= newChar
}
Clipboard := outputStr
Sleep 1
Send ^{vk56}
Clipboard := savedClip
savedClip := outputStr := layoutIn := layoutOut := newChar := ""
Return
Во-первых, хочу просто поделиться скриптом - вдруг кому окажется полезным.
Во-вторых, прошу помощи в тестировании/отладке/улучшении скрипта: мне удобно использовать для работы скрипта хоткей LCtrl+LShift+Space, но т.к. он в дальнейшем посылает CTRL+A и CTRL+C для получения доступа к набранному тексту, то появился конфликт хоткеев (и триггер-хоткей и посылаемые скриптом нажатия клавиш содержат CTRL).
Вроде исправил, добавив $ (вроде должен помогать избежать параллельного [вернее, в ahk нет параллелизма, а есть псевдо-параллелизм, достигаемый добавлением команд в очередь] запуска хоткея) в хоткей, а также getkeystate проверки, которые заставляют скрипт дожидаться пока пользователь не отпустит все 3 кнопки.
Вроде глюк исчез, но т.к. скрипт работает с буфером обмена (который известен своей медленной работой) - в коде всё равно есть паузы, которые я правда попытался снизить.
Остался редкий глюк: если 20 раз подряд понажимать хоткей - некоторые разы получается так, что после вставки текста он оказывается всё ещё выделенным и потом почему-то срабатывает нажатие Space, который заменяет выделенный текст собой. CTRL+Z и повторное нажатие хоткеия в таком случае, конечно, спасёт, но лучше бы исправить этот глюк в коде (где паузы-то увеличить? не нашёл зависимости).
Есть ещё идея добавить в скрипт доп. хоткеи чтоб можно было выбирать какой кусок текста преобразовать: весь, 1 строку, или последнее слово.