Все разделы
Нужна помощь?
Строки автозамены -Autohotkey
Хотя строки автозамены используются главным образом для развертывания аббревиатур при печати (простая автозамена),
они также могут запускать любые действия, прописанные в сценарии. В этом отношении они похожи на горячие клавиши,
отличаясь от последних только тем, что состоят из большего количества символов (т.е. являются строками).
Для того, чтобы задать строку автозамены, поместите запускающую аббревиатуру между двух двойных двоеточий, как
показано в примере:
::btw::by the way
Теперь каждый раз, когда вы будете печатать аббревиатуру "btw", она будет автоматически заменяться на выражение
"by the way". Однако, при печати аббревиатура должна заканчиваться конечным символом - пробелом, точкой или
переводом строки (можно избежать необходимости печатать конечные символы при помощи опции "звездочка", что описано
ниже).
Приведенный пример с "by the way" является простой автозаменой, так как напечатанный текст автоматически стирается
и заменяется словосочетанием, заданным после второй пары двоеточий. Кроме того, строку автозамены можно заставить
выполнять любые необходимые действия, как показано в следующих примерах. Обратите внимание на то, что команды должны
помещаться ниже строки автозамены:
::btw::
MsgBox Вы напечатали "btw".
return
:*:]d:: ;Данная строка автозамены заменяет символы "]d" на текущую дату и время.
;На печати дата и время будут выглядеть следующим образом: 9/1/2005 3:53 PM
FormatTime, CurrentdateTime,, M/d/yyyy h:mm tt
SetKeyDelay 0 ;Данная команда задает более быструю эмуляцию нажатий клавиш, чем определено по умолчанию.
Send %CurrentdateTime%
return
Хотя примеры, приведенные выше, не являются простой автозаменой, печатаемые вами аббревиатуры стираются по
умолчанию. Это делается путем забоя (как если бы вы нажимали клавишу backspace), который можно запретить с помощью
опции b0 (см. ниже).
Конечные символы
По умолчанию для того, чтобы запустить строку автозамены, необходимо после аббревиатуры напечатать конечный символ.
Этого можно избежать при помощи опции "звездочка".
Первоначально, к конечным символам относятся следующие символы: -()[]{}':;"/\,.?!`n `t (обратите внимание,
что `n обозначает перевод строки (Enter), `t - табуляцию (Tab), а между символами `n и `t просто пробел). Этот набор
символов можно изменить, отредактировав следующий пример, в котором задаются новые конечные символы для всех строк
автозамены, а не только для тех, которые находятся непосредственно под этим примером:
#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t
Опции
Поведение строк автозамены по умолчанию можно изменить двумя способами:
- С помощью директивы #Hotstring, которая воздействует на все строки автозамены, находящиеся непосредственно под
данным пунктом в скрипте. Например:
#Hotstring c r ; Чувствительно к регистру и посылает заготовку замены в "сыром" виде.
- Поместив одну или несколько приведенных далее опций в строку автозамены между первой парой двоеточий. Например:
:c*:j@::john@somedomain.com ; Чувствительно к регистру, конечный символ не требуется.
Примечание: задавая несколько символов из списка, приведенного ниже, можно по желанию поставить между ними пробелы.
- * (звездочка): для того, чтобы запустить строку автозамены, конечный символ (пробел, точка или перевод строки) не
требуется. Чтобы выключить эту опцию, используйте символы *0. В следующем примере замена происходит в момент
печатания символа @.
:*:js@::jsmith@somedomain.com
- ? (знак вопроса): строка автозамены запустится, даже если находится внутри другого слова, то есть, если символ,
напечатанный непосредственно перед строкой, является буквой или цифрой. Например, если мы имеем такую строку
автозамены:
:?:al::airline
то напечатав слово "practical", мы получим "practicairline". Чтобы выключить эту опцию, используйте символы ?0.
- B0 (за буквой B идет цифра 0): стирание (автоматический забой) напечатанной вами аббревиатуры не производится.
Чтобы снова включить ранее выключенный забой, используйте просто символ B (без цифры 0).
- C: чувствительность к регистру. Регистр аббревиатуры должен точно совпадать с регистром, определенном в скрипте.
Чтобы отключить опцию чувствительности к регистру, используйте символы C0. Примечание: если вам необходимо задать
две строки автозамены, отличающиеся только регистром, используйте дополнительные пробелы между первой парой
двоеточий. Они помогут вам провести различие между ними. Это необходимо, так как метки, каковыми являются строки
автозамены, должны быть уникальны. В следующем примере первую строку автозамены отличает от второй дополнительный
пробел между первой парой двоеточий:
:c :ceo::chief executive officer
:c:CEO::Chief Executive Officer
- C1: не подчиняется регистру, используемому при наборе текста. Используйте эту опцию для того, чтобы простая
автозамена не зависела от регистра, а также, чтобы она не подчинялась регистру символов, которые вы фактически
печатаете. Чтобы строки автозамены снова подчинялись регистру, используйте символы C0. Подчиняющиеся регистру строки
автозамены заменят аббревиатуру, напечатанную заглавными буквами, на текст, также напечатанный заглавными буквами.
Если только первая буква аббревиатуры будет заглавной, соответственно только первая буква в тексте замены будет
заглавной (если это буква). В каком регистре бы вы не печатали, текст замены будет напечатан точно так, как это
определено.
- Kn: задержка нажатия клавиши. Обычно в строках автозамены, использующих авто-забой или автозамену, между
нажатиями клавиш задается задержка продолжительностью 0. Ноль рекомендуется для большинства задач, так как эта
задержка невелика и хорошо взаимодействует с другими процессами (это соответствует поведению команды
Sleep 0). Если необходима другая задержка, задайте переменной n другое значение. Минус единица (-1) означает
отсутствие какой бы то ни было задержки, что ускоряет автозамену, если ваш центральный процессор сильно загружен.
- O: опускает конечный символ в строках простой автозамены после того, как замена уже произведена. Такое действие
полезно, если вы хотите, чтобы строка автозамены все еще требовала конечный символ, но вам не нужно, чтобы этот
конечный символ выводился на экран. Например, если у вас есть такая строка автозамены:
:o:ar::aristocrat
и вы печатаете "ar", а затем пробел, то на экран выводится слово "aristocrat" без пробела, что позволяет вам потом
поставить это слово во множественное число или притяжательный падеж, не прибегая к клавише Backspace. Чтобы
выключить эту опцию, используйте символы O0 (буква О + цифра 0).
- Pn: степень приоритета строки автозамены (например, P1). Данная опция не действует для простой автозамены.
- R: "сырой" режим. Посылает текстовую заготовку замены точно в таком же виде, как она печатается, а не переводя
{Enter} в нажатие клавиши ENTER, ^c в Control-C и т.д. Данная опция осуществляется автоматически для строк
автозамены с "секцией продолжения" (несколько строк, ограниченных сверху и снизу парой круглых скобок). Чтобы
выключить эту опцию, используйте символы R0.
- Z [для версии 1.0.30+]: возвращает устройство распознавания строки автозамены в исходное положение после
каждого запуска этой строки. Другими словами, скрипт будет ждать появления новой строки автозамены, не принимая
во внимание ничего из того, что вы печатали ранее. Это действие может предотвратить нежелательный запуск строк
автозамены. Например, если в примере, приведенном ниже, мы напечатаем 111, то строка автозамены, будет запущена
дважды, поскольку в ней отсутствует опция Z.
:b0*?:11::
Send xx
return
Однако, если добавить букву Z перед b0, то для того, чтобы строка автозамены сработала два раза, вам необходимо
будет напечатать уже 1111. Чтобы выключить эту опцию, используйте символы Z0.
Длинные замены
В версиях AutoHotkey, начиная с 1.0.32, использование "секции продолжения" (несколько строк, ограниченных сверху
и снизу парой круглых скобок) поможет сделать строки автозамены, производящие замену больших кусков текста, более
удобными для чтения и эксплуатации. Например:
::text1::
(
Любой текст, находящийся между верхней и нижней скобками трактуется буквально, включая запятые и знаки процента.
По умолчанию, также сохраняется перевод строки (Enter) между предыдущей и данной строкой.
Также по умолчанию в этой строке сохраняется отступ слева (tab).
См. раздел о "секциях продолжения" (continuation section), чтобы узнать, как изменить это поведение по умолчанию.
)
Наличие "секции продолжения" также является причиной того, что строки автозамены по умолчанию устанавливаются на
"сырой" режим. Единственный способ устранить это поведение по умолчанию - это задать значение r0 в опциях каждой
строки автозамены, у которой есть "секция продолжения".
Примечания
Ссылки на переменные, такие, как %MyVar%, в настоящее время не поддерживаются внутри текста замены. Чтобы обойти это
препятствие, не делайте подобные строки простой автозаменой. Вместо этого используйте команду Send, которую
поместите под аббревиатурой. Следующая строка должна содержать только слово Return. Если перед строкой с командой
Send задать строку с командой SetKeyDelay 0, эмуляция нажатий клавиш будет происходить быстрее.
Встроенная переменная A_EndChar содержит конечный символ, напечатанный вами для того, чтобы запустить самую
последнюю строку автозамены. Если конечный символ не требуется (при наличии опции *), его место остается пустым.
Эта переменная полезна при написании строк автозамены, в которых используется команда Send или чье поведение должно
различаться в зависимости от заданного вами конечного символа. Чтобы послать сам конечный символ, используйте
команду "SendRaw %A_EndChar%" (использование команды SendRaw обусловлено тем, что в результате обычной команды
Send такие символы, как !{} не будут посланы правильно).
Хотя запятые, знаки процента и одинарные двоеточия, содержащиеся в определениях строк автозамены, не должны
экранироваться, этого требуют акценты и те точки с запятой, с левой стороны от которых находится пробел или
табуляция. Чтобы просмотреть полный список таких символов, см. раздел об escape-последовательностях (escape
sequences).
Хотя синтаксис команды Send поддерживается в тексте автозамены (при условии, что не используется опция R), сами
аббревиатуры строки автозамены его не используют. Вместо этого, задайте `n для клавиши ENTER и `t (или буквально
tab) для TAB (чтобы просмотреть полный список символов, см. раздел об escape-последовательностях (escape sequences).
Например, строка автозамены :*:ab`t:: будет запущена, когда вы напечатаете "ab", а затем символ табуляции.
В определениях строк автозамены пробелы и табуляции трактуются буквально. Например, результат исполнения скриптов,
приведенных ниже, будет разный:
::btw::by the way
::btw:: by the way
Каждая аббревиатура в строке автозамены должна содержать не более 30 символов. Программа предупредит вас, если вы
превысили это количество. С другой стороны, длина текста замены ограничена только максимальной длиной строки,
предусмотренной в AutoHotkey и составляющей 16 383 символа. Это ограничение можно обойти, если в теле строки
автозамены использовать команду Send %MyVariable%.
Порядок, в котором задаются строки автозамены, определяет их старшинство относительно друг друга. Другими словами,
если напечатанное вами совпадет с условиями, заданными в нескольких строках автозамены, будет запущена только первая
строка.
В целях обнаружения строк автозамены, учитывается любой сделанный вами забой (клавишей backspace). Однако, при
использовании клавиш со стрелками, клавиш PageUp, PageDown, Home и End для навигации в пределах редактора, процесс
распознавания строк автозамены не производится (сбрасывается), т.е. начинается ожидание новой строки автозамены.
Строку автозамены можно напечатать, даже если активное окно игнорирует нажатия клавиш. Другими словами, строка
автозамены запустится, даже в том случае, если запускающая аббревиатура визуально не видна. Кроме того, клавиша
backspace отменит самое последнее нажатие клавиши, хотя вы не увидите результат.
Можно перейти к метке строки автозамены, используя команды Gosub и Goto. Для этого первая пара двоеточий (включая
символы опций) ставится перед именем метки. Например: Gosub ::xyz. Однако, переход к строке автозамены, состоящей
из одной строки, просто выполнит команду return.
Хотя за строками автозамены не осуществляется контроль, и невидимая команда Input их не запустит, на это способны
визуальные команды Input.
Нажатия клавиш, имитируемые скриптом AutoHotkey, не могут запустить строки автозамены, что помогает избежать
зацикливания, когда строки автозамены запускают сами себя снова и снова.
В некоторых случаях большая гибкость команды Input по сравнению со строками автозамены позволяет достичь
определенных целей. Например, она позволяет сделать невидимыми нажатия клавиш в активном окне (таком, как в играх).
Она также поддерживает несимвольные конечные клавиши, такие, как Escape.
Любой скрипт, содержащий строки автозамены, автоматически использует обработчик клавиатурных прерываний.
Строки автозамены ведут себя так же, как и горячие клавиши, в следующих случаях:
- На них действует команда Suspend.
- Они подчиняются командам #MaxThreads и #MaxThreadsPerHotkey (но не #MaxThreadsBuffer).
- Скрипты, содержащие строки автозамены, не завершают свою работу автоматически.
- Строки автозамены при запуске создают новый поток (это не относится к простой автозамене). Кроме того, они
будут обновлять встроенные переменные, доступные в горячих клавишах, такие, как A_ThisHotkey.
Вспомогательный скрипт для написания строк автозамены
Приведенный ниже скрипт был предложен Андреасом Баруттой (Andreas Borutta) и может быть полезен, если вы часто
используете строки автозамены. Нажатием комбинации клавиш Win+H (или другой горячей клавиши по вашему выбору)
выделенный текст можно превратить в строку автозамены. Например, если в вашем редакторе выделена строка "by the
way", то нажатие Win+H подскажет вам аббревиатуру (напр. btw) и затем добавит в скрипт новую строку автозамены,
после чего перезагрузит скрипт для того, чтобы активировать строку автозамены.
#h:: ; горячая клавиша Win+H
; Получаем текущий выделенный текст. Вместо "ControlGet Selected" используется
; буфер обмена, так как он есть в большинстве редакторов
; (т.е. текстовых процессоров). Сохраняем текущее содержимое буфера обмена,
; чтобы восстановить его позднее. Хотя обрабатывается только простой текст,
; это все же лучше, чем ничего:
AutoTrim Off ; Сохраняет любой межстрочный интервал и пробел в конце текстовой строки в буфере обмена.
ClipboardOld = %ClipboardAll%
Clipboard = ; Чтобы обнаружение заработало, нужно начать с пустого значения.
Send ^c
ClipWait 1
if ErrorLevel ; Время ожидания ClipWait вышло.
return
; Заменяем CRLF и/или LF на `n, чтобы использовать в строке автозамены опцию "send-raw" (R):
; Тоже самое делаем с любыми другими символами, иначе
; могут возникнуть проблемы в "сыром" режиме:
; Делаем эту замену вначале, чтобы избежать помех со стороны тех, которые идут далее.
StringReplace, Hotstring, Clipboard, ``, ````, All
StringReplace, Hotstring, Hotstring, `r`n, ``r, All ; В MS Word...`r работает лучше, чем `n.
StringReplace, Hotstring, Hotstring, `n, ``r, All
StringReplace, Hotstring, Hotstring, %A_Tab%, ``t, All
StringReplace, Hotstring, Hotstring, `;, ```;, All
Clipboard = %ClipboardOld% ; Восстанавливаем предыдущее содержимое буфера обмена.
; Каретка поля ввода (InputBox) устанавливается в более удобную позицию:
SetTimer, MoveCaret, 10
; Показываем поле ввода (InputBox), обеспечивая строку автозамены по умолчанию:
Text1 := "Напечатайте вашу аббревиатуру в указанном месте. "
Text2 := "При желании вы можете отредактировать текст замены."
Text3 := "`nПример:`n:R:btw`::by the way"
InputBox, Hotstring, Новая автозамена, %Text1%%Text2%%Text3%,,,,,,,, :R:`::%Hotstring%
if ErrorLevel <> 0 ; Пользователь нажал Cancel.
return
IfInString, Hotstring, :R`:::
{
MsgBox Вы не напечатали аббревиатуру. Строка автозамены не добавлена.
return
}
; Иначе, добавляем строку автозамены и перезагружаем скрипт.
; Помещаем `n в начало, в случае, если в конце файла нет пустой строки.
FileAppend, `n%Hotstring%, %A_ScriptFullPath%
Reload
; В случае успешного завершения перезагрузка закроет этот экземпляр скрипта в режиме ожидания,
; поэтому строка ниже никогда не будет исполнена.
Sleep 200
Text1 := "Только что добавленная строка неверно отформатирована. "
Text2 := "Открыть файл для форматирования? "
Text3 := "Обратите внимание, что неисправные строки автозамены находятся внизу скрипта."
MsgBox, 4,, %Text1%%Text2%%Text3%
IfMsgBox, Yes, Edit
return
MoveCaret:
IfWinNotActive, Новая автозамена
return
; Иначе, передвигаем курсор в поле ввода туда, где пользователь напечатает аббревиатуру.
Send {Home}{Right 3}
SetTimer, MoveCaret, Off
return
Автор перевода: Gourmet
Настоящее имя переводчика: Валентина Гаврикова
Под редакцией ahk-wiki.ru от 21.08.19