Der Vertrag
Eine Aktion definiert transform(text). Was sie zurückgibt, wird zu Text und dort eingefügt, wo du schreibst.
def transform(text):
return text.upper()Gib None zurück, um nichts einzufügen. Für einen schnellen Versuch setze stattdessen eine Variable result auf oberster Ebene, statt eine Funktion zu definieren.
Woher der Text kommt
| Eingabe | Was die Aktion bekommt |
|---|---|
| Nichts | Erzeugt Text von Grund auf. transform(""). |
| Aktuelles Wort | Übergibt das Wort, das du gerade tippst, an transform(text). |
| Auswahl | Übergibt den markierten Text – oder nichts, wenn nichts markiert ist. |
| Aktuelle Zeile | Übergibt die Zeile, in der der Cursor steht. |
| Aktueller Satz | Übergibt den Satz, in dem der Cursor steht. |
| Text vor dem Cursor | Übergibt alles vor dem Cursor. |
| Text nach dem Cursor | Übergibt alles nach dem Cursor. |
| Ganzes Feld | Übergibt das ganze Feld, auf beiden Seiten des Cursors. |
| Zwischenablage | Übergibt den Text aus der Zwischenablage. Benötigt Vollzugriff. |
Eingabe ersetzen entscheidet, ob die Ausgabe an die Stelle der Eingabe tritt. Es gilt für jede Quelle, die das Feld liest. Nichts und Zwischenablage haben im Dokument nichts zu ersetzen – ihre Ausgabe wird also immer eingefügt.
def transform(text):
words = len(text.split())
return f"{words} words"Die Tastatur bitten
Eine Aktion kann dieselben Befehle verwenden wie ein Panel, statt eine einzelne Zeichenkette zurückzugeben. So macht eine Aktion mehrere Änderungen – oder lässt den Cursor an einer bestimmten Stelle stehen.
def transform(text):
replace(len(text), "(" + text + ")")
move_cursor(-1)toast() und close() gehören zu Panels: Eine Aktion hat keine eigene Fläche, auf der eine Meldung erscheinen könnte. In der Konsole beim Schreiben tauchen beide trotzdem auf.
Die Sprache
Skripte laufen auf Clinks eigenem Interpreter statt auf CPython. Er liest eine brauchbare Teilmenge von Python – Comprehensions, Lambdas, Tupel, Mengen, f-String-Formate, try und except – und lehnt den Rest mit einer Meldung ab, die die Zeile nennt.
Typen
intfloatstrboolNonelisttupledictset
Schlüsselwörter
ifelifelsewhileforindefreturnbreakcontinuepassTrueFalseNoneandornotlambdatryexceptfinallyraiseimportfromasisdelglobal
Eingebaute Funktionen
lenstrreprprintintfloatboolabsroundminmaxsumrangesortedreversedlistdictsettupleenumeratezipordchranyalltypemapfilterdivmodpowhexbinoctformatisinstancecallable
String-Methoden
upperlowercasefoldtitlecapitalizeswapcasestriplstriprstripreplacesplitrsplitsplitlinesjoinstartswithendswithfindrfindindexrindexcountpartitionrpartitionzfillljustrjustcenterisdigitisnumericisalphaisalnumisspaceisupperisloweristitleremoveprefixremovesuffixformat
Listen-Methoden
appendextendpopinsertremoveindexcountsortreverseclearcopy
Dictionary-Methoden
keysvaluesitemsgetpoppopitemsetdefaultupdateclearcopy
Set-Methoden
adddiscardremovepopclearcopyupdateunionintersectiondifferencesymmetric_differenceissubsetissupersetisdisjoint
Tupel-Methoden
countindex
Methoden eines Regex-Treffers
groupgroupsgroupdictstartendspan
Ausnahmen
ExceptionValueErrorTypeErrorKeyErrorIndexErrorNameErrorZeroDivisionErrorAttributeErrorRuntimeErrorStopIteration
Abgelehnt
classwithnonlocalassertyieldasyncawaitmatch
Namensräume
Diese Namensräume lassen sich importieren, sonst nichts. Jeder rechnet nur: Es gibt kein Dateisystem, kein Netzwerk und keinen Prozess, an den ein Skript herankäme.
import json
dumpsloads
import math
acosasinatanatan2ceilcombcopysigncosdegreeseexpfabsfactorialfloorfmodgcdhypotinfisfiniteisinfisnanlcmloglog10log2nanpipowprodradianssinsqrttantautrunc
import random
choicechoicesrandintrandomrandrangesampleseedshuffleuniform
import re
DOTALLIIGNORECASEMMULTILINESescapefindallfinditerfullmatchmatchsearchsplitsubsubn
import sys
version
import time
formatmonotonicpartstime
import re
def transform(text):
return re.sub(r"\s+", " ", text).strip()Die Engine für reguläre Ausdrücke ist Clinks eigene und verbraucht dasselbe Schrittbudget wie der Rest deines Skripts – ein Muster, das sonst ewig liefe, endet also mit einem Fehler statt mit einer Tastatur, die nicht mehr reagiert. Rückwärtsverweise und Lookaround gibt es nicht.
Warum nicht CPython
Eine Tastaturerweiterung hat eine harte Speichergrenze, und iOS beendet sie ohne Vorwarnung, sobald sie überschritten ist. Eine vollständige Python-Laufzeit passt nicht neben die Tastatur, deshalb bringt Clink einen kleinen Interpreter mit, der für die Aufgabe geschrieben wurde: keine Imports, keine Dateien, kein Netzwerk, und ein Schrittbudget, das dem entlaufenen Skript ein Ende setzt und nicht der Tastatur.
print geht in die Konsole im Editor, nie in das, was du schreibst.