Иногда программистам приходится одновременно использовать две раскладки клавиатуры: английскую и русскую. (Я предпочитаю писать комментарии по-русски. Также, где это возможно, стараюсь и код писать по-русски.) При этом часто большой кусок введенного текста оказывается не в той раскладке. Приведенный скрипт на языке AutoHotKey мне экономит очень много времени, т.к. позволяет быстро исправить раскладку выделенного текста в любом текстовом редакторе. Исправление делается заменой каждого символа на его "антогонист" из противоположной раскладки. Для перекодировки достаточно выделить текст и нажать клавишу Break. Исправленный текст будет вставлен вместо выделенного. Также есть дополнительные опции перекодировки выделенного текста (смена регистра и пр.). Вот полный список преобразований:
сочетание | действие |
---|---|
Break | заменить все английские символы на кириллические, и наоборот; включить правильную раскладку |
Ctrl-Shift-PageUp | сменить регистр каждого символа на противоположный |
Win-PageUp | все символы - в верхний регистр; включить режим CapsLock |
Win-PageDown | все символы - в нижний регистр; вЫключить режим CapsLock |
Alt-Shift-\ | в тексте заменить все правые слеши (/) на левые (\) |
Alt-Shift-] | в тексте убрать все квадратные скобки ([ и ]) |
Как только Вы обнаружили, что введенный текст оказался в неправильной кодировке, Вам нужно (1) выделить "неправильный" текст и (2) нажать кнопку Break. Скрипт (1) перекодирует все символы и вставит их вместо выделенного "неправильного" текста и (2) определит по первому символу раскладку ввода, и сменит ее на альтернативную (если первый символ выделенного текста был английским, то будет активирована русская раскладка, и наоборот). Подбор правильного символа делается на основе двух таблиц: в первой перечислены в естественном порядке все символы английской раскладки, во второй - в том же порядке - все символы русской раскладки. Таблицы перекодировки устроены очень просто:
static f := "QWERTYUIOP{}ASDFGHJKL:""|ZXCVBNM<>?qwertyuiop[]asdfghjkl;'\zxcvbnm,./``~!@#$`%^&"
static g := "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,йцукенгшщзхъфывапролджэ\ячсмитьбю.ёЁ!""№;`%:?"
fg = %f%%g%
gf = %g%%f%
- в строке
f
содержатся все символы английской клавиатуры в порядке их следования при простом последовательном нажатии, если начать из левого верхнего угла QWERTY и двигаться по строкам в направлении правого нижнего угла; сначала перечислены все символы верхнего регистра, потом - все символы нижнего регистра; - в строке
g
в том же порядке перечислены символы русской раскладки. - если приклеить первый массив ко второму (
fg=f+g
) и второй к первому (gf=g+f
), то на одинаковых местах там всегда будут стоять символы-антогонисты; поэтому для перекодировки ищем место заменяемого символа в первом массивеfg
и по полученному индексу получаем заменяющий символ из второго массиваgf
.
Оригинальная идея была мной подсмотрена в утилите "Опечатка by Dr. Golomin". Этой утилитой я пользовался примерно 18 лет (2001-2018), за что очень благодарен автору, Евгению Голомину. Утилита у него называлась SNOOP, поэтому я сохранил название.
Для работы скрипта необходим Windows 7 или 10 и установленный пакет AutoHotkey v1.1 (у меня v1.1.30.03, для установки AHK посетите https://autohotkey.com/).
Для запуска с использованием среды AutoHotkey разместите скрипт в любом удобном каталоге (например, C:\UTIL\AHK
) и запускайте его командой:
start "snoop" "C:\UTIL\AHK\snoop.ahk"
Также я сделал исполняемый EXE-файл для тех, кто хочет просто использовать работающую утилиту, и не хочет устанавливать на свою систему AutoHotkey. EXE-файл работает как на 32-разрядных, так и на 64-разрядных системах Windows. Его можно запускать, например, такой командой (из пакетного BAT файла):
start "snoop" "C:\UTIL\AHK\snoop.exe"
Для запуска при старте системы нужно разместить ссылку на исполняемый BAT или EXE-файл в папке "%userprofile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
.
У меня там помещена ссылка на специальный пакетный файл autoexec.BAT
, в котором имеется вышеозначенная строка.
В репозитории файл AHK выложен в кодировке utf-8. В скрипте все символы национальной (русской) раскладки перечислены явно, поэтому для правильной работы скрипта перед компиляцией его нужно преобразовать в кодировку ANSI. (Репозиторий github требует перекодировки текстовых файлов в utf-8, иначе они некорректно отображаются в интернет-браузере). У меня в системе Windows в качестве ANSI использована кодировка cp-1251. При скачивании Вы получите файл в кодировке utf-8, который будет работать некорректно. Чтобы он заработал правильно, его нужно перекодировать в windows-1251. Как это сделать? Ниже описаны два варианта.
Для правильного скачивания/конвертации можно воспользоваться утилитой iconv
(https://mlocati.github.io/articles/gettext-iconv-windows.html).
У меня настроен для репозитория фильтр в файле .git\config:
[filter "wincp1251"]
clean = iconv -f windows-1251 -t utf-8
smudge = iconv -f utf-8 -t windows-1251
required
и использование этого фильтра в файле .gitattributes:
*.ahk filter=wincp1251
В репозитории есть архив ahk-snoop.zip
, в котором исходный скрипт snoop.ahk
содержится в кодировке Windows-1251.
Подозреваю, что скрипт с минимальными доработками можно использовать не только для русского, но и для любого другого дополнительного языка (украинского, французского, немецкого и т.д.). Для этого нужно:
- перед компиляцией обязательно преобразовать скрипт в соответствующую подходящую кодировку Windows (cp-1251, cp-1252, etc.);
- исправить в скрипте соответсвующую строку
g
, чтобы в ней в правильном порядке отображались символы национального алфавита (насколько я понимаю, для украинского и белорусского Windows использует ту же cp-1251, но с другим размещением символов на клавиатуре); - заменить параметры в коде смены раскладки на соответствующие нужному алфавиту (см. строки кода с
SendMessage, 0x50
).
Конечно же, это сделать легко. Ищите правильные кейкоды для AHK. Использованные коды я подбирал для своего удобства.
Описанным способом можно произвести любую нужную Вам табличную перекодировку (см. в коде примеры с подменой регистра), а также какую-нибудь экзотическую операцию подмены или пропуска символов (мне по работе часто нужна замена в путях к файлам прямых слешей на обратные, а также "очистка" текста SQL от квадратных скобок).
Владислав Чернышев
Этот проект лицензируется на условиях MIT License — подробности см. в файле LICENSE.
Большое спасибо Евгению Голомину за его утилиту "Опечатка by Dr. Golomin". Его утилита была одним из лучших и легковесных решений (для исправления ошибок переключения раскладок клавиатуры) на протяжении 2000-х и 2010-х. В моем сценарии я использовал тот же подход (выделение текста и перекодирование внутри буфера обмена с использованием статических настраиваемых таблиц).