1

Тема: AHK: Ввод греческих букв

Если при работе в Ворде часто приходится вводить греческие символы, может пригодится следующий скрипт.
Выглядит сурово, но работает. Большинство букв ассоциируются с русскими, к остальным надо привыкнуть. Нажатие Caps Lock включает/отключает режим греческих букв. Удерживая Shift, вводим заглавные.
Минусы: работает на отпускание клавиши; необходим юникод.
Плюсы: не нужно браться за мышку и лезть в палитру; включается одним нажатием при любой раскладке.

#Singleinstance, force
SetKeyDelay, -1, -1

;Заглавные
+vk46 up:: Send, {Alt down}{vk69}{vk61}{vk63}{Alt up}    ;А    Альфа
+vkBC up:: Send, {Alt down}{vk69}{vk61}{vk64}{Alt up}    ;Б    Бета
+vk44 up:: Send, {Alt down}{vk69}{vk61}{vk64}{Alt up}    ;В    Бета
+vk55 up:: Send, {Alt down}{vk69}{vk61}{vk65}{Alt up}    ;Г    Гамма
+vk4C up:: Send, {Alt down}{vk69}{vk61}{vk66}{Alt up}    ;Д    Дельта
+vk54 up:: Send, {Alt down}{vk69}{vk61}{vk67}{Alt up}    ;Е    Эпсилон
+vk50 up:: Send, {Alt down}{vk69}{vk61}{vk68}{Alt up}    ;З    Дзета
+vkDE up:: Send, {Alt down}{vk69}{vk61}{vk69}{Alt up}    ;Э    Эта
+vkBE up:: Send, {Alt down}{vk69}{vk62}{vk60}{Alt up}    ;Ю    Тета
+vk42 up:: Send, {Alt down}{vk69}{vk62}{vk61}{Alt up}    ;И    Йота
+vk51 up:: Send, {Alt down}{vk69}{vk62}{vk61}{Alt up}    ;Й    Йота
+vk52 up:: Send, {Alt down}{vk69}{vk62}{vk62}{Alt up}    ;К    Каппа
+vk4B up:: Send, {Alt down}{vk69}{vk62}{vk63}{Alt up}    ;Л    Лямбда
+vk56 up:: Send, {Alt down}{vk69}{vk62}{vk64}{Alt up}    ;М    Мю
+vk59 up:: Send, {Alt down}{vk69}{vk62}{vk65}{Alt up}    ;Н    Ню
+vk57 up:: Send, {Alt down}{vk69}{vk62}{vk66}{Alt up}    ;Ц    Кси
+vk4A up:: Send, {Alt down}{vk69}{vk62}{vk67}{Alt up}    ;О    Омикрон
+vk47 up:: Send, {Alt down}{vk69}{vk62}{vk68}{Alt up}    ;П    Пи
+vk48 up:: Send, {Alt down}{vk69}{vk62}{vk69}{Alt up}    ;Р    Ро
+vk43 up:: Send, {Alt down}{vk69}{vk63}{vk61}{Alt up}    ;С    Сигма
+vk4E up:: Send, {Alt down}{vk69}{vk63}{vk62}{Alt up}    ;Т    Тау
+vk45 up:: Send, {Alt down}{vk69}{vk63}{vk63}{Alt up}    ;У    Ипсилон
+vk41 up:: Send, {Alt down}{vk69}{vk63}{vk64}{Alt up}    ;Ф    Фи
+vkDB up:: Send, {Alt down}{vk69}{vk63}{vk65}{Alt up}    ;Х    Хи
+vkBA up:: Send, {Alt down}{vk69}{vk63}{vk66}{Alt up}    ;Ж    Пси
+vk5A up:: Send, {Alt down}{vk69}{vk63}{vk67}{Alt up}    ;Я    Омега

;строчные
vk46 up:: Send, {Alt down}{vk69}{vk64}{vk65}{Alt up}    ;а    альфа
vkBC up:: Send, {Alt down}{vk69}{vk64}{vk66}{Alt up}    ;б    бета
vk44 up:: Send, {Alt down}{vk69}{vk64}{vk66}{Alt up}    ;в    бета
vk55 up:: Send, {Alt down}{vk69}{vk64}{vk67}{Alt up}    ;г    гамма
vk4C up:: Send, {Alt down}{vk69}{vk64}{vk68}{Alt up}    ;д    дельта
vk54 up:: Send, {Alt down}{vk69}{vk64}{vk69}{Alt up}    ;е    эпсилон
vk50 up:: Send, {Alt down}{vk69}{vk65}{vk60}{Alt up}    ;з    дзета
vkDE up:: Send, {Alt down}{vk69}{vk65}{vk61}{Alt up}    ;э    эта
vkBE up:: Send, {Alt down}{vk69}{vk65}{vk62}{Alt up}    ;ю    тета
vk42 up:: Send, {Alt down}{vk69}{vk65}{vk63}{Alt up}    ;и    йота
vk51 up:: Send, {Alt down}{vk69}{vk65}{vk63}{Alt up}    ;й    йота
vk52 up:: Send, {Alt down}{vk69}{vk65}{vk64}{Alt up}    ;к    каппа
vk4B up:: Send, {Alt down}{vk69}{vk65}{vk65}{Alt up}    ;л    лямбда
vk56 up:: Send, {Alt down}{vk69}{vk65}{vk66}{Alt up}    ;м    мю
vk59 up:: Send, {Alt down}{vk69}{vk65}{vk67}{Alt up}    ;н    ню
vk57 up:: Send, {Alt down}{vk69}{vk65}{vk68}{Alt up}    ;ц    кси
vk4A up:: Send, {Alt down}{vk69}{vk65}{vk69}{Alt up}    ;о    омикрон
vk47 up:: Send, {Alt down}{vk69}{vk66}{vk60}{Alt up}    ;п    пи
vk48 up:: Send, {Alt down}{vk69}{vk66}{vk61}{Alt up}    ;р    ро
vk43 up:: Send, {Alt down}{vk69}{vk66}{vk63}{Alt up}    ;с    сигма
vk4E up:: Send, {Alt down}{vk69}{vk66}{vk64}{Alt up}    ;т    тау
vk45 up:: Send, {Alt down}{vk69}{vk66}{vk65}{Alt up}    ;у    ипсилон
vk41 up:: Send, {Alt down}{vk69}{vk66}{vk66}{Alt up}    ;ф    фи
vkDB up:: Send, {Alt down}{vk69}{vk66}{vk67}{Alt up}    ;х    хи
vkBA up:: Send, {Alt down}{vk69}{vk66}{vk68}{Alt up}    ;ж    пси
vk5A up:: Send, {Alt down}{vk69}{vk66}{vk69}{Alt up}    ;я    омега

;неиспользуемые
*vk58::
*vk49::
*vk4F::
*vkDD::
*vk53::
*vk4D::
return

CapsLock:: Suspend
F12:: ExitApp

2

Re: AHK: Ввод греческих букв

Не смог проверить, т.к. Ворда нет. Думаю, возможно более универсальное решение, чтобы работало не только в Ворде. Правда, опять же, не знаю, как это поведёт себя в Ворде. Тут используются коды символов, взятые из программки "Таблица символов" Windows.

#Singleinstance, force
SetKeyDelay, -1, -1

;Заглавные
+vk46:: SendU(0x391)   ;А    Альфа
+vkBC:: SendU(0x392)   ;Б    Бета
+vk44:: SendU(0x392)   ;В    Бета
+vk55:: SendU(0x393)   ;Г    Гамма
+vk4C:: SendU(0x394)   ;Д    Дельта

;строчные
vk46:: SendU(0x3B1)    ;а    альфа
vkBC:: SendU(0x3B2)    ;б    бета
vk44:: SendU(0x3B2)    ;в    бета
vk55:: SendU(0x3B3)    ;г    гамма
vk4C:: SendU(0x3B4)    ;д    дельта

CapsLock:: Suspend
F12:: ExitApp

;===================== Функция ====================================

SendU(UC) {  ; Send Unicode Char, Pressed modifier keys stay active!
    VarSetCapacity(SendUbuf, 56, 0) ; INIT SendU data strucure
    NumPut(1, SendUbuf, 0, "Char")
    NumPut(1, SendUbuf,28, "Char")
    NumPut(0x40000|UC, SendUbuf, 6)
    NumPut(0x60000|UC, SendUbuf,34)
    Return DllCall("SendInput", UInt,2, UInt,&SendUbuf, Int,28)
}

3

Re: AHK: Ввод греческих букв

Кстати, установил для пробы AutoHotkey_L, юникодовский вариант. Там этой проблемы вообще нет. Скрипты можно сохранять в UTF-8, так что можно просто написать в скрипте:

F11:: Send, ΙΘΞΣΨΩ

И всё нормально посылается.

Также можно работать с файлами в разных кодировках, что тоже было проблемой в основном AutoHotkey. Чтение/запись бинарных файлов тоже встроена. Наверно, пора на него переходить. Тем более, эта ветка развивается, а основная что-то заглохла.

4

Re: AHK: Ввод греческих букв

YMP пишет:

Кстати, установил для пробы AutoHotkey_L, юникодовский вариант.

Можно бы, пожалуй, под это дело отдельную тему завести: может, ещё желающие найдутся попробовать, а?! А то — сразу в «Новости…».

5

Re: AHK: Ввод греческих букв

Ну, вообще-то, это давно не новости, просто не доходили руки разобраться. Насчёт тем на эту тему я уже думал. По мере того, как сам буду разбираться в документации, можно и пересказывать на русском. Документация там напоминает не дерево, а скорее сеть. Ходишь по ссылкам и постепенно теряешь ориентацию.

6

Re: AHK: Ввод греческих букв

ypppu, функция SendU, собственно, не моя, взята отсюда: SendInput in Unicode mode. Я только создание буфера внёс внутрь функции. Думаю, в теме в Коллекции нужно дать ссылку на оригинал.

7

Re: AHK: Ввод греческих букв

Готово.

8

Re: AHK: Ввод греческих букв

Возможно вводить символы определённым шрифтом?
Допустим, при вставке текста (Ctrl+V) приложение понимает форматирование. И если в буфере обмена текст был определённым шрифтом, то он и вставится этим же шрифтом. А можно ли в буфере сформировать символ в нужном формате?

9

Re: AHK: Ввод греческих букв

Если разбираетесь в этом формате.

10

Re: AHK: Ввод греческих букв

Я могу скопировать в буфер символ. Можно с помощью Autohotkey записать содержимое буфера в файл, чтобы потом считывать в буфер из файла?

11

Re: AHK: Ввод греческих букв

Конечно, можно. Почитайте про ClipboardAll. Только у Вас получится по файлу на каждый символ.

Если же все символы в один файл, тогда нужно через DllCall с API работать. Любой формат можно извлечь или поместить, какой нужно. Пример извлечения я давал тут: AHK: Доступ к расширенному буферу.

12

Re: AHK: Ввод греческих букв

ClipboardAll также может быть сохранена в файл (в этом режиме FileAppend всегда перезаписывает существующий файл):
FileAppend, %ClipboardAll%, C:\Company Logo.clip ; Расширение файла не имеет значения.

Для последующего восстановления файла в клипборде (или в переменной) следуйте следующему образцу:
FileRead, Clipboard, *c C:\Company Logo.clip ; Обратите внимание на *c перед именем файла

Почему-то запись содержимого буфера работает, а при чтении из файла в буфере оказывается пусто.

13

Re: AHK: Ввод греческих букв

Не знаю, у меня всё работает.

14

Re: AHK: Ввод греческих букв

Нашёл у себя ошибку, всё работает.

15

Re: AHK: Ввод греческих букв

Теперь такой костыль всплыл.
На горячую клавишу (Shift+Ч) назначил вставку символа из буфера. В буфер он попадает из переменной, в которую предварительно считывается из файла. Заодно содержимое буфера записывается во вспомогательную переменную ClipSaved, из которого потом и восстанавливается.
Привожу код.

FileAppend, %ClipboardAll%, 1.smb
Sleep, 1000
FileRead, phi2, *c 1.smb

+vk58::            ;Ч
ClipSaved := ClipboardAll
Clipboard :=phi2
Send ^{vk56}
Clipboard := ClipSaved
sleep, 50
return

Возьмите в буфер какую-нибудь букву. Запустите скрипт. Теперь, если нажать Shift+Ч, в текстовом поле вставится символ. Но если нажать и удерживать Shift+Ч, будет напечатан этот же символ, но вперемежку с Ч. А если при этом в буфере было что-то ещё, то получится ещё интереснее.
Спрашивается, как сделать, чтобы при удерживании Shift+Ч печатался ряд символов (из переменной phi2), а не всякий хлам?

16

Re: AHK: Ввод греческих букв

Вроде как решил проблему, с горем пополам, добавив задержки 100 мс и ограничив автоповтор. Видимо, у программы буфер был "тяжёлый".
Теперь файлы форматированных символов складываются в папку \res\symbols, а в листе настроек надо вписывать строчки, вроде:

+vk58::    Var2paste("phi2")        ;Ч    Фи(вар.2)
+vk49::    Var2paste("diametr")        ;Ш    Значок диаметра