AutoHotkey

AutoHotkey

Эрик Котато

Слышали ли вы про AutoHotkey?

Это такой небольшой скриптовой язык под Windows для создания собственных "горячих клавиш". В его API также есть много интересных функций для работы с системой, и даже можно создавать небольшие диалоговые окна.

В этой статье я не буду углубляться в сам API, а расскажу о базовых возможностях. Для многих задач хватит, в принципе, и их.

О каких возможностях пойдёт речь:

  1. Горячие клавиши.
    Собственно, то, для чего скрипт и предназначен в основном. Запуск программ и быстрая подстановка шаблонов.
  2. Краткие строки и автозамена.
    Иногда проще подставлять шаблоны не нажатием сочетания клавиш, а при вводе определённой фразы-триггера.
  3. Переназначение клавиш.
    Если возникает ситуация, когда какая-то клавиша не работает или неудобна, то её можно переназначить.
  4. Ограничение по приложению.
    Чаще всего нам не нужно, чтобы всё это срабатывало во всех приложениях.

Для начала, что нам потребуется:

  • Сам AutoHotkey.
    Можете скачать Installer (обычный установщик), можете качать .zip (портативная версия). На момент написания статьи актуальная версия 1.1.29.00 от 25.05.2018.
  • Любой текстовый редактор.
    Берите свой любимый Notepad++ или Sublime Text, ну или можете обычным блокнотом пользоваться, но первых двух есть подсветка синтаксиса, хоть и не в стандартном пакете. Плюс, в стандартном блокноте может возникнуть проблема с кодировкой.
    Подсветка для Notepad++: https://autohotkey.com/boards/viewtopic.php?f=7&t=50
    Подсветка для Sublime Text: https://github.com/ahkscript/SublimeAutoHotkey

Скрипты сохраняются в формате .ahk. Если вы использовали обычный установщик, то вы можете запустить скрипт двойным кликом. Если нет, открывайте его через AutoHotkey.exe.

К слову: если вы открывали саму папку, вы наверняка видели, что там несколько исполняемых файлов: AutoHotkey.exe, AutoHotkeyA32.exe, AutoHotkeyU32.exe, AutoHotkeyU64.exe. Первый файл автоматически выбирает необходимую версию, все остальные – сами версии (ANSI 32 бит, Unicode 32 бит, Unicode 64 бит). Вам совершенно необязательно запускать скрипт под конкретной версией, так как AutoHotkey.exe сделает это за вас без всяких трудностей.
Ещё одна поправка: если вы хотите использовать UTF-8 в скрипте, то сохраняйте в кодировке UTF-8 с BOM (Byte Order Marker), в ином случае AutoHotkey не сможет корректно определить кодировку.

Горячие клавиши

Собственно, для чего они?

Иногда требуется запустить что-то быстро. К примеру, в Linux есть сочетание клавиш Ctrl+Alt+T, которое запускает терминал. На AHK скрипт, который делает подобное, выглядел бы так:

^!t::
run cmd
return

Или так:

^!t::run cmd
К слову: команды в документации написаны с большой буквы (Run, Send и т.д.), но на деле регистр значения не имеет.

Если мы пишем команду в несколько строк, то return в конце обязателен, если в одну, то нет.

Мы также можем отключить какую-либо клавишу. К примеру, на некоторых клавиатурах если клавиша спящего режима, и не всем она нужна. Её можно отключить следующим образом (работает не на всех клавиатурах):

*sleep::return
Звёздочка в начале означает, что действие будет выполнено, даже если будет нажата дополнительно любая клавиша-модификатор (Ctrl, Alt и т.д.), что позволяет блокировать клавишу во всех случаях.

Ещё один пример. Предположим, есть у нас какая-то подпись, которую мы часто подставляем в сообщение. Быстрым способом сделать это с помощью клавиши, предположим, Ctrl+Shift+Y, будет это:

^+y::send RadRussianRus{enter}@rad_space

Обратите внимание на {enter}. Таким образом мы можем обозначать нажатия клавиш в тексте, в том числе и специальных.

Специальные символы в сочетаниях клавиш:

  • # – клавиша Win (Пуск)
  • ! – клавиша Alt
  • + – клавиша Shift
  • ^ – клавиша Ctrl
  • * – любая другая клавиша
  • ~ – не блокировать стандартное действие сочетания клавиш
  • $ – используется, если в команде Send есть то же сочетание, что и в горячей клавише, для избежания зацикливания
  • < – использовать только левую клавишу-модификатор в сочетании, пишется перед клавишей: <+ – левый Shift, <! – левый Alt и т.д.
  • > – использовать только правую клавишу-модификатор в сочетании, пишется перед клавишей: >+ – правый Shift, >! – правый Alt и т.д.

Специальные клавиши:

  • CapsLock
  • Space
  • Tab
  • Enter (также Return)
  • Escape (также Esc)
  • Backspace (также BS)

Полный список клавиш есть в официальной документации.

Краткие строки и автозамена

В предыдущем примере я показывал, как отправлять текст с помощью сочетания клавиш. Но что, если мы хотим использовать для этого не сочетание клавиш, а ключевое слово? Получится что-то такое:

::rad::RadRussianRus{enter}@rad_space

В данном примере слово "rad" заменится на моё сообщение, только если после него будет следовать символ конца слова (от Enter, Space и др.). Если мне нужно, чтобы оно всегда заменялось, не дожидаясь символа конца слова, то после первого двоеточия нужно поставить символ * (звёздочка):

:*:rad::RadRussianRus{enter}@rad_space

Но имейте в виду, что в таком случае автозамены не произойдёт, если "rad" является частью слова, например, "grad". Чтобы настроить замену даже в таких случаях, используйте символ ? (вопросительный знак):

:?:rad::RadRussianRus{enter}@rad_space

Есть ещё одна интересная опция. По умолчанию оригинальная фраза удаляется и остаётся только заменённая. Но опция B0 (не буква "O", а цифра "0") позволяет это перезаписать. Это можно использовать, к примеру, для автоматического добавления закрывающих тэгов:

:*b0:<b>::</b>{left 4}

Обратите внимание на {left 4}, который означает, что клавиша "стрелка влево" будет нажата 4 раза, чтобы курсор был между тегами.

Как вы заметили, опции можно комбинировать. А также их регистр тоже не имеет значения.

Другие опции:

  • C – учитывать регистр. По умолчанию этого не делается, поэтому "rad" и "RAD" одинаково будут восприниматься. Эта опция делает так, что будет работать только указанный вариант.
  • C1 – не преобразовывать регистр. По умолчанию, если вы ввели краткую фразу в верхнем регистре, то и итоговая фраза будет тоже в верхнем регистре. Эта опция не преобразовывает регистр итоговой фразы.
  • O (буква) – не вводить сам завершающий символ. Таким образом вы можете дополнить слово нужным окончанием сразу после замены при необходимости.
  • X – выполнить команду вместо замены.

Последний трюк с краткими строками – многострочный текст. Разумеется, можно подставлять {enter} для переноса строки, но это не всегда хорошо выглядит в тексте. Поэтому можно прибегнуть к такому трюку:

::описание::
(
Весь текст между первой и последней скобкой будет подставлен как есть.
  Переносы строк, отступы и табуляции сохраняются.
Пустые строки тоже.

По умолчанию в многострочном тексте специальные символы обозначения клавиш, например, {enter}, не заменяются. В том числе не заменяются символы скобок, процентов и т.д. Это можно отключить с помощью опции r0 (цифра 0).
)

Переназначение клавиш

Ещё одна полезная вещь – это переназначение клавиш. Это может очень помочь в случах, когда какая-то из клавиш не работает или же неудобна.

Мне недавно требовалось переназначить клавишу с Space на Z. В скрипте это выглядит очень просто:

z::space

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

Предположим, вы захотели поменять Z на S. В таком случае стоит учесть, что следующие три строки не равнозначны:

z::s
Z::s
z::S

Каковы же отличия между этими тремя строками?

  1. Z в любом регистре будет активировать S в соответствующем регистре.
    Строчная z – строчная s, заглавная Z – заглавная S.
  2. Z в верхнем регистре заменяется на S в соответствующем регистре (т.е. верхнем).
    Строчная z при этом выдаёт строчную z.
  3. Z в любом регистре будет активировать S в верхнем регистре.

Итак, почему же здесь это работает? Даю подсказку: Z можно также записать, как +z. Да, всё правильно: тут можно писать не одну клавишу, а сочетание клавиш.

То есть, вы вполне можете сделать что-то такое:

rctrl::^!delete

Ограничение по приложению

Ну и разумеется, чаще всего мы не хотим, чтобы автозамены происходили везде. Поэтому, чтобы ограничить это, используются следующие директивы:

  • #ifwinactive – если указанное окно активно
  • #ifwinnotactive – если указанное окно неактивно
  • #ifwinexist – если окно открыто (на фоне или нет, не имеет значения)
  • #ifwinnotexist – если окно не открыто (на фоне или нет, не имеет значения)

После самой директивы нужно указать заголовок окна. К примеру:

#ifwinactive Блокнот

Чтобы отключить условие, нужно написать эту директиву ещё раз, но без параметров:

#ifwinactive

Правда, искать окно только по заголовку неэффективно. Гораздо эффективнее искать по названию исполняемого файла или их сочетанию с заголовком. Для этого у нас есть специальное значение "ahk_exe". Используется оно следующим образом:

#ifwinactive ahk_exe paint.exe

Или же в сочетании с заголовком окна:

#ifwinactive Paint ahk_exe C:\Windows\system32\paint.exe
К слову: регистр в заголовке окна имеет значение.

Но иногда может возникнуть проблема. В том же Google Chrome и Проводнике заголовок окна скрыт. А понять, по какому исполняемому файлу искать тоже задача не всегда из простых. Как быть?

Есть у AutoHotkey такой скрипт как WindowSpy (WindowSpy.ahk, AU3_Spy.exe и AutoIt3 Window Spy – это одно и то же). Расположен он в папке с самим AutoHotkey, а также в меню Пуск на него есть ярлык.

Что он делает? Получает информацию об активном окне, и, где поддерживается, о его элементах управления.

Пример на окне Проводника.

В самом верхнем поле отображаются сверху вниз: заголовок окна, класс окон (тоже можно использовать, но он больше эффективен для нативных приложений), исполняемый файл. Также есть другая дополнительная информация, такая как координаты, текущий элемент управления, цвет и т.д. Вы также можете нажать Win+A, чтобы приостановить обновление данных в окне.

Заключение

Конечно же, здесь расписаны далеко не все возможности AutoHotkey. Но в этой статье я намеренно не углублялся в API, а расписывал базовые возможности приложения. Саму документацию с примерами и более подробным описанием вы можете найти на официальном сайте, хоть она и на английском. Но, возможно, кому-то хватит и этой статьи.

Report Page