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

EntradaQué recibe la acción
NadaGenera texto desde cero. transform("").
Palabra actualPasa la palabra que estás escribiendo a transform(text).
SelecciónPasa el texto que tengas seleccionado, o nada si no hay selección.
Línea actualPasa la línea en la que está el cursor.
Frase actualPasa la frase en la que está el cursor.
Texto antes del cursorPasa todo lo que hay antes del cursor.
Texto después del cursorPasa todo lo que hay después del cursor.
Todo el campoPasa el campo completo, a ambos lados del cursor.
PortapapelesPasa 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"
Leyendo el texto anterior al cursor con Reemplazar entrada desactivado, esto añade un recuento.

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)
Poner la palabra entre paréntesis y volver dentro del paréntesis.

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

  • int
  • float
  • str
  • bool
  • None
  • list
  • tuple
  • dict
  • set

Palabras clave

  • if
  • elif
  • else
  • while
  • for
  • in
  • def
  • return
  • break
  • continue
  • pass
  • True
  • False
  • None
  • and
  • or
  • not
  • lambda
  • try
  • except
  • finally
  • raise
  • import
  • from
  • as
  • is
  • del
  • global

Funciones integradas

  • len
  • str
  • repr
  • print
  • int
  • float
  • bool
  • abs
  • round
  • min
  • max
  • sum
  • range
  • sorted
  • reversed
  • list
  • dict
  • set
  • tuple
  • enumerate
  • zip
  • ord
  • chr
  • any
  • all
  • type
  • map
  • filter
  • divmod
  • pow
  • hex
  • bin
  • oct
  • format
  • isinstance
  • callable

Métodos de cadena

  • upper
  • lower
  • casefold
  • title
  • capitalize
  • swapcase
  • strip
  • lstrip
  • rstrip
  • replace
  • split
  • rsplit
  • splitlines
  • join
  • startswith
  • endswith
  • find
  • rfind
  • index
  • rindex
  • count
  • partition
  • rpartition
  • zfill
  • ljust
  • rjust
  • center
  • isdigit
  • isnumeric
  • isalpha
  • isalnum
  • isspace
  • isupper
  • islower
  • istitle
  • removeprefix
  • removesuffix
  • format

Métodos de lista

  • append
  • extend
  • pop
  • insert
  • remove
  • index
  • count
  • sort
  • reverse
  • clear
  • copy

Métodos de diccionario

  • keys
  • values
  • items
  • get
  • pop
  • popitem
  • setdefault
  • update
  • clear
  • copy

Métodos de conjunto

  • add
  • discard
  • remove
  • pop
  • clear
  • copy
  • update
  • union
  • intersection
  • difference
  • symmetric_difference
  • issubset
  • issuperset
  • isdisjoint

Métodos de tupla

  • count
  • index

Métodos de coincidencia regex

  • group
  • groups
  • groupdict
  • start
  • end
  • span

Excepciones

  • Exception
  • ValueError
  • TypeError
  • KeyError
  • IndexError
  • NameError
  • ZeroDivisionError
  • AttributeError
  • RuntimeError
  • StopIteration

Rechazado

  • class
  • with
  • nonlocal
  • assert
  • yield
  • async
  • await
  • match

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

  • dumps
  • loads

import math

  • acos
  • asin
  • atan
  • atan2
  • ceil
  • comb
  • copysign
  • cos
  • degrees
  • e
  • exp
  • fabs
  • factorial
  • floor
  • fmod
  • gcd
  • hypot
  • inf
  • isfinite
  • isinf
  • isnan
  • lcm
  • log
  • log10
  • log2
  • nan
  • pi
  • pow
  • prod
  • radians
  • sin
  • sqrt
  • tan
  • tau
  • trunc

import random

  • choice
  • choices
  • randint
  • random
  • randrange
  • sample
  • seed
  • shuffle
  • uniform

import re

  • DOTALL
  • I
  • IGNORECASE
  • M
  • MULTILINE
  • S
  • escape
  • findall
  • finditer
  • fullmatch
  • match
  • search
  • split
  • sub
  • subn

import sys

  • version

import time

  • format
  • monotonic
  • parts
  • time
import re

def transform(text):
    return re.sub(r"\s+", " ", text).strip()
Reducir las tandas de espacios con una expresión regular.

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.

Compartir

Acción de compartir crea un archivo .clinkext, e Importar acción lo recupera con un id nuevo. Una acción se mantiene por debajo de 48.000 bytes y tiene que definir def transform(.

Creador ›
Descargar en el App Store