El contrato
Una acción define transform(text). Lo que devuelva se convierte en texto y se inserta donde estás escribiendo.
def transform(text):
return text.upper()Devuelve None para no insertar nada. Para una prueba rápida, asigna una variable result en el nivel superior en lugar de definir una función.
De dónde sale el texto
| Entrada | Qué recibe la acción |
|---|---|
| Nada | Genera texto desde cero. transform(""). |
| Palabra actual | Pasa la palabra que estás escribiendo a transform(text). |
| Selección | Pasa el texto que tengas seleccionado, o nada si no hay selección. |
| Línea actual | Pasa la línea en la que está el cursor. |
| Frase actual | Pasa la frase en la que está el cursor. |
| Texto antes del cursor | Pasa todo lo que hay antes del cursor. |
| Texto después del cursor | Pasa todo lo que hay después del cursor. |
| Todo el campo | Pasa el campo completo, a ambos lados del cursor. |
| Portapapeles | Pasa el texto del portapapeles. Requiere acceso total. |
Reemplazar la entrada decide si la salida ocupa el lugar de lo que entró. Vale para toda fuente que lea el campo. Nada y Portapapeles no tienen nada que reemplazar en el documento, así que su salida siempre se inserta.
def transform(text):
words = len(text.split())
return f"{words} words"Pedirle algo al teclado
Una acción puede usar los mismos comandos que un panel, en lugar de devolver una sola cadena. Así es como una acción hace más de una edición, o deja el cursor en un sitio concreto.
def transform(text):
replace(len(text), "(" + text + ")")
move_cursor(-1)toast() y close() son cosa de los paneles: una acción no tiene superficie propia donde mostrar un mensaje. Aun así, ambos aparecen en la consola mientras la escribes.
El lenguaje
Los scripts corren en el intérprete propio de Clink, no en CPython. Lee un subconjunto útil de Python: comprensiones, lambdas, tuplas, conjuntos, formatos de f-string, try y except. Rechaza el resto con un mensaje que nombra la línea.
Tipos
intfloatstrboolNonelisttupledictset
Palabras clave
ifelifelsewhileforindefreturnbreakcontinuepassTrueFalseNoneandornotlambdatryexceptfinallyraiseimportfromasisdelglobal
Funciones integradas
lenstrreprprintintfloatboolabsroundminmaxsumrangesortedreversedlistdictsettupleenumeratezipordchranyalltypemapfilterdivmodpowhexbinoctformatisinstancecallable
Métodos de cadena
upperlowercasefoldtitlecapitalizeswapcasestriplstriprstripreplacesplitrsplitsplitlinesjoinstartswithendswithfindrfindindexrindexcountpartitionrpartitionzfillljustrjustcenterisdigitisnumericisalphaisalnumisspaceisupperisloweristitleremoveprefixremovesuffixformat
Métodos de lista
appendextendpopinsertremoveindexcountsortreverseclearcopy
Métodos de diccionario
keysvaluesitemsgetpoppopitemsetdefaultupdateclearcopy
Métodos de conjunto
adddiscardremovepopclearcopyupdateunionintersectiondifferencesymmetric_differenceissubsetissupersetisdisjoint
Métodos de tupla
countindex
Métodos de coincidencia regex
groupgroupsgroupdictstartendspan
Excepciones
ExceptionValueErrorTypeErrorKeyErrorIndexErrorNameErrorZeroDivisionErrorAttributeErrorRuntimeErrorStopIteration
Rechazado
classwithnonlocalassertyieldasyncawaitmatch
Espacios de nombres
Se pueden importar estos espacios de nombres y nada más. Cada uno solo calcula: no hay sistema de archivos, ni red, ni proceso al que un script pueda llegar.
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()El motor de expresiones regulares es el propio de Clink y gasta el mismo presupuesto de pasos que el resto del script: un patrón que si no tardaría una eternidad acaba en un error, no en un teclado que deja de responder. No hay retrorreferencias ni lookaround.
Por qué no CPython
Una extensión de teclado tiene un techo de memoria estricto, y iOS la cierra sin avisar cuando lo supera. Un runtime completo de Python no cabría junto al teclado, así que Clink incluye un intérprete pequeño escrito para la tarea: sin importaciones, sin archivos, sin red y con un presupuesto de pasos que termina con el script desbocado en lugar de con el teclado.
print va a la consola del editor, nunca a lo que estás escribiendo.