Skip to content

Latest commit

 

History

History
101 lines (90 loc) · 12.1 KB

README (in Russian).md

File metadata and controls

101 lines (90 loc) · 12.1 KB

Исправление ошибок переключения раскладок клавиатуры (snoop)

Назначение

Иногда программистам приходится одновременно использовать две раскладки клавиатуры: английскую и русскую. (Я предпочитаю писать комментарии по-русски. Также, где это возможно, стараюсь и код писать по-русски.) При этом часто большой кусок введенного текста оказывается не в той раскладке. Приведенный скрипт на языке 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%
  1. в строке f содержатся все символы английской клавиатуры в порядке их следования при простом последовательном нажатии, если начать из левого верхнего угла QWERTY и двигаться по строкам в направлении правого нижнего угла; сначала перечислены все символы верхнего регистра, потом - все символы нижнего регистра;
  2. в строке g в том же порядке перечислены символы русской раскладки.
  3. если приклеить первый массив ко второму (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. Как это сделать? Ниже описаны два варианта.

Вариант 1. Утилита перекодирования iconv

Для правильного скачивания/конвертации можно воспользоваться утилитой 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

Вариант 2. ZIP-архив c исходником в правильной кодировке

В репозитории есть архив ahk-snoop.zip, в котором исходный скрипт snoop.ahk содержится в кодировке Windows-1251.

Возможности настройки

Другие языки

Подозреваю, что скрипт с минимальными доработками можно использовать не только для русского, но и для любого другого дополнительного языка (украинского, французского, немецкого и т.д.). Для этого нужно:

  1. перед компиляцией обязательно преобразовать скрипт в соответствующую подходящую кодировку Windows (cp-1251, cp-1252, etc.);
  2. исправить в скрипте соответсвующую строку g, чтобы в ней в правильном порядке отображались символы национального алфавита (насколько я понимаю, для украинского и белорусского Windows использует ту же cp-1251, но с другим размещением символов на клавиатуре);
  3. заменить параметры в коде смены раскладки на соответствующие нужному алфавиту (см. строки кода с SendMessage, 0x50).

Другие сочетания клавиш

Конечно же, это сделать легко. Ищите правильные кейкоды для AHK. Использованные коды я подбирал для своего удобства.

Другие действия

Описанным способом можно произвести любую нужную Вам табличную перекодировку (см. в коде примеры с подменой регистра), а также какую-нибудь экзотическую операцию подмены или пропуска символов (мне по работе часто нужна замена в путях к файлам прямых слешей на обратные, а также "очистка" текста SQL от квадратных скобок).

Автор

Владислав Чернышев

Лицензия

Этот проект лицензируется на условиях MIT License — подробности см. в файле LICENSE.

Благодарности

Большое спасибо Евгению Голомину за его утилиту "Опечатка by Dr. Golomin". Его утилита была одним из лучших и легковесных решений (для исправления ошибок переключения раскладок клавиатуры) на протяжении 2000-х и 2010-х. В моем сценарии я использовал тот же подход (выделение текста и перекодирование внутри буфера обмена с использованием статических настраиваемых таблиц).