Hotstrings

Inhaltsverzeichnis

Einführung und einfache Beispiele

Hotstrings werden hauptsächlich verwendet, um geschriebene Abkürzungen in lange Texte umzuwandeln (kurz Auto-Ersetzen), aber auch, um eine geskriptete Aktion zu starten. Im Prinzip verhalten sich Hotstrings wie Hotkeys, außer dass sie in der Regel aus mehr als einem Zeichen (also einer Zeichenkette) bestehen.

Um einen Hotstring zu definieren, umschließen Sie die auslösende Abkürzung mit Doppelpunktpaaren. Zum Beispiel:

::bzw::beziehungsweise

Das obige Beispiel hat die folgende Wirkung: Jedes Mal, wenn Sie die Abkürzung "bzw" eingeben, wird diese automatisch mit "beziehungsweise" ersetzt (allerdings geschieht das standardmäßig nur, wenn Sie nach der Eingabe von "bzw" ein Endungszeichen wie Leer, . oder Enter eingeben).

Das "beziehungsweise"-Beispiel oben ist ein sogenannter automatisch-ersetzender Hotstring. Er löscht automatisch den eingegebenen Text und ersetzt ihn mit der Zeichenkette nach dem zweiten Doppelpunktpaar. Ein Hotstring kann auch verwendet werden, um eine benutzerdefinierte Aktion auszuführen, wie in den folgenden Beispielen. Beachten Sie, dass die Anweisungen unter der Abkürzung im Funktionskörper des Hotstrings angegeben werden müssen:

::bzw::
{
    MsgBox 'Sie haben "bzw" eingegeben.'
}

:*:]d::  ; Dieser Hotstring ersetzt "]d" mit dem heutigen Datum via Anweisung unten.
{
    Send FormatTime(, "d.M.yyyy HH:mm")  ; z.B. 21.6.2011 15:10
}

Im obigen Beispiel dienen die geschweiften Klammern dazu, einen Funktionskörper für jeden Hotstring zu definieren. Die geschweifte Startklammer kann auf derselben Zeile wie das Doppelpunktpaar stehen, um den One True Brace (OTB) Style zu unterstützen.

Obwohl die beiden Beispiele oben keine automatisch-ersetzende Hotstrings sind, wird auch hier die eingegebene Abkürzung standardmäßig gelöscht. Dieses Löschen erfolgt durch automatisches Backspacing (wiederholtes Löschen des letzten Zeichens), was mit der b0-Option deaktiviert werden kann.

Beim Auslösen eines Hotstrings wird der Name des Hotstrings (ohne die Doppelpunkte am Ende) als erster Parameter namens ThisHotkey übergeben. Zum Beispiel:

:X:bzw::MsgBox ThisHotkey  ; Meldet :X:bzw

Bis auf wenige Ausnahmen ähnelt dies der internen Variable A_ThisHotkey. Der Parametername kann mit einer benannten Funktion geändert werden.

Endungszeichen

Um einen Hotstring auszulösen, müssen Sie standardmäßig nach der Eingabe der Abkürzung ein Endungszeichen eingeben (was aber mit der Sternchen-Option geändert werden kann). Zu den Endungszeichen gehören standardmäßig die folgenden: -()[]{}':;"/\,.?!`n`s`t (`n ist Enter, `s ist Leer und `t ist Tab). Dieser vordefinierte Zeichensatz kann mit dem folgenden Beispiel geändert werden; beachten Sie aber, dass die neuen Endungszeichen für alle Hotstrings gesetzt werden, nicht nur für Hotstrings, die danach folgen:

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

Die Endungszeichen können während der Skriptausführung geändert werden, indem man die Hotstring-Funktion wie folgt aufruft:

Hotstring("EndChars", "-()[]{}:;")

Optionen

Es gibt zwei Möglichkeiten, wie das Standardverhalten eines Hotstrings geändert werden kann:

  1. Die #Hotstring-Direktive, die alle Hotstrings beeinflusst, die sich im Skript physisch darunter befinden. Das folgende Beispiel aktiviert die Optionen C und R: #Hotstring c r.
  2. Optionen in das erste Doppelpunktpaar des Hotstrings einfügen. Das folgende Beispiel aktiviert die Optionen C und * (Groß-/Kleinschreibung-sensitiv und "ohne Endungszeichen auslösbar") für einen einzelnen Hotstring: :c*:j@::john@somedomain.com.

Die folgende Liste beschreibt die einzelnen Optionen. Mehrere Optionen können optional mit Leerzeichen voneinander getrennt werden.

* (Sternchen): Der Hotstring kann ohne Endungszeichen (z.B. Leer, . oder Enter) ausgelöst werden. Zum Beispiel:

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

Das obige Beispiel sendet seinen Ersatztext, sobald Sie das @-Zeichen eingegeben haben. Mit *0 (unter Nutzung der #Hotstring-Direktive) kann diese Option wieder deaktiviert werden.

? (Fragezeichen): Bewirkt, dass der Hotstring immer ausgelöst wird, egal ob er sich in einem anderen Wort befindet oder nicht, d.h. das davor eingegebene Zeichen kann alphanumerisch sein. Wenn Sie zum Beispiel den Hotstring :?:de::Deutschland verwenden, würde die Eingabe von "Fahrstunde " dazu führen, dass "FahrstunDeutschland " erzeugt wird. Mit ?0 kann diese Option wieder deaktiviert werden.

B0 (B gefolgt von einer Null): Bewirkt, dass die eingegebene Abkürzung nicht via automatisches Backspacing (wiederholtes Löschen des letzten Zeichens) gelöscht wird. Mit B kann das Backspacing, falls es zuvor deaktiviert war, wieder aktiviert werden. Mit {bs 5}, das Backspace fünfmal sendet, kann ein Skript das Backspacing selbst durchführen. Mit {left 5} kann fünfmal gesendet werden. Der folgende Hotstring beispielsweise erzeugt "<em></em>" und verschiebt den Textcursor 5 Stellen nach links (so dass der Textcursor genau zwischen den Tags liegt):

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

C: Groß-/Kleinschreibung-sensitiv: Bewirkt, dass der Hotstring nur dann ausgelöst wird, wenn die Groß-/Kleinschreibung der eingegebenen Abkürzung exakt mit der im Skript definierten Variante übereinstimmt. Mit C0 kann diese Option wieder deaktiviert werden.

C1: Nicht an die Groß-/Kleinschreibung anpassen. Verwenden Sie diese Option, um automatisch-ersetzende Hotstrings nicht-Groß-/Kleinschreibung-sensitiv zu machen und zu verhindern, dass sie sich an die Groß-/Kleinschreibung der von Ihnen eingegebenen Zeichen anpassen. Groß-/Kleinschreibung-anpassende Hotstrings (Standardeinstellung) erzeugen den Ersatztext komplett in Großbuchstaben, wenn Sie die Abkürzung komplett in Großbuchstaben eingeben. Wenn Sie den ersten Buchstaben großschreiben, wird auch der erste Buchstabe des Ersatztextes großgeschrieben (sofern es ein Buchstabe ist). Wenn Sie die Groß-/Kleinschreibung auf eine andere Weise eingeben, wird der Ersatztext ohne Änderung der Groß-/Kleinschreibung gesendet. Mit C0 (unter Nutzung der #Hotstring-Direktive) kann diese Option wieder deaktiviert werden.

Kn: Tastenverzögerung: Diese selten verwendete Option bestimmt die Verzögerung zwischen den Tastendrücken, die via Auto-Backspacing oder Auto-Ersetzen erzeugt werden. Geben Sie für n die neue Verzögerung an, z.B. k10 für eine Verzögerung von 10 ms oder k-1 zum Deaktivieren der Verzögerung. Das genaue Verhalten dieser Option hängt vom gerade aktiven Send-Modus ab:

O: Bewirkt, dass automatisch-ersetzende Hotstrings ihren Ersatztext ohne Endungszeichen erzeugen. Diese Option ist nützlich, wenn Sie weiterhin mit einem Endungszeichen verhindern wollen, dass der Hotstring versehentlich ausgelöst wird, aber gleichzeitig auch erreichen wollen, dass dieses Endungszeichen nicht auf dem Bildschirm erscheint. Verwenden Sie zum Beispiel den Hotstring :o:ar::Aristokrat, würde die Eingabe von "ar" gefolgt von einem Leerzeichen dazu führen, dass "Aristokrat" ohne Leerzeichen am Ende erzeugt wird, was Ihnen z.B. die Möglichkeit bietet, das Wort in den Plural zu setzen, ohne Backspace verwenden zu müssen. Mit O0 (Buchstabe O gefolgt von einer Null) kann diese Option wieder deaktiviert werden.

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

R: Bewirkt, dass der Ersatztext im Rohzustand gesendet wird, d.h. es findet keine Übersetzung von {Enter} zu Enter, ^c zu Strg+C usw. statt. Diese Option kann mit R0 wieder deaktiviert oder mit T überschrieben werden.

Hinweis: Der Text-Modus kann für das Senden von Text zuverlässiger sein. Die Optionen R und T schließen sich gegenseitig aus.

S oder S0: Geben Sie den Buchstaben S an, um den Hotstring vor einer Suspension zu schützen. Geben Sie S0 (S mit der Zahl 0) an, um den Schutz zu entfernen, so dass der Hotstring wieder suspendiert werden kann. Wenn diese Option als Standardoption festgelegt ist, wird der Hotstring entweder durch S oder #SuspendExempt vor einer Suspension geschützt, d.h. um die Direktive zu überschreiben, muss S0 explizit im Hotstring verwendet werden.

SI oder SP oder SE: Bestimmt den Modus, den automatisch-ersetzende Hotstrings zum Senden ihrer Tastendrücke verwenden. Diese Optionen schließen sich gegenseitig aus, d.h. es kann immer nur eine Option aktiv sein. Die folgende Liste beschreibt die einzelnen Optionen:

SendInput ist der Standardmodus, der mit den oben genannten Optionen überschrieben werden kann. Anders als bei der SI-Option wird jedoch SendEvent anstelle von SendPlay verwendet, wenn SendInput nicht verfügbar ist.

T: Den Ersatztext im Text-Modus senden, d.h. jedes Zeichen via Zeichencode senden, ohne z.B. {Enter} in Enter, ^c in Strg+C usw. zu übersetzen und ohne jedes Zeichen in einen Tastendruck zu übersetzen. Diese Option wird automatisch für Hotstrings aktiviert, die einen Fortsetzungsbereich haben. Diese Option kann mit T0 oder R0 wieder deaktiviert oder mit R überschrieben werden.

X: Execute (Ausführen). Anstelle eines Ersatztextes akzeptiert der Hotstring einen Funktionsaufruf oder Ausdruck, den er ausführen soll. Zum Beispiel würde :X:~mb::MsgBox ein Mitteilungsfenster anzeigen, wenn der Benutzer "~mb" eingibt, anstatt diese Abkürzung automatisch mit "MsgBox" zu ersetzen. Das ist besonders für eine große Anzahl von Hotstrings nützlich, die Funktionen aufrufen, da sonst drei Zeilen pro Hotstring notwendig wären.

Diese Option sollte nicht mit der Hotstring-Funktion verwendet werden. Um beim Auslösen eines Hotstrings eine Funktion aufzurufen, übergeben Sie die Funktion per Referenz.

Z: Diese selten verwendete Option setzt den Hotstring-Erkenner jedes Mal zurück, wenn der Hotstring ausgelöst wird. Mit anderen Worten, das Skript wartet auf einen völlig neuen Hotstring und verwirft alles, was Sie zuvor eingegeben haben. Dadurch können unerwünschte Auslösungen von Hotstrings verhindert werden. Schauen Sie sich dazu das folgende Beispiel an:

:b0*?:11::
{
    Send "xx"
}

Wenn Sie mit diesem Beispiel drei aufeinanderfolgende Einsen (111) eingeben, wird der Hotstring zweimal ausgelöst, weil die mittlere 1 sowohl das letzte Zeichen der ersten Auslösung als auch das erste Zeichen der zweiten Auslösung ist. Wenn Sie vor b0 den Buchstaben Z einfügen, müssten Sie vier statt drei Einsen eingeben, um den Hotstring zweimal auszulösen. Mit Z0 kann diese Option wieder deaktiviert werden.

Lange Ersatztexte

Wenn der Ersatztext eines Hotstrings relativ lang ist, kann er via Fortsetzungsbereich in mehrere kurze Zeilen aufgeteilt werden, um die Übersichtlichkeit und Wartbarkeit des Skripts zu verbessern. Zum Beispiel:

::text1::
(
Der gesamte Text zwischen der oberen und unteren Klammer wird als direkt geschriebener Text behandelt.
Standardmäßig bleibt der Zeilenumbruch (Enter) zwischen der vorherigen und dieser Zeile erhalten.
    Standardmäßig bleibt die Einrückung (Tabulator) auf der linken Seite dieser Zeile erhalten.
)

Unter Fortsetzungsbereich erfahren Sie, wie Sie dieses Standardverhalten ändern können. Beachten Sie auch, dass ein Fortsetzungsbereich dazu führt, dass der Hotstring standardmäßig den Text-Modus verwendet. Die einzige Möglichkeit, dies zu überschreiben, besteht darin, bei jedem Hotstring mit einem Fortsetzungsbereich eine gegensätzliche Option anzugeben (z.B. :t0:text1:: oder :r:text2::).

Kontextabhängige Hotstrings

Mit der #HotIf-Direktive können bestimmte Hotstrings kontextabhängig gemacht werden. Solche Hotstrings können je nach Bedingung (z.B. Typ des aktiven Fensters) einen anderen Ersatztext senden, eine andere Aktion ausführen oder gar nichts tun. Zum Beispiel:

#HotIf WinActive("ahk_class Notepad")
::bzw::Dieser Ersatztext erscheint nur in Notepad.
#HotIf
::bzw::Dieser Ersatztext erscheint in einem anderen Fenster als Notepad.

AutoCorrect

Das folgende Skript verwendet Hotstrings zum automatischen Korrigieren von ca. 4700 häufig vorkommenden englischen Rechtschreibfehlern. Mit dem Hotkey Win+H können Sie weitere Rechtschreibfehler hinzufügen:

Download: AutoCorrect.ahk (127 KB)

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

Bemerkungen

Ausdrücke werden im Ersatztext aktuell nicht unterstützt. Um das zu umgehen, machen Sie solche Hotstrings nicht automatisch-ersetzend. Verwenden Sie stattdessen die Send-Funktion entweder im Körper des Hotstrings oder in Kombination mit der X-Option (Ausführen).

Um ein zusätzliches Leer- oder Tabulatorzeichen nach einem Ersatztext zu senden, fügen Sie die Escapesequenz `s oder `t am Ende des Ersatztextes ein, z.B. :*:bzw::beziehungsweise`s.

Bei einem automatisch-ersetzenden Hotstring, der nicht den Text- oder Raw-Modus verwendet, muss im Ersatztext ein alleinstehendes { oder eines, dem nur Leerraumzeichen vorangestellt sind, mit geschweiften Klammern umschlossen werden, z.B. :*:brace::{{} und :*:space_brace:: {{}. Andernfalls wird es als geschweifte Startklammer für die Funktion des Hotstrings interpretiert, um den One True Brace (OTB) Style zu unterstützen.

Standardmäßig setzt ein Links- oder Rechtsklick den Hotstring-Erkenner zurück. Mit anderen Worten, das Skript wartet auf einen völlig neuen Hotstring und verwirft alles, was Sie zuvor eingegeben haben (falls das unerwünscht ist, fügen Sie irgendwo im Skript die Zeile #Hotstring NoMouse ein). Dieses Zurücksetzen-bei-Mausklick-Verhalten ist standardmäßig aktiv, weil jeder Klick üblicherweise die Texteinfügemarke (Textcursor) verschiebt oder den Tastaturfokus auf ein neues Steuerelement/Feld setzt. In solchen Fällen ist es generell wünschenswert: 1) einen Hotstring auch dann auslösen zu können, wenn die Fragezeichenoption fehlt; 2) eine Auslösung zu verhindern, wenn Sie nach einem Mausklick etwas eingeben, das zufällig eine gültige Abkürzung aus der vorherigen Eingabe formt.

Der Hotstring-Erkenner prüft jedes Mal, wenn ein Zeichen eingegeben wird, das aktive Fenster und setzt sich zurück, wenn ein anderes als das vorherige Fenster aktiv ist. Wenn sich das aktive Fenster ändert, aber dann das vorherige Fenster wieder aktiv gemacht wird, bevor ein Zeichen eingegeben wurde, wird die Änderung nicht erkannt (aber der Hotstring-Erkenner könnte aus einem anderen Grund zurückgesetzt werden). Sie können den Hotstring-Erkenner auch mit Hotstring "Reset" zurücksetzen.

Die interne Variable A_EndChar enthält das Endungszeichen, mit dem Sie zuletzt einen nicht-automatisch-ersetzenden Hotstring ausgelöst haben. Wenn kein Endungszeichen notwendig war (wegen der *-Option), wird sie leer sein. A_EndChar ist nützlich bei der Erstellung von Hotstrings, die die Send-Funktion verwenden oder deren Verhalten davon abhängen soll, welches Endungszeichen Sie eingegeben haben. Mit SendText A_EndChar kann das Endungszeichen selbst gesendet werden (in diesem Fall SendText, weil das normale Send Zeichen wie !{} nicht korrekt senden würde).

Innerhalb von Hotstring-Definitionen müssen nur umgekehrte Häkchen und Semikolons, denen ein Leer- oder Tabulatorzeichen vorangestellt ist, mit einem Escapezeichen versehen werden. Alle anderen Zeichen können ohne Escapezeichen angegeben werden, inklusive einzelne Doppelpunkte, sofern ihnen kein Zweifach-Doppelpunkt-Separator vorangestellt ist. Eine vollständige Liste finden Sie unter Escapesequenzen.

Die Sonderzeichen der Send-Funktion wie {Enter} werden nur im Ersatztext von automatisch-ersetzenden Hotstrings unterstützt (sofern die Raw-Option nicht verwendet wird), nicht in der Abkürzung. Geben Sie stattdessen `n für Enter und `t (oder ein direkt geschriebenes Tabulatorzeichen) für Tab an (eine vollständige Liste finden Sie unter Escapesequenzen). Zum Beispiel würde der Hotstring :*:ab`t:: ausgelöst werden, wenn Sie "ab" gefolgt von einem Tabulatorzeichen eingeben.

Innerhalb von Hotstring-Definitionen werden Leer- und Tabulatorzeichen als direkt geschriebener Text behandelt. Zum Beispiel würden die folgenden Hotstrings zwei unterschiedliche Ergebnisse erzeugen: ::bzw::beziehungsweise und ::bzw:: :beziehungsweise.

Jede Abkürzung eines Hotstrings darf nicht länger als 40 Zeichen sein. Das Programm warnt Sie, wenn diese Länge überschritten wurde. Die Länge des Ersatztextes ist hingegen auf ca. 5000 Zeichen begrenzt, sofern der Send-Modus standardmäßig SendInput ist. Diese Einschränkung kann durch die Wahl eines anderen Send-Modus oder durch die Verwendung von SendPlay oder SendEvent entweder im Körper des Hotstrings oder in Kombination mit der X-Option (Ausführen) beseitigt werden.

Die Reihenfolge, in der die Hotstrings definiert werden, bestimmt ihre relative Priorität zueinander. Mit anderen Worten, wenn Ihre Eingabe mehr als einen Hotstring auslösen kann, wird nur der erste im Skript gelistete Hotstring ausgelöst. Siehe auch: Kontextabhängige Hotstrings.

Jedes von Ihnen durchgeführte Backspacing wird bei der Erkennung von Hotstrings berücksichtigt. Allerdings bewirken die Navigationstasten , , , , Bild↑, Bild↓, Pos1 und Ende, dass der Hotstring-Erkennungsprozess zurückgesetzt wird. Mit anderen Worten, der Erkennungsprozess wartet auf einen völlig neuen Hotstring.

Der Ersatztext könnte auch dann gesendet werden, wenn das aktive Fenster die Tastendrücke des Benutzers ignoriert. Das heißt, der Hotstring wird auch ohne sichtbare Eingabe der Abkürzung ausgelöst. Auch hier können Sie Backspace drücken, um den letzten Tastendruck rückgängig zu machen (auch wenn Sie den Effekt nicht sehen).

Die Funktion eines Hotstrings kann nur dann explizit vom Skript aufgerufen werden, wenn die Funktion benannt wurde. Siehe Benannte Funktions-Hotstrings.

Hotstrings werden weder überwacht noch während einer blockierten Eingabe durch einen unsichtbaren Input-Hook ausgelöst.

Standardmäßig können Hotstrings nicht durch Tastendrücke ausgelöst werden, die von einem AutoHotkey-Skript erzeugt wurden. Dadurch wird vermieden, dass eine Endlosschleife entsteht, in der sich Hotstrings immer wieder gegenseitig auslösen. Dieses Verhalten kann mit #InputLevel und SendLevel kontrolliert werden. Allerdings verwenden automatisch-ersetzende Hotstrings immer Sendlevel 0 und können daher niemals Hook-Hotkeys oder Hotstrings auslösen.

Hotstrings können dynamisch erstellt werden, z.B. mit der Hotstring-Funktion, die auch in der Lage ist, bestehende Hotstrings einzeln zu modifizieren, zu deaktivieren oder zu aktivieren.

In bestimmten Fällen ist InputHook flexibler als Hotstrings. Zum Beispiel sind damit unsichtbare Tastendrücke im aktiven Fenster (z.B. eines Videospiels) möglich. Außerdem werden zeichenlose Endungstasten wie Esc unterstützt.

Jedes Skript, das Hotstrings enthält, verwendet automatisch den Tastatur-Hook.

Hotstrings verhalten sich in einigen Punkten genauso wie Hotkeys:

Bekannte Einschränkung: Auf einigen Systemen können Hotstrings in Java-Anwendungen die Eingabe diakritischer Buchstaben (über tote Tasten) stören. Um das zu umgehen, schalten Sie Suspend vorübergehend ein (Suspend deaktiviert alle Hotstrings).

Benannte Funktions-Hotstrings

Wenn die Funktion eines Hotstrings aufgerufen werden soll, ohne den Hotstring selbst auszulösen, können Sie einem oder mehreren Hotstrings eine benannte Funktion zuweisen, indem Sie diese einfach unterhalb des Doppelpunktpaares definieren. Zum Beispiel:

; Zeigt auch die Implementierung von Groß-/Kleinschreibung-Anpassung.
:C:BZW::  ; Alles großgeschrieben.
:C:Bzw::  ; Nur den ersten Buchstaben großgeschrieben.
: :bzw::  ; In einer beliebig anderen Kombination geschrieben.
    bzw_an_schreibung_anpassen(hs) ; hs wird den Namen des Hotstrings enthalten, der die Funktion ausgelöst hat.
    {
        if (hs == ":C:BZW")
            Send "BEZIEHUNGSWEISE"
        else if (hs == ":C:Bzw")
            Send "Beziehungsweise"
        else
            Send "beziehungsweise"
    }

Wenn die Funktion bzw_an_schreibung_anpassen explizit vom Skript aufgerufen wird, muss dem ersten Parameter (hs) ein Wert übergeben werden.

Hotkeys können auch auf diese Weise definiert werden. Mehrere Hotkeys oder Hotstrings können vertikal gestapelt werden, um die gleiche Funktion aufzurufen.

Zwischen dem Hotstring und dem Funktionsnamen dürfen nur Leerraumzeichen oder Kommentare stehen.

Die Benennung einer Funktion begünstigt auch die Selbstdokumentation von Hotstrings, wie im obigen Code, wo der Funktionsname den Hotstring beschreibt.

Mit der Hotstring-Funktion kann einem Hotstring auch eine Funktion oder ein Funktionsobjekt zugewiesen werden.

Hotstring Helper

Schauen Sie sich das erste Beispiel im Beispielabschnitt der Hotstring-Seite an, welches für Vielnutzer von Hotstrings nützlich sein kann. Drücken Sie Win+H (oder einen anderen Hotkey Ihrer Wahl), um den aktuell markierten Text zu einem Hotstring zu machen. Wenn Sie z.B. in einem Textverarbeitungsprogramm "beziehungsweise" markieren und Win+H drücken, wird das Skript Sie auffordern, eine Abkürzung für diesen Text einzugeben (z.B. bzw), und dann den neuen Hotstring in das Skript einfügen und aktivieren.