Создать тему  Создать ответ 
AutoHotkey
17-10-2012, 23:46    
Сообщение: #1
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

AutoHotkey
1. Что такое AutoHotkey

AutoHotkey (сокращённо AHK) — это удобный инструмент для всяческой автоматизации работы с Windows. Оправдывая своё название, он даёт возможность с лёгкостью создавать горячие клавиши и строки автозамены (более общо, горячие строки*), но это лишь малая часть его возможных приложений. Отметим некоторые особенности:

- автозамена, горячие клавиши и горячие строки: возможность задания опций, привязка к определённым окнам и т. д.;

- AHK — язык программирования, и при желании пользователь может использовать переменные, условия и циклы, создавать функции и пр.;

- удобное взаимодействие с Windows: запуск программ, открытие файлов и страниц в интернете, управление окнами (активировать, закрыть и пр.);

- глубокое взаимодействие с Windows: возможность использования стандартных функций WinAPI, messages;

- возможность создания графических пользовательских интерфейсов (то бишь окошек);

- возможность компиляции скрипта в файл .exe, который можно использовать на компьютере, где нет AHK;

- великолепная справка, написанная хорошим английским языком.

Надо отметить, что AHK создавался в расчёте на обычных пользователей Windows, а не на программистов. Даже если пользоваться только автозаменами, приправленными идеями из туториала для начинающих
http://l.autohotkey.net/docs/Tutorial.htm
уже можно сделать работу с компьютером более удобной.

* Горячая строка (hot string) — это последовательность символов, ввод которой приводит к некоторому действию компьютера. Если это действие состоит в том, чтобы стереть введённое и написать что-то другое, получается автозамена. Таким образом, автозамена — частный случай горячей строки.
Найти все сообщения
Цитировать это сообщение
17-10-2012, 23:47    
Сообщение: #2
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: AutoHotkey
2. С чем это едят

Мы будем рассматривать версию AutoHotkey_L, потому что она хорошо поддерживает юникод и имеет некоторые другие полезные свойства. Качаем, устанавливаем. На семёрке может наблюдаться следующий глюк: если установить в Program Files, может требовать подтверждения при запуске каждого скрипта (так называемое UAC). В таком случае можно установить, например, в свою пользовательскую директорию.

Это мы установили программу, которая заставляет наши скрипты работать. Пользователь же создаёт скрипты — текстовые документы с расширением .ahk (для AutoHotkey_L обязательна кодировка UTF-8). Скрипт можно запустить двойным щелчком в проводнике. Как правило, скрипт имеет иконку в зоне уведомлений. Щёлкнув на неё правой кнопкой, получаем контекстное меню, с помощью которого можно, например, выключить скрипт (Exit) или приостановить действие горячих клавиш (Suspend Hotkeys).

Для создания скриптов удобно использовать специальный редактор SciTE4AutoHotkey
http://www.autohotkey.net/~fincs/SciTE4A...key_3/web/
Найти все сообщения
Цитировать это сообщение
17-10-2012, 23:48    
Сообщение: #3
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: AutoHotkey
3.1. Раскладка для древнеанглийского

Удобным инструментом для этого является автозамена.

Предположим, мы хотим сделать «раскладку» для древнеанглийского языка. Нам нужно уметь вводить следующие буквы:
Āā Ēē Īī Ōō Ūū Ȳȳ Ææ Ǣǣ Þþ Ðð Ȝȝ Ǫǫ
Нужно придумать дизайн для нашей раскладки. Зададимся следующими целями:
- по возможности не трогать основные значения клавиш;
- делать удобно для слепого набора (то есть минимизировать число дополнительных нажатий и не использовать альты).

Мы будем реализовывать «постмодификацию»: например, нажатие некоторой клавиши после «a» должно давать «ā». Взглянув на клавиатуру, мы выбираем в качестве такого модификатора «/»: нажимать его легко, а в тексте используется редко. Получается такая схема:
a/ → ā
e/ → ē
i/ → ī
o/ → ō
u/ → ū
y/ → ȳ
t/ → þ
d/ → ð
g/ → ȝ
и аналогично для заглавных. Буквы æ, ǣ и ǫ оставим на потом.

Реализуем эти автозамены в скрипте. В SciTE создадим файл englisc.ahk и напишем следующую строку:

Код:
#Hotstring *?C

Эта строка задаёт опции для последующих автозамен. Дело в том, что по смыслу наши автозамены должны срабатывать и в середине слова, не требовали завершающего символа (пробела и т. п.), а также пусть они будут чувствительны к регистру. По умолчанию эти опции отключены (что разумно, но только не для раскладок), и мы их включаем соответственно символами *, ? и C после директивы #Hotstring.

Общий синтаксис автозамен таков:
::<что заменить>::<на что заменить>
Таким образом, мы добавляем в скрипт строки
Код:
::a/::ā
::e/::ē
::i/::ī
::o/::ō
::u/::ū
::y/::ȳ
::t/::þ
::d/::ð
::g/::ȝ
::A/::Ā
::E/::Ē
::I/::Ī
::O/::Ō
::U/::Ū
::Y/::Ȳ
::T/::Þ
::D/::Ð
::G/::Ȝ
Теперь скрипт можно запустить и проверить, что нажатие слэша после гласной или буквы t, d, g соответствующим образом модифицирует её.

Отметим, что строку #Hotstring blah-blah можно было бы и не писать, а указывать опции для каждой конкретной автозамены между первой парой двоеточий по следующему примеру:
Код:
:*?C:a/::ā
Это обошлось вы в несколько лишних нажатий клавиш, но не лишено смысла, так как код получается не зависящий от строчки где-то наверху и, в частности, копипастабельный.

Рассмотрим теперь буквы Ææ. Мы не можем для них использовать автозамены Ae/, AE/, потому что они конфликтовали бы с имеющимися заменами e/, E/. Решим эту проблему самым простым образом: используем новый модификатор и создадим замены
Код:
::a[::æ
::A[::Æ
::a{::ǣ
::A{::Ǣ
Раз уж мы ввели новый модификатор, используем его и для ǫ:
Код:
::o[::ǫ
::O[::Ǫ

В действительности модификатор [ может оказаться неудачным для написания
сообщений на форумах, поскольку ubb-тэги заключаются в квадратные скобки, и
автозамена может сработать в неподходящий момент. Чтобы автозамена не
сработала, достаточно нажать на клавишу со стрелкой. Если же мы решим, что всё
равно неудобно, никто не мешает заменить скобку на другой удобный символ.
(Даже на символ табуляции, который в AHK записывается как «`t». Этот символ
производится клавишей Tab.)

Раскладка уже готова к использованию, но мы добавим ещё один штрих. Включать-выключать её можно с помощью контекстного меню, а можно и сделать горячую клавишу. Например, понравилась нам клавиша F11. Напишем следущее:

Код:
F11::Suspend
+F11::ExitApp

Это значит, что по нажатию F11 автозамены и горячие клавиши будут блокироваться, а по нажатию Shift + F11 скрипт будет завершать работу. Плюс перед F11 символизирует, что клавиша нажимается с шифтом*.

Нюанс состоит в том, что клавиша F11 не блокирует саму себя. Благодаря этой хитрости создателей AHK мы можем снова включить заблокированный скрипт, нажав F11.

Таким образом, наш скрипт имеет вид
Код:
F11::Suspend
+F11::ExitApp

#Hotstring *?C

::a/::ā
::e/::ē
::i/::ī
::o/::ō
::u/::ū
::y/::ȳ
::t/::þ
::d/::ð
::g/::ȝ
::A/::Ā
::E/::Ē
::I/::Ī
::O/::Ō
::U/::Ū
::Y/::Ȳ
::T/::Þ
::D/::Ð
::G/::Ȝ
::a[::æ
::A[::Æ
::a{::ǣ
::A{::Ǣ
::o[::ǫ
::O[::Ǫ
Как видите, его создание занимает от силы минут пять—десять, и при этом имеем стопроцентную настраиваимость.

* Аналогично, для нажатого Ctrl используется ^, для Alt — !, для Alt+Shift — !+ и т. д.
Найти все сообщения
Цитировать это сообщение
17-10-2012, 23:50    
Сообщение: #4
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: AutoHotkey
3.2 Скрипт с двумя раскладками

Предположим, мы захотели набирать тексты не только на древнеанглийском, но и на древнеисландском языке. В разных изданиях используется довольно много символов для записи древнеисландского и древнескандинавского языков, но мы решим удовольствоваться следующим джентльменским набором дополнительных букв:
Áá Éé Íí Óó Úú Ýý Øø Ǫǫ Ææ Œœ Þþ Ðð
Бросается в глаза основное отличие от древнеанглийского: в древнеисландском долгота обычно обозначается не макроном, а акутом. Поэтому использовать одну и ту же раскладку для обоих языков сразу неудобно, ведь в древнеанглийской раскладке удобный нам модификатор уже занят макроном. Следовательно, мы создадим новую раскладку.

Мы столкнулись с общим принципом дизайна раскладок. Что постоянно встречается в одном языке, может редко использоватся в другом. При этом на клавиатуре ужасающе мало клавиш, которые можно было бы задействовать в своих корыстных целях. Отсюда вывод: большая-пребольшая, «универсальная» раскладка не может угодить всем. В действительности универсальная раскладка хороша, пожалуй, только для ввода «в лабораторных масштабах». Для индивидуальных языков лучше использовать индивидуальные раскладки.

При этом облюбованный нами слэш мы рассматриваем не как синоним макрона, а как модификатор, который изменяет введённую букву нужным образом. Например, в древнеанглийском контексте поставит макрон, а в древнеисландском — акут.

Имея солидный опыт в создании AHK-раскладок, моментально пишем следующий скрипт:
Код:
#Hotstring *?C

::a/::á
::e/::é
::i/::í
::o/::ó
::u/::ú
::y/::ý
::t/::þ
::d/::ð
::A/::Á
::E/::É
::I/::Í
::O/::Ó
::U/::Ú
::Y/::Ý
::T/::Þ
::D/::Ð
::a[::æ
::A[::Æ
::e[::œ
::E[::Œ
::o[::ǫ
::O[::Ǫ
Однако для разнообразия мы теперь сделаем следующее. Мы создадим один скрипт, объединяющий обе раскладки и позволяющий включать нужную. Например, интерфейс будет таков: Alt+1 включает древнеанглийский, Alt+2 включает древнеисландский (естественно, выключая древнеанглийский), Alt+9 выключает обе раскладки, а Alt+0 выходит из скрипта. Для этого мы впервые используем элементы программирования. Не будем гнаться за элегантностью программистского решения, а поступим очень просто: введём переменную lang, которая будет обозначать текущий язык, и поставим автозамены в зависимость от значения этой переменной.

Чтобы завести в AHK переменную, никаких особенных действий не надо: достаточно присвоить ей значение. Мы хотим, чтобы при запуске скрипта переменной lang присваивалась строка "None", символизирующая, что никакой язык не выбран. (Выбор именно этой строки непринципиален. С таким же успехом можно было бы использовать "Nikakoy", но "None" выглядит солиднее.) Для этого в начале скрипта пишем:
Код:
lang := "None"
return
Слово return служит вот чему. Когда мы запускаем скрипт, AHK начинает выполнять все написанные команды, пока не встретит строчку со словом return. Таким образом, return отделяет инициализацию от всего прочего (горячие клавиши, автозамена и пр.). Наша инициализация состоит только в присваивании переменной lang значения "None" (этим мы и вводим переменную), а больше делать ничего не надо.

Управление, как говорилось, вешаем на горячие клавиши:
Код:
!1::lang := "OE"
!2::lang := "ON"
!9::lang := "None"
!0::ExitApp
Восклицательный знак здесь обозначает Alt.

Теперь осталось только сделать автозамены зависящими от значения lang. Это делается с помощью директивы
Код:
#If <условие>
Все горячие клавиши и горячие строки, расположенные ниже этой строки (и до следующего #If-а), будут активны только если выполнено <условие>. Всякий #If отменяет предыдущий. (Например, если на каком-то шаге мы хотим снять все условия, достаточно написать просто #If).

Окончательно скрипт выглядит так:
Код:
;—————————————————————————-
;
;                 Old English and Old Norse layouts
;
;—————————————————————————-

; Alt + 1: Old English
; Alt + 2: Old Norse
; Alt + 9: None
; Alt + 0: Exit

lang := "None" ; Current layout: "None", "OE", or "ON".
return

; Switching between layouts
!1::lang := "OE"
!2::lang := "ON"
!9::lang := "None"
!0::ExitApp

#Hotstring *?C

; Old English
#If lang = "OE"

::a/::ā
::e/::ē
::i/::ī
::o/::ō
::u/::ū
::y/::ȳ
::t/::þ
::d/::ð
::g/::ȝ
::A/::Ā
::E/::Ē
::I/::Ī
::O/::Ō
::U/::Ū
::Y/::Ȳ
::T/::Þ
::D/::Ð
::G/::Ȝ
::a[::æ
::A[::Æ
::a{::ǣ
::A{::Ǣ
::o[::ǫ
::O[::Ǫ

; Old Norse
#If lang = "ON"

::a/::á
::e/::é
::i/::í
::o/::ó
::u/::ú
::y/::ý
::t/::þ
::d/::ð
::A/::Á
::E/::É
::I/::Í
::O/::Ó
::U/::Ú
::Y/::Ý
::T/::Þ
::D/::Ð
::a[::æ
::A[::Æ
::e[::œ
::E[::Œ
::o[::ǫ
::O[::Ǫ
Обратите внимание на знак комментария: точку с запятой. Комментарием считается всё, начиная с этого символа до конца строки. Не пренебрегайте документацией своих программ и не оставляйте её «на потом»!
Найти все сообщения
Цитировать это сообщение
17-10-2012, 23:52    
Сообщение: #5
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: AutoHotkey
Пока всё! :)
Найти все сообщения
Цитировать это сообщение
17-10-2012, 23:53    
Сообщение: #6
Владимир

Moderator
Сообщений: 3027
Зарегистрирован: 17.06.12

RE: AutoHotkey
Маленькое уточнение. Буква ǫ для ОЕ не нужна. А вот для полной гармонии неплохо бы ввести обозначения для долгих дифтонгов.

śeχereśada ńenza jawna heχewaʔ hańaʧejʰ merʰ tewŋgunaʔ
Найти все сообщения
Цитировать это сообщение
18-10-2012, 00:00    
Сообщение: #7
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: AutoHotkey
Ну, пишут же иногда в mǫn, ǫnd. Хотя, возможно, тогда надо уж и C с точкой и уж не знаю чего ещё… Насчёт большой черты надо порыскать по юникоду, хотя меня гложут смутные сомнения. Может быть, это вопрос вёрстки.
Найти все сообщения
Цитировать это сообщение
18-10-2012, 00:11    
Сообщение: #8
Agrest

井蛙 / жабенєтко в керниці
Сообщений: 1556
Зарегистрирован: 08.08.12

RE: AutoHotkey
(18-10-2012 00:00)Quasus писал(а):  Насчёт большой черты надо порыскать по юникоду, хотя меня гложут смутные сомнения.
В уникоде-то она есть (i͞e, e͞a, e͞o), но шрифтов с её поддержкой мало.

«билингв мусорит в обоих языках — и первом, и втором» © Python
Вебсайт Найти все сообщения
Цитировать это сообщение
18-10-2012, 01:46    
Сообщение: #9
Quasus

Гоф-фурьер
Сообщений: 625
Зарегистрирован: 17.06.12

RE: AutoHotkey
Ну, комбинируемая так комбинируемая, хотя недолюбливаю я её. Древнеанглийскую часть можно сделать так:
Код:
::a/::ā
::e/::ē
::i/::ī
::o/::ō
::u/::ū
::y/::ȳ
::t/::þ
::d/::ð
::g/::ȝ
::A/::Ā
::E/::Ē
::I/::Ī
::O/::Ō
::U/::Ū
::Y/::Ȳ
::T/::Þ
::D/::Ð
::G/::Ȝ
::a[::æ
::A[::Æ
::a{::ǣ
::A{::Ǣ
::o[::ǫ
::O[::Ǫ
::eo]::e̅o̅
::ea]::e̅a̅
::ie]::i̅e̅
Должен сказать, что в Notepad++ и в AkelPad у меня почему-то не комбайнятся.
Найти все сообщения
Цитировать это сообщение
14-12-2017, 21:17    
Сообщение: #10
arseniiv

± ∓
Сообщений: 227
Зарегистрирован: 05.07.12

RE: AutoHotkey
Как заметили, ссылка, упомянутая Квасом, больше не работает. Вот её замена: https://autohotkey.com/docs/Tutorial.htm.

Honor thy error as a hidden intention
Вебсайт Найти все сообщения
Цитировать это сообщение
Создать ответ 


Переход:


Пользователи просматривают эту тему: 1 Гость(ей)