핫스트링
핫스트링 (Hotstrings)
AutoHotkey의 핫스트링(hotstring)을 정의하고, 옵션·종료 문자·자동 교정·문맥에 민감한 핫스트링을 다루는 방법을 설명하는 문서예요.
출처: 문서
본문
목차 (Table of Contents)
- 소개와 간단한 예제 (Introduction and Simple Examples)
- 종료 문자 (Ending Characters)
- 옵션 (Options)
- 긴 대체문 (Long Replacements)
- 문맥에 민감한 핫스트링 (Context-sensitive Hotstrings)
- 자동 교정 (AutoCorrect)
- 주의 사항 (Remarks)
- 이름 있는 함수 핫스트링 (Named Function Hotstrings)
- 핫스트링 헬퍼 (Hotstring Helper)
소개와 간단한 예제 (Introduction and Simple Examples)
핫스트링은 주로 입력하면서 약어를 확장하는 데(자동 대체, auto-replace) 사용되지만, 어떤 스크립트 동작이든 실행하는 데 사용될 수도 있어요. 그 점에서 핫키와 비슷하지만, 보통 한 문자보다 많은 문자(즉 문자열)로 구성된다는 차이가 있어요.
핫스트링을 정의하려면 아래 예시처럼 트리거 약어를 콜론 쌍으로 감싸요:
::btw::by the way
위 예시에서 btw 약어는 입력할 때마다 자동으로 "by the way"로 대체돼요(다만 기본적으로 btw를 입력한 후 Space, ., Enter 같은 종료 문자를 입력해야 해요).
위의 "by the way" 예시는 입력한 텍스트가 자동으로 지워지고 두 번째 콜론 쌍 뒤에 지정된 문자열로 대체되므로 자동 대체 핫스트링으로 알려져 있어요. 반대로, 핫스트링은 다음 예시처럼 어떤 사용자 정의 동작을 수행하도록 정의될 수도 있어요. 문장들은 핫스트링의 함수 본문 안에서 약어 아래에 나타나야 한다는 점을 주목하세요:
::btw::
{
MsgBox 'You typed "btw".'
}
:*:]d:: *; 이 핫스트링은 아래 문장을 통해 "]d"를 현재 날짜와 시간으로 대체함.*
{
Send FormatTime(, "M/d/yyyy h:mm tt") *; 9/1/2005 3:53 PM처럼 보일 것임*
}
위에서 중괄호는 각 핫스트링의 함수 본문을 정의하는 역할을 해요. 여는 중괄호는 OTB(One True Brace) 스타일을 지원하기 위해 이중 콜론과 같은 줄에 지정될 수도 있어요.
위 두 예시가 자동 대체 핫스트링이 아니더라도, 입력한 약어는 기본적으로 지워져요. 이것은 자동 백스페이싱(automatic backspacing)을 통해 이루어지며, b0 옵션으로 비활성화할 수 있어요.
핫스트링이 트리거되면, 핫스트링의 이름이 ThisHotkey라는 이름의 첫 번째 매개변수로 전달돼요(끝의 콜론은 제외). 예를 들어:
:X:btw::MsgBox ThisHotkey *; :X:btw를 보고함*
몇 가지 예외를 빼면 이것은 내장 변수 A_ThisHotkey와 비슷해요. 매개변수 이름은 이름 있는 함수를 사용해 바꿀 수 있어요.
종료 문자 (Ending Characters)
별표(*) 옵션이 적용 중이 아니면, 핫스트링의 약어 뒤에 *종료 문자(end character)*를 입력해야 트리거돼요. 종료 문자는 처음에 다음으로 구성돼요: **-()[]{}':;"/,.?!nst** (n은 Enter, s는 Space, t`는 Tab이라는 점에 주의). 이 문자 집합은 아래 예시를 편집해서 바꿀 수 있는데, 아래 예시는 그 아래의 핫스트링뿐 아니라 모든 핫스트링에 대해 새 종료 문자를 설정해요:
#Hotstring EndChars -()[]{}:;'"/\,.?!`n`s`t
종료 문자는 아래처럼 Hotstring 함수를 호출해서 스크립트가 실행되는 동안에도 바꿀 수 있어요:
Hotstring("EndChars", "-()[]{}:;")
옵션 (Options)
핫스트링의 기본 동작은 세 가지 방법으로 바꿀 수 있어요:
#Hotstring지시문. 스크립트에서 그 지점 물리적으로 아래의 모든 핫스트링에 영향을 줘요. 다음 예시는 C와 R 옵션을 적용해요:#Hotstring c r.- 핫스트링의 첫 번째 콜론 쌍 안에 옵션을 넣기. 다음 예시는 단일 핫스트링에 C와 * 옵션(대소문자 구분 및 "종료 문자 불필요")을 적용해요:
:c*:j@::[email protected]. Hotstring함수. 스크립트가 실행되는 동안 이후에 만들어진 모든 핫스트링에 영향을 줘요. 다음 예시는 C와 R 옵션을 적용해요:Hotstring "c r".
아래 목록은 각 옵션을 설명해요. 위 방법으로 둘 이상의 옵션을 지정할 때는 그 사이에 선택적으로 공백을 넣을 수 있어요.
***** (별표): 핫스트링을 트리거하기 위해 종료 문자(예: Space, ., Enter)가 필요하지 않아요. 예를 들어:
:*:j@::[email protected]
위 예시는 @ 문자를 입력하는 순간 대체문을 보내요. #Hotstring 지시문을 사용할 때는 *0으로 이 옵션을 다시 끌 수 있어요.
? (물음표): 핫스트링이 다른 단어 안에 있을 때, 즉 바로 앞에 입력된 문자가 영숫자일 때도 트리거돼요. 예를 들어, :?:al::airline이 핫스트링이면 "practical "을 입력하면 "practicairline "이 생겨요. ?0으로 이 옵션을 다시 끌 수 있어요.
B0 (B 뒤에 0): 입력한 약어를 지우기 위해 자동 백스페이싱을 하지 않아요. 이전에 꺼진 후 백스페이싱을 다시 켜려면 그냥 B를 사용해요. 스크립트는 자신만의 백스페이싱을 {bs 5}로 할 수도 있는데, 이것은 Backspace를 다섯 번 보내요. 마찬가지로 {left 5}로 ←를 다섯 번 보낼 수 있어요. 예를 들어, 다음 핫스트링은 ""을 만들고 캐럿을 왼쪽으로 5칸 이동해요(그래서 캐럿이 태그 사이에 있음):
:*b0:<em>::</em>{left 5}
C: 대소문자 구분: 약어를 입력할 때, 스크립트에 정의된 대소문자와 정확히 일치해야 해요. C0으로 대소문자 구분을 다시 끌 수 있어요.
C1: 입력된 대소문자를 따르지 않기. 자동 대체 핫스트링을 대소문자 구분 없게 만들고, 실제로 입력한 문자의 대소문자를 따르지 않게 하려면 이 옵션을 사용해요. 대소문자 적합(case-conforming) 핫스트링(기본값)은 약어를 전부 대문자로 입력하면 대체문을 전부 대문자로 만들어요. 첫 글자를 대문자로 입력하면 대체문의 첫 글자도(문자라면) 대문자가 돼요. 다른 방식으로 대소문자를 입력하면 대체문은 정의된 그대로 보내져요. #Hotstring 지시문을 사용할 때는 C0으로 이 옵션을 다시 꺼서 핫스트링이 다시 대소문자에 적합하게 할 수 있어요.
Kn: 키 지연(key-delay): 거의 사용되지 않는 이 옵션은 자동 백스페이싱이나 자동 대체가 만드는 키 입력 사이의 지연을 설정해요. n에 새 지연을 지정해요. 예를 들어 k10을 지정하면 10ms 지연, k-1을 지정하면 지연 없음이 돼요. 이 옵션의 정확한 동작은 적용 중인 보내기 모드에 따라 달라져요:
- SI (SendInput): 이 모드에서는 지연이 불가능하므로 키 지연이 무시돼요. 예외는 SendInput을 사용할 수 없을 때인데, 그 경우 핫스트링은 아래의 SendPlay 모드로 되돌아가며(이 모드는 키 지연을 따름) 돼요.
- SP (SendPlay): 길이 0의 지연이 기본이며, SendPlay에서는 -1(지연 없음)과 같아요. 이 모드에서 지연은 사실 키 입력 사이의 지연이 아니라 PressDuration이에요.
- SE (SendEvent): 길이 0의 지연이 기본이에요. 0은 빠르면서도(내부적으로 Sleep 0을 하므로) 다른 프로세스와 잘 협력하므로 대부분의 목적에 권장돼요. k-1을 지정하면 아예 지연이 없는데, 이것은 CPU가 자주 과부하 상태일 때 자동 대체를 더 빠르게 하는 데 유용해요. -1로 설정하면 스크립트의 프로세스 우선순위가 키 입력을 얼마나 빨리 보낼 수 있는지의 중요한 요소가 돼요. 스크립트의 우선순위를 높이려면
ProcessSetPriority "High"를 사용해요.
O: 대체문이 생산될 때 자동 대체 핫스트링의 종료 문자를 생략해요. 이것은 여전히 종료 문자를 요구해서 핫스트링을 모호하지 않게 유지하고 싶지만, 종료 문자가 실제로 화면에 표시되는 것은 원하지 않을 때 유용해요. 예를 들어, :o:ar::aristocrat가 핫스트링이면 "ar" 다음에 스페이스바를 입력하면 뒤에 공백 없이 "aristocrat"이 생겨서, Backspace를 누르지 않고도 단어를 복수형이나 소유격으로 만들 수 있어요. O0(O 뒤에 0)으로 이 옵션을 다시 끌 수 있어요.
Pn: 핫스트링의 우선순위(예: P1). 거의 사용되지 않는 이 옵션은 자동 대체 핫스트링에는 영향을 주지 않아요.
R: 대체 텍스트를 raw로 보내요. 즉 {Enter}를 Enter로, ^c를 Ctrl+C로 변환하지 않고 보내요. R0으로 이 옵션을 다시 끄거나 T로 덮어쓸 수 있어요.
참고: 텍스트 모드가 더 안정적일 수 있어요. R과 T 옵션은 상호 배타적이에요.
S 또는 S0: 문자 S를 지정하면 핫스트링을 Suspend(일시 중단)에서 제외해요. S0(S와 숫자 0)를 지정하면 제외를 제거해서 핫스트링이 일시 중단될 수 있게 해요. 기본 옵션으로 적용될 때는 S 또는 #SuspendExempt가 핫스트링을 제외하게 해요. 즉, 지시문을 덮어쓰려면 핫스트링에서 명시적으로 S0을 사용해야 해요.
SI, SP 또는 SE: 자동 대체 핫스트링이 키 입력을 보내는 방법을 설정해요. 이 옵션들은 상호 배타적이어서 한 번에 하나만 적용될 수 있어요. 각 옵션은 다음과 같아요:
- SI는 SendInput을 뜻하며, 보통 다른 모드보다 뛰어난 속도와 안정성을 가져요. 또 다른 장점은 아래의 SendPlay처럼, SendInput이 핫스트링의 자동 대체 텍스트 도중에 입력하는 어떤 것도 연기한다는 것이에요. 이것은 여러분의 키 입력이 대체문 사이에 끼어들지 않게 해줘요. SendInput을 사용할 수 없으면 핫스트링은 자동으로 SendPlay를 대신 사용해요.
- SP는 SendPlay를 뜻하며, 더 다양한 게임에서 핫스트링이 동작하게 할 수 있어요.
- SE는 SendEvent를 뜻해요.
위 옵션 중 어느 것도 사용하지 않으면 기본 모드는 SendInput이에요. 하지만 SI 옵션과 달리, SendInput을 사용할 수 없을 때 SendEvent가 SendPlay 대신 사용돼요.
T: 텍스트(Text) 모드로 대체 텍스트를 보내요. 즉 {Enter}를 Enter로, ^c를 Ctrl+C로 변환하지 않고, 각 문자를 키 입력으로 변환하지 않고 문자 코드로 보내요. 이 옵션은 연속 섹션(continuation section)을 가진 핫스트링에서 자동으로 적용돼요. T0 또는 R0으로 이 옵션을 다시 끄거나 R로 덮어쓸 수 있어요.
X: 실행(Execute). 대체 텍스트 대신, 핫스트링이 실행할 함수 호출이나 표현식을 받아들여요. 예를 들어, :X:~mb::MsgBox는 사용자가 "~mb"를 입력할 때 단어 "MsgBox"로 자동 대체하는 대신 메시지 상자를 표시하게 해요. 이것은 함수를 호출하는 많은 수의 핫스트링을 정의할 때 가장 유용한데, 그렇지 않으면 핫스트링당 세 줄이 필요하기 때문이에요.
이 옵션은 Hotstring 함수와 함께 사용하면 안 돼요. 핫스트링이 트리거될 때 함수를 호출하게 하려면 함수를 참조로 전달해요.
Z: 거의 사용되지 않는 이 옵션은 각 트리거 후에 핫스트링 인식기를 재설정해요. 즉, 스크립트가 완전히 새로운 핫스트링을 기다리기 시작해서, 이전에 입력한 어떤 것도 고려에서 제외해요. 이것은 원치 않는 핫스트링 트리거를 방지할 수 있어요. 설명을 위해 다음 핫스트링을 고려해 보세요:
:b0*?:11::
{
Send "xx"
}
위에는 Z 옵션이 없으므로 111(연속된 세 개의 1)을 입력하면 핫스트링이 두 번 트리거돼요. 왜냐하면 가운데 1이 첫 번째 트리거의 마지막 문자이면서 동시에 두 번째 트리거의 첫 번째 문자이기 때문이에요. b0 앞에 문자 Z를 추가하면, 핫스트링을 두 번 트리거하려면 세 개 대신 네 개의 1을 입력해야 해요. Z0으로 이 옵션을 다시 끌 수 있어요.
긴 대체문 (Long Replacements)
많은 양의 대체 텍스트를 만드는 핫스트링은 연속 섹션(continuation section)을 사용해서 더 읽기 쉽고 유지하기 쉽게 만들 수 있어요. 예를 들어:
::text1::
(
Any text between the top and bottom parentheses is treated literally.
By default, the hard carriage return (Enter) between the previous line and this one is also preserved.
By default, the indentation (tab) to the left of this line is preserved.
)
기본 동작을 바꾸는 방법은 연속 섹션을 참조해요. 연속 섹션이 있으면 핫스트링이 기본적으로 Text 모드가 되기도 해요. 이 특별한 기본값을 덮어쓰는 유일한 방법은 연속 섹션이 있는 각 핫스트링에 반대 옵션을 지정하는 것이에요(예: :t0:text1:: 또는 :r:text2::).
문맥에 민감한 핫스트링 (Context-sensitive Hotstrings)
#HotIf 지시문은 선택한 핫스트링을 문맥에 민감하게 만드는 데 사용될 수 있어요. 그런 핫스트링은 활성 창의 종류 같은 어떤 조건에 따라 다른 대체문을 보내거나, 다른 동작을 수행하거나, 아무것도 하지 않아요. 예를 들어:
#HotIf WinActive("ahk_class Notepad")
::btw::This replacement text will appear only in Notepad.
#HotIf
::btw::This replacement text appears in windows other than Notepad.
자동 교정 (AutoCorrect)
다음 스크립트는 핫스트링을 사용해 약 4700개의 흔한 영어 오타를 즉석에서 교정해요. 또한 Win+H 핫키를 포함해 오타를 더 쉽게 추가할 수 있게 해줘요:
다운로드: AutoCorrect.ahk (127 KB)
작성자: Jim Biancolo 및 Wikipedia의 흔한 오타 목록
주의 사항 (Remarks)
대체 텍스트 안에서 표현식은 현재 지원되지 않아요. 이 문제를 해결하려면 그런 핫스트링을 자동 대체로 만들지 마세요. 대신 핫스트링의 본문에서 Send 함수를 사용하거나 X(execute) 옵션과 결합해 사용해요.
대체문 뒤에 추가 공백이나 탭을 보내려면 대체문 끝에 이스케이프 시퀀스 `s 또는 `t를 포함해요. 예: :*:btw::by the ways``.
Text나 Raw 모드를 사용하지 않는 자동 대체 핫스트링에서, {만 보내거나 앞에 공백만 있는 {를 보내려면 중괄호 쌍으로 감싸야 해요. 예: :*:brace::{{} 및 :*:space_brace:: {{}. 그렇지 않으면 OTB(One True Brace) 스타일을 지원하기 위해 핫스트링의 함수에 대한 여는 중괄호로 해석돼요.
기본적으로 마우스 왼쪽 또는 오른쪽 버튼을 클릭하면 핫스트링 인식기가 재설정돼요. 즉, 스크립트가 완전히 새로운 핫스트링을 기다리기 시작해서, 이전에 입력한 어떤 것도 고려에서 제외해요(이것이 바람직하지 않으면 스크립트 어디에든 #Hotstring NoMouse 줄을 지정해요). 이 "마우스 클릭 시 재설정" 동작이 기본인 이유는 각 클릭이 보통 텍스트 삽입점(캐럿)을 이동하거나 키보드 포커스를 새 컨트롤/필드로 설정하기 때문이에요. 그런 경우 보통 1) 물음표 옵션이 없어도 핫스트링을 발화시키고, 2) 마우스를 클릭한 후 입력한 것이 우연히 이전에 입력한 것과 유효한 약어를 이루는 것을 방지하는 것이 바람직해요.
핫스트링 인식기는 문자가 입력될 때마다 활성 창을 확인하고, 이전과 다른 창이 활성이라면 재설정해요. 활성 창이 변경되었지만 문자가 입력되기 전에 되돌아가면, 그 변경은 감지되지 않아요(하지만 핫스트링 인식기는 다른 이유로 재설정될 수 있어요). 핫스트링 인식기는 Hotstring "Reset"을 호출해서도 재설정할 수 있어요.
내장 변수 A_EndChar는 가장 최근의 비자동대체 핫스트링을 트리거하기 위해 입력한 종료 문자를 담아요. (* 옵션 때문에) 종료 문자가 필요하지 않았다면 이 변수는 비어 있어요. A_EndChar는 Send 함수를 사용하거나 입력한 종료 문자에 따라 동작이 달라져야 하는 핫스트링을 만들 때 유용해요. 종료 문자 자체를 보내려면 SendText A_EndChar를 사용해요(SendText를 사용하는 이유는 !{} 같은 문자는 일반 Send 함수가 제대로 보내지 못하기 때문이에요).
핫스트링 정의 안에서 단일 콜론은 이중 콜론 구분자 앞에 오지 않는 한 이스케이프할 필요가 없지만, 백틱과 왼쪽에 공백이나 탭이 있는 세미콜론은 항상 이스케이프해야 해요. 전체 목록은 Escape Sequences를 참조해요.
{Enter} 같은 Send 함수의 특수 문자는(원시 옵션을 사용하지 않는 한) 자동 대체 텍스트에서 지원되지만, 핫스트링 약어 자체는 이것을 사용하지 않아요. 대신 Enter에는 `n을, Tab에는 `t(또는 리터럴 탭)을 지정해요(전체 목록은 Escape Sequences 참조). 예를 들어, `:*:ab`t:: 핫스트링은 "ab" 뒤에 탭을 입력하면 트리거돼요.
공백과 탭은 핫스트링 정의 안에서 리터럴하게 취급돼요. 예를 들어, 다음 두 개는 서로 다른 결과를 만들어요: ::btw::by the way 및 ::btw:: by the way.
각 핫스트링 약어는 40자 이하여야 해요. 프로그램은 이 길이를 초과하면 경고해요. 반대로 핫스트링의 대체 텍스트 길이는 보내기 모드가 기본값인 SendInput일 때 약 5000자로 제한돼요. 그 제한은 다른 보내기 모드 중 하나로 전환하거나, 핫스트링 본문에서 SendPlay나 SendEvent를 사용하거나 X(execute) 옵션과 결합해서 없앨 수 있어요.
핫스트링이 정의된 순서가 서로에 대한 우선 순위를 결정해요. 즉, 둘 이상의 핫스트링이 입력한 것과 일치하면 스크립트에서 먼저 나열된 것만 적용돼요. 관련 주제: 문맥에 민감한 핫스트링.
사용자가 하는 백스페이싱은 핫스트링 감지 목적에 반영돼요. 하지만 편집기 안에서 ↑, →, ↓, ←, PgUp, PgDn, Home, End를 사용해 탐색하면 핫스트링 인식 과정이 재설정돼요. 즉, 완전히 새로운 핫스트링을 기다리기 시작해요.
활성 창이 키 입력을 무시하고 있어도 핫스트링은 입력될 수 있어요. 즉, 트리거 약어가 결코 보이지 않아도 핫스트링은 여전히 발화돼요. 게다가 가장 최근에 입력한 키 입력을 되돌리기 위해 Backspace를 계속 누를 수 있어요(그 효과는 볼 수 없지만).
핫스트링의 함수는 이름이 지어졌을 때만 스크립트가 명시적으로 호출할 수 있어요. Named Function Hotstrings를 참조해요.
입력이 보이지 않는 Input 훅에 의해 차단되는 동안에는 핫스트링이 모니터링되지 않고 트리거되지 않아요.
기본적으로 핫스트링은 어떤 AutoHotkey 스크립트가 만든 키 입력으로는 절대 트리거되지 않아요. 이것은 핫스트링이 계속 서로를 트리거하는 무한 루프의 가능성을 피해요. 이 동작은 #InputLevel과 #SendLevel로 제어할 수 있어요. 하지만 자동 대체 핫스트링은 항상 send level 0을 사용하므로 훅 핫키나 핫스트링을 결코 트리거하지 않아요.
Suspend 함수는 제외로 만든 것들을 제외한 모든 핫스트링을 일시적으로 비활성화할 수 있어요. 더 선택적으로 하려면 #HotIf를 사용해요.
핫스트링은 Hotstring 함수를 통해 동적으로 만들 수 있으며, 이 함수는 스크립트의 기존 핫스트링을 개별적으로 수정하거나 비활성화하거나 활성화할 수도 있어요.
InputHook 함수는 특정 목적에서 핫스트링보다 더 유연해요. 예를 들어, 활성 창(예: 게임)에서 키 입력이 보이지 않게 해줘요. 또한 Esc 같은 비문자 종료 키도 지원해요.
키보드 훅은 핫스트링을 포함하는 어떤 스크립트에서든 자동으로 사용돼요.
핫스트링은 다음 방식에서 핫키와 동일하게 동작해요:
- Suspend 함수의 영향을 받음.
#MaxThreads와#MaxThreadsPerHotkey를 따름(#MaxThreadsBuffer는 제외).- 핫스트링을 포함하는 스크립트는 자동으로 영구(permanent)가 됨.
- 비자동대체 핫스트링은 시작될 때 새 스레드를 만들고, A_ThisHotkey 같은 내장 핫키 변수를 업데이트함.
알려진 제한: Java 응용 프로그램의 일부 시스템에서 핫스트링이 사용자가 (데드 키를 통해) 분음 문자를 입력하는 것을 방해할 수 있어요. 이 문제를 해결하려면 (모든 핫스트링을 비활성화하는) Suspend를 일시적으로 켤 수 있어요.
이름 있는 함수 핫스트링 (Named Function Hotstrings)
핫스트링 자체를 트리거하지 않고도 핫스트링의 함수를 호출해야 할 필요가 있을 때, 아래 예시처럼 핫스트링의 이중 콜론 바로 다음에 정의해서 하나 이상의 핫스트링에 이름 있는 함수를 할당할 수 있어요:
*; 이 예시는 또한 스크립트에서 대소문자 적합을 구현하는 한 가지 방법을 보여줌.*
:C:BTW:: *; 전부 대문자로 입력됨.*
:C:Btw:: *; 첫 글자만 대문자로 입력됨.*
: :btw:: *; 다른 조합으로 입력됨.*
case_conform_btw(hs) *; hs는 함수를 트리거한 핫스트링의 이름을 담음.*
{
if (hs == ":C:BTW")
Send "BY THE WAY"
else if (hs == ":C:Btw")
Send "By the way"
else
Send "by the way"
}
함수 case_conform_btw가 스크립트에 의해 명시적으로 호출된다면, 첫 번째 매개변수(hs)에 값을 전달해야 해요.
핫키도 이렇게 정의할 수 있어요. 여러 핫키나 핫스트링을 쌓아서 같은 함수를 호출하게 할 수 있어요.
핫스트링과 함수 이름 사이에는 공백이나 주석만 있어야 해요.
함수 이름을 붙이는 것은 또한 위 코드처럼 함수 이름이 핫스트링을 설명하는, 스스로 문서화하는 핫스트링을 장려해요.
Hotstring 함수를 사용해 핫스트링에 함수나 함수 객체를 할당할 수도 있어요.
핫스트링 헬퍼 (Hotstring Helper)
Hotstring 함수 페이지의 예시 섹션에 있는 첫 번째 예시를 살펴보세요. 핫스트링을 많이 사용하는 사람이라면 유용할지도 몰라요. Win+H(또는 선택한 다른 핫키)를 누르면, 현재 선택된 텍스트를 핫스트링으로 바꿀 수 있어요. 예를 들어, 워드 프로세서에서 "by the way"를 선택해 두고 Win+H를 누르면 약어(예: btw)를 묻고, 새 핫스트링을 스크립트에 추가하고 활성화해요.