Hotstrings und Auto-Ersetzen

Einführung und einfache Beispiele

Obwohl mit Hotstrings hauptsächlich Abkürzungen bei der Eingabe erweitert werden (Automatisches Ersetzen), können sie auch dazu verwendet werden, vordefinierte Aktionen zu starten. In diesem Zusammenhang sind sie prinzipiell das gleiche wie Hotkeys, außer dass sie üblicherweise aus mehr als einem Zeichen bestehen (also eine Zeichenkette).

Um einen Hotstring zu definieren, muss die auslösende Abkürzung wie folgt von Doppelpunkt-Paaren umschlossen werden:

::bzw::beziehungsweise

Die Abkürzung bzw wird automatisch mit "beziehungsweise" ersetzt, wann immer du sie eingibst (standardmäßig aber erst, wenn danach ein Endungszeichen erfolgt ist, wie z. B. ein Leerzeichen, Punkt oder Enter).

Das "beziehungsweise"-Beispiel oben ist ein sogenannter automatisch-ersetzender Hotstring, weil der eingegebene Text automatisch gelöscht und mit der angegebenen Zeichenkette nach dem zweiten Doppelpunkt-Paar ersetzt wird. Desweiteren kann ein Hotstring auch zum Durchführen einer benutzerdefinierten Aktion verwendet werden, wie es in den folgenden Beispielen gezeigt wird. Beachte, dass die Befehle unterhalb des Hotstrings erscheinen müssen:

::bzw::
MsgBox Du hast "bzw" eingegeben.
return

:*:]d::  ; Dieser Hotstring ersetzt "]d" mit dem aktuellen Datum- und Zeitwert.
FormatTime, AktuellerZeitstempel,, d.M.yyyy HH:mm  ; z. B. 21.6.2011 15:10
SendInput %AktuellerZeitstempel%
return

Die beiden Beispiele oben sind keine automatisch-ersetzende Hotstrings. Aber auch hier wird die eingegebene Abkürzung standardmäßig gelöscht. Dies erfolgt durch wiederholendes Löschen des letzten Zeichens, das mit der b0-Option deaktiviert werden kann.

Endungszeichen

Standardmäßig muss man ein Endungszeichen nach der Hotstring-Abkürzung eingeben, um sie auslösen zu können, sofern die Sternchen-Option nicht aktiv ist. Endungszeichen bestehen anfangs aus den folgenden Zeichen: -()[]{}':;"/\,.?!`n `t (`n ist Enter, `t ist Tabulator, und beachte das Leerzeichen zwischen `n und `t). Mit dem folgenden Beispiel kann diese Zeichenreihe geändert werden, das die neuen Endungszeichen für alle Hotstrings bereitstellt, nicht nur für die darunter:

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

Optionen

Es gibt zwei Möglichkeiten, wie man das Standardverhalten eines Hotstrings ändern kann:

  1. Die #Hotstring-Direktive, die alle Hotstrings beeinflusst, die sich im Skript physisch darunter befinden. Das folgende Beispiel zeigt, wie man die Optionen C und R aktivieren kann: #Hotstring c r.
  2. Einfügen von Optionen innerhalb des ersten Doppelpunktpaares. Das folgende Beispiel zeigt, wie man die Optionen C und * für einen einzelnen Hotstring wirksam machen kann:
    :c*:j@::john@somedomain.com ; c ist Unterscheidung zwischen Groß- und Kleinschreibung, und * ist "Endungszeichen sind nicht notwendig"..

Die folgende Liste beschreibt die einzelnen Optionen. Sind mehr als eine Option notwendig, können diese jeweils mit einem Leerzeichen getrennt werden.

* (Sternchen): Ein Endungszeichen (z. B. Leerzeichen, Punkt oder Enter) ist nicht erforderlich, um den Hotstring auslösen zu können. Zum Beispiel:

:*:j@::jsmith@somedomain.com

Dieses Beispiel würde die Abkürzung ersetzen, sobald du das @-Zeichen eingibst. Verwendet man die #Hotstring-Direktive, muss *0 angegeben werden, um diese Option wieder deaktivieren zu können.

? (Fragezeichen): Der Hotstring wird ausgelöst, selbst wenn er sich in einem anderen Wort befindet; das heißt, wenn das davor eingegebene Zeichen alphanumerisch ist. Wenn :?:de::Deutschland beispielsweise ein Hotstring ist, würde das Eingeben von "Fahrstunde " bewirken, dass "FahrstunDeutschland " erzeugt wird. Mit ?0 kann diese Option wieder deaktiviert werden.

B0 (B gefolgt von einer Null): Es erfolgt kein automatisches Rücksetzen (backspacing), um die eingegebene Abkürzung zu entfernen. Mit einem einfachen B kann dieses Rücksetzen wieder aktiviert werden, wenn es zuvor deaktiviert wurde. Ein Skript kann dieses Rücksetzen auch selbst durchführen, z. B. mit {bs 5}, das die Rücktaste 5-mal drücken würde. Ebenso könnte die linke Pfeiltaste via {left 5} gesendet werden. Zum Beispiel würde der folgende Hotstring "<em></em>" erzeugen und die Einfügemarke um 5 Stellen nach links verschieben (so dass der Textcursor genau zwischen den Tags ist):

:*b0:<em>::</em>{left 5}

C: Zeichengenauigkeit: Eine Abkürzung wird nur erweitert, wenn sie genau mit der Groß- und Kleinschreibung übereinstimmt, wie sie im Skript definiert wurde. Mit C0 kann diese Option wieder deaktiviert werden.

C1: Der Hotstring passt sich nicht der eingegebenen Groß- und Kleinschreibung an. Verwende diese Option, um automatisch-ersetzende Hotstrings unabhängig von Groß- und Kleinschreibung zu machen, und sie daran zu hindern, sich nach der Groß- und Kleinschreibung der eingegebenen Zeichen zu richten. Hotstrings, die Groß- und Kleinschreibung berücksichtigen (die Standardeinstellung), würden ihren Text in Großbuchstaben erzeugen, wenn die eingegebene Abkürzung auch in Großbuchstaben wäre. Würde man nur den ersten Buchstaben großschreiben, wäre der erste Buchstabe des Ersatztextes auch großgeschrieben (sofern es ein Buchstabe ist). Ansonsten erfolgt die Ausgabe genauso, wie sie angegeben wurde. Verwendet man die #Hotstring-Direktive, muss C0 angegeben werden, um diese Option wieder deaktivieren zu können (an Groß- und Kleinschreibung anpassen).

Kn: Tastenverzögerung: Diese selten verwendete Option bestimmt die Verzögerung zwischen den Tastatureingaben beim Automatischen Rücksetzen (backspacing) oder Automatischen Ersetzen. Gebe die neue Verzögerung bei n an; zum Beispiel würde k10 eine Verzögerung von 10 ms ermöglichen und k-1 die Verzögerung deaktivieren. Das genaue Verhalten dieser Option hängt davon ab, welcher Sendemodus aktiv ist:

O: Lässt das Endungszeichen im Ausgabetext weg, der mit einem automatisch-ersetzenden Hotstring erzeugt wurde. Diese Option kann nützlich sein, wenn du einen Hotstring dazu bringen willst, weiterhin ein Endungszeichen zu benötigen, um eindeutig zu bleiben, aber nicht willst, dass dieses Endungszeichen auf dem Bildschirm angezeigt werden soll. Wenn :o:ar::Aristokrat beispielsweise ein Hotstring ist, würde die Eingabe von "ar", gefolgt von einem Leerzeichen, "Aristokrat" ohne nachfolgendem Leerzeichen erzeugen. Dadurch hat man die Möglichkeit, das Wort in den Plural oder Kasus zu setzen, ohne dabei die Rücktaste verwenden zu müssen. Mit O0 (Buchstabe O mit einer Null danach) kann diese Option wieder deaktiviert werden.

Pn: Die Priorität des Hotstrings (z. B. P1). Diese selten verwendete Option funktioniert nicht bei automatisch-ersetzenden Hotstrings.

R: Sendet den Ersatztext, ohne ihn dabei ausgewertet zu haben; das heißt, dass er so erscheint wie er ist, anstatt zum Beispiel {Enter} als ENTER-Taste, ^c als STRG+C und so weiter zu übersetzen. Diese Option wird bei Hotstrings, die einen Fortsetzungsbereich haben, automatisch in Kraft treten. Mit R0 kann diese Option wieder deaktiviert werden.

SI oder SP oder SE [v1.0.43+]: Bestimmt die Methode, mit der die automatisch-ersetzenden Hotstrings ihre Tastatureingaben senden sollen. Diese Optionen schließen sich gegenseitig aus: Es kann nur eine Option zur selben Zeit aktiv sein. Die folgende Liste beschreibt die einzelnen Optionen:

Werden keine der oben genannten Optionen verwendet, gilt standardmäßig SendInput (seit v1.0.43). Beachte aber, dass, im Gegensatz zur SI-Option, SendEvent statt SendPlay verwendet wird, sobald SendInput nicht zur Verfügung steht.

Z: Diese selten verwendete Option setzt die Hotstring-Erkennung wieder zurück, wann immer der Hotstring ausgelöst wird. Das heißt, dass das Skript auf einen völlig neuen Hotstring wartet und alles, was du zuvor eingegeben hast, ignoriert. Dieser Sachverhalt kann verhindern, dass Hotstrings unbeabsichtigt ausgelöst werden. Dazu wird folgendes Beispiel in Betracht gezogen:

:b0*?:11::
SendInput xx
return

Da die Z-Option fehlt, würde das Eingeben von 111 (drei aufeinanderfolgenden Einsen) den Hotstring zweimal auslösen, weil die mittlere 1 das letzte Zeichen vom ersten Auslösen ist, aber auch das erste Zeichen vom zweiten Auslösen. Wenn du den Buchstaben Z vor b0 einfügst, müsstest du vier statt drei Einsen eingeben, um den Hotstring zweimal auslösen zu können. Mit Z0 kann diese Option wieder deaktiviert werden.

Lange Ersatztexte

Hotstrings, die lange Ersatztexte erzeugen, können durch Fortsetzungsbereiche besser lesbar und verwaltbar gemacht werden. Zum Beispiel:

::text1::
(
Der gesamte Text zwischen der oberen und unteren Klammer wird literal behandelt, einschließlich Kommas und Prozentzeichen.
Standardmäßig bleibt das CR-Zeilenumbruchszeichen (Enter) zwischen der vorherigen und dieser Zeile erhalten.
    Standardmäßig bleibt die Einrückung (Tabulator) auf der linken Seite dieser Zeile erhalten.

Siehe Fortsetzungsbereich, wie diese Standardverhalten geändert werden können.
)

Ein Fortsetzungsbereich bewirkt außerdem, dass der Hotstring standardmäßig den Raw-Modus verwendet. Dieses Sonderverhalten kann nur überschrieben werden, wenn bei jedem Hotstring, der ein Fortsetzungsbereich hat, die r0-Option angegeben wird (z. B. :r0:text1::).

Kontextabhängige Hotstrings

Die Direktiven #IfWinActive/Exist können verwendet werden, um bestimmte Hotstrings kontextabhängig zu machen. Solche Hotstrings senden unterschiedliche Ersatztexte, führen unterschiedliche Aktionen aus oder machen überhaupt nichts, abhängig vom Typ des Fensters, das aktiv oder vorhanden ist. Zum Beispiel:

#IfWinActive ahk_class Notepad
::bzw::Dieser Ersatztext wird nur im Editor erscheinen.
#IfWinActive
::bzw::Dieser Ersatztext erscheint nur in einem Fenster, das nicht der Editor ist.

AutoCorrect

Das folgende Skript verwendet Hotstrings, um ca. 4700 häufig vorkommende englische Rechtschreibfehler nebenbei zu korrigieren. Es enthält auch den Hotkey WIN+H, um auf einfache Weise weitere Rechtschreibfehler hinzufügen zu können:

Download: AutoCorrect.ahk (127 KB)

Autor: Jim Biancolo und Wikipedia's Lists of Common Misspellings

Bemerkungen

Variablenverweise wie %MeineVar%, die innerhalb des Ersatztextes vorkommen, werden zurzeit nicht unterstützt. Man kann dies umgehen, wenn man Hotstrings nicht automatisch-ersetzend macht. Verwende stattdessen den SendInput-Befehl unterhalb der Abkürzung, gefolgt von einer Zeile, die nur das Wort Return enthält.

Um ein zusätzliches Leer- oder Tabulatorzeichen nach dem Ersatztext zu senden, füge es am Ende des Ersatztextes ein und mache das letzte Zeichen zu einem umgekehrten Häkchen (`). Zum Beispiel:

:*:bzw::beziehungsweise `

Ein Klick auf die linke oder rechte Maustaste wird die Hotstring-Erkennung zurücksetzen. Das heißt, dass das Skript auf einen völlig neuen Hotstring warten und alles, was du zuvor eingegeben hast, ignorieren wird (ist dies unerwünscht, verwende die Zeile #Hotstring NoMouse irgendwo im Skript). Dieses "Zurücksetzen bei einem Mausklick" ist standardmäßig so festgelegt, weil jeder Klick üblicherweise die Texteinfügemarke (Caret) verschiebt oder den Tastaturfokus auf ein neues Steuerelement/Feld setzt. In solchen Fällen ist es generell wünschenswert: 1) einen Hotstring auslösen zu können, auch ohne Fragezeichen-Option; 2) das Auslösen zu verhindern, wenn du nach einem Mausklick etwas eingibst, das zufällig eine gültige Abkürzung aus der vorherigen Eingabe formt.

Die Built-in-Variable A_EndChar enthält das Endungszeichen, das du zuletzt eingegeben hast, um einen nicht-automatisch-ersetzenden Hotstring auszulösen. Wenn ein Endungszeichen nicht benötigt wurde (wegen der *-Option), wird sie leer sein. A_EndChar ist nützlich beim Erstellen von Hotstrings, die den Send-Befehl verwenden oder deren Verhalten variieren sollen, je nachdem, welches Endungszeichen du eingegeben hast. Mit SendRaw %A_EndChar% kann das Endungszeichen selbst gesendet werden (SendRaw wird hier verwendet, weil der normale Send-Befehl nicht in der Lage ist, Zeichen wie !{} richtig zu senden).

Kommas, Prozentzeichen und einzelne Doppelpunkte müssen innerhalb von Hotstring-Definitionen nicht mit einem Escapezeichen versehen werden. Umgekehrte Häkchen und Semikolons benötigen dagegen ein Leerzeichen oder einen Tabulator auf der linken Seite. Unter Escapesequenzen findest du eine komplette Liste.

Die Sonderzeichen des Send-Befehls wie {Enter} werden im Ersatztext des automatisch-ersetzenden Hotstrings unterstützt (sofern die Raw-Option nicht verwendet wird). Die Hotstring-Abkürzungen selbst unterstützen keine Sonderzeichen dieser Art. Verwende stattdessen `n für die ENTER-Taste und `t (oder ein literales Tabulatorzeichen) für die TAB-Taste (unter Escapesequenzen findest du eine komplette Liste). Zum Beispiel würde der Hotstring :*:ab`t:: ausgelöst werden, wenn du "ab", gefolgt von einem Tabulatorzeichen, eingibst.

Leer- und Tabulatorzeichen werden innerhalb von Hotstring-Definitionen literal behandelt. Zum Beispiel würden die folgenden Hotstrings zwei unterschiedliche Ergebnisse erzeugen: ::bzw::beziehungsweise und ::bzw:: :beziehungsweise.

Jede Hotstring-Abkürzung kann nicht länger sein als 40 Zeichen. Das Programm wird dich warnen, wenn diese Länge überschritten wurde. Dagegen ist die Länge des Ersatztextes auf ca. 5000 Zeichen begrenzt, wenn der Sendemodus standardmäßig SendInput ist. Dieses Limit kann auf 16383 Zeichen erhöht werden, wenn man auf einen der anderen Sendemethoden wechselt. Desweiteren kann eine unbegrenzte Anzahl an Zeichen gesendet werden, wenn SendPlay %MeineVar% in der Hotstring-Definition angegeben wird.

Die Reihenfolge, in der die Hotstrings definiert werden, bestimmt ihre relative Priorität zueinander. Das heißt, wenn deine Eingabe mehr als einen Hotstring auslösen kann, wird nur der erste im Skript aufgelistete Hotstring in Kraft treten. Verwandtes Thema: Kontextabhängige Hotstrings.

Jedes Rücksetzen, das du mit der Rücktaste durchführst, wird zum Erkennen des Hotstrings mit einbezogen. Verwendest du aber Pfeiltasten, BILD-NACH-OBEN, BILD-NACH-UNTEN, POS1 und ENDE, um innerhalb eines Editors zu navigieren, wird der Hotstring-Erkennungsprozess zurückgesetzt. Das heißt, dass das Skript auf einen völlig neuen Hotstring warten wird.

Ein Hotstring kann eingegeben werden, selbst wenn das aktive Fenster deine Tastatureingaben ignoriert. Das heißt, dass der Hotstring noch ausgelöst wird, obwohl die auslösende Abkürzung nicht sichtbar ist. Zudem kannst du immer noch die Rücktaste drücken, um die aktuellste Tastatureingabe rückgängig zu machen (auch wenn die Auswirkung nicht zu sehen ist).

Es ist möglich, mit Gosub oder Goto zu einem Hotstring-Label zu springen, wenn du sein erstes Doppelpunkt-Paar (einschließlich die Optionssymbole) vor seinem Namen setzt. Zum Beispiel: Gosub ::xyz. Springt man aber zu einem einzeiligen (automatisch-ersetzenden) Hotstring, wird nichts anderes ausgeführt als ein Return.

Hotstrings werden weder überwacht, noch können sie von einem unsichtbaren Input-Befehl ausgelöst werden. Nur sichtbare Eingaben sind in der Lage, sie auszulösen.

Standardmäßig werden Tastatureingaben, die von einem AutoHotkey-Skript erzeugt wurden, keine Hotstrings auslösen. Dadurch kann verhindert werden, dass eine Endlosschleife erzeugt wird, in der Hotstrings sich gegenseitig immer und immer wieder auslösen. Seit v1.1.06 kann dieses Verhalten mit #InputLevel und SendLevel kontrolliert werden. Allerdings verwenden automatisch-ersetzende Hotstrings immer Sendestufe 0 und können deshalb nie Hook-Hotkeys oder Hotstrings auslösen.

In bestimmten Fällen ist der Input-Befehl flexibler als Hotstrings. Durch diesen Befehl müssen deine Tastatureingaben nicht sichtbar im aktiven Fenster eingegeben werden (z. B. in einem Spiel). Zudem unterstützt er Zeichen wie Escape als Endungstasten.

Der Tastatur-Hook wird automatisch in Kraft treten, sobald das Skript Hotstrings enthält.

In einigen Punkten verhalten sich Hotstrings genauso wie Hotkeys:

Bekannte Einschränkung: Bei bestimmten Java-Anwendungen kann es passieren, dass Hotstrings den Benutzer dabei stören, diakritische Buchstaben eingeben zu können (via toter Tasten). Man kann dies umgehen, wenn man Suspend vorübergehend aktiviert (um alle Hotstrings zu deaktivieren).

Hotstring Helper

Andreas Borutta hat das folgende Skript vorgeschlagen, wenn du ein Benutzer vieler Hotstrings bist. Du kannst durch Drücken von WIN+H (oder eines beliebig anderen Hotkeys) den aktuell markierten Text in ein Hotstring umwandeln. Hast du zum Beispiel "beziehungsweise" in einem Textverarbeitungsprogramm markiert, wird das Drücken von WIN+H dich zur Eingabe einer Abkürzung auffordern (z. B. bzw) und dann den neuen Hotstring in das Skript einfügen. Danach wird das Skript neu geladen, um den Hotstring zu aktivieren.

#h::  ; Hotkey: WIN+H
; Ermittelt den aktuell markierten Text. Es wird die Zwischenablage anstelle von
; "ControlGet Selected" verwendet, da sie bei den meisten Editoren
; (bzw. Textverarbeitungsprogramme) funktioniert.  Speichert den aktuellen Inhalt der Zwischenablage,
; um sie später wiederherstellen zu können. Allerdings gilt das nur für Klartext:
AutoTrim Off  ; Leerraumzeichen am Anfang oder Ende der Zwischenablage werden nicht entfernt.
ClipboardAlt = %ClipboardAll%
Clipboard =  ; Muss anfangs leer sein, damit die Erkennung funktioniert.
Send ^c
ClipWait 1
if ErrorLevel  ; ClipWait hat die Zeit überschritten.
    return
; Ersetzt CRLF und/oder LF mit `n, um es für einen Hotstring im Raw-Modus verwendbar zu machen:
; Das gleiche wird für jedes andere Zeichen getan,
; das ein Problem im Raw-Modus sein könnte:
StringReplace, Hotstring, Clipboard, ``, ````, All  ; Zuerst diese Ersetzung, um Störungen bei den anderen darunter zu vermeiden.
StringReplace, Hotstring, Hotstring, `r`n, ``r, All  ; Das `r funktioniert besser als `n in MS Word usw.
StringReplace, Hotstring, Hotstring, `n, ``r, All
StringReplace, Hotstring, Hotstring, %A_Tab%, ``t, All
StringReplace, Hotstring, Hotstring, `;, ```;, All
Clipboard = %ClipboardAlt%  ; Stellt den vorherigen Inhalt der Zwischenablage wieder her.
; Verschiebt die Texteinfügemarke der InputBox auf eine bessere Position:
SetTimer, VerschiebeEinfügemarke, 10
; Zeigt die InputBox für den Standard-Hotstring an:
InputBox, Hotstring, Neuer Hotstring, Gebe deine Abkürzung an der vorgegebenen Einfügemarke ein. Bei Bedarf kannst du den Ersatztext noch bearbeiten.`n`nBeispieleintrag: :R:bzw`::beziehungsweise,,,,,,,, :R:`::%Hotstring%
if ErrorLevel  ; Der Benutzer hat Abbrechen gedrückt.
    return
IfInString, Hotstring, :R`:::
{
    MsgBox Es wurde keine Abkürzung angegeben. Der Hotstring wurde nicht hinzugefügt.
    return
}
; Ansonsten wird der Hotstring hinzugefügt und das Skript neu geladen:
FileAppend, `n%Hotstring%, %A_ScriptFullPath%  ; Setzt ein `n an den Anfang, falls eine leere Zeile am Ende der Datei fehlt.
Reload
Sleep 200 ; Bei Erfolg wird das Reload diese Instanz während dem Sleep schließen, daher wird Zeile darunter nie erreicht.
MsgBox, 4,, Der gerade eingefügte Hotstring wurde scheinbar nicht richtig formatiert.  Möchtest du das Skript öffnen, um es zu bearbeiten? Den betroffenen Hotstring findest du ganz unten im Skript.
IfMsgBox, Yes, Edit
return

VerschiebeEinfügemarke:
IfWinNotActive, Neuer Hotstring
    return
; Verschiebt die Einfügemarke der InputBox auf eine Position, wo der Benutzer die Abkürzung eintragen kann.
Send {Home}{Right 3}
SetTimer, VerschiebeEinfügemarke, Off
return