Нужна помощь в написании скрипта? Close

Вы можете задать любой вопрос по программе Autohotkey в нашей группе Вконтакте. Если решение требует более высокой квалификации- можно обратиться непосредственно ко мне.

ВконтактеГруппа Вконтакте Электронная почтаЭлектронная почта Личная страницаСимаков Яков ВК
home icon Все разделы
comunity icon Нужна помощь?

Строки автозамены -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, Currentd class="ntd"ateTime,, M/d/yyyy h:mm tt SetKeyDelay 0 ;Данная команда задает более быструю эмуляцию нажатий клавиш, чем определено по умолчанию. Send %Currentd class="ntd"ateTime% return

Хотя примеры, приведенные выше, не являются простой автозаменой, печатаемые вами аббревиатуры стираются по умолчанию. Это делается путем забоя (как если бы вы нажимали клавишу backspace), который можно запретить с помощью опции b0 (см. ниже).

Конечные символы

По умолчанию для того, чтобы запустить строку автозамены, необходимо после аббревиатуры напечатать конечный символ. Этого можно избежать при помощи опции "звездочка".

Первоначально, к конечным символам относятся следующие символы: -()[]{}':;"/\,.?!`n `t (обратите внимание, что `n обозначает перевод строки (Enter), `t - табуляцию (Tab), а между символами `n и `t просто пробел). Этот набор символов можно изменить, отредактировав следующий пример, в котором задаются новые конечные символы для всех строк автозамены, а не только для тех, которые находятся непосредственно под этим примером:

#Hotstring EndChars -()[]{}:;'"/\,.?!`n `t

Опции

Поведение строк автозамены по умолчанию можно изменить двумя способами:

  1. С помощью директивы #Hotstring, которая воздействует на все строки автозамены, находящиеся непосредственно под данным пунктом в скрипте. Например:
    #Hotstring c r ; Чувствительно к регистру и посылает заготовку замены в "сыром" виде.
  2. Поместив одну или несколько приведенных далее опций в строку автозамены между первой парой двоеточий. Например:
    :c*:j@::john@somedomain.com ; Чувствительно к регистру, конечный символ не требуется.

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

Длинные замены

В версиях 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.

Любой скрипт, содержащий строки автозамены, автоматически использует обработчик клавиатурных прерываний.

Строки автозамены ведут себя так же, как и горячие клавиши, в следующих случаях:

Вспомогательный скрипт для написания строк автозамены

Приведенный ниже скрипт был предложен Андреасом Баруттой (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