Automatizaciones

Usa preajustes o tus propias reglas para cambiar el teclado mientras escribes, sin sustituir tu configuración guardada.

Las reglas de estado aplican ajustes temporales mientras se cumplen sus condiciones. Combina orientación, ancho de ventana, apariencia, idioma, distribución, propiedades del campo de texto, hora o estado declarado por un plugin. Elige si deben cumplirse todas las condiciones o cualquiera de ellas. Un contexto desconocido nunca satisface una condición negativa.

Las reglas de evento se ejecutan cuando se abre el teclado, cambia el idioma o una propiedad del campo, un plugin emite un evento o tocas un atajo. Los comandos se ejecutan una vez por evento. Los ajustes temporales duran hasta que se cierra el teclado, cambia la regla o borras las modificaciones de la sesión.

Tu configuración guardada es la base

Las reglas se aplican sobre tus ajustes guardados actuales. Arrástralas para cambiar la prioridad; prevalecen las últimas. Desactivar una regla retira sus cambios. Los ajustes que guardes siguen disponibles cuando termina una modificación temporal. Una acción de perfil es temporal y no selecciona ni reescribe tu perfil guardado.

El preajuste compacto usa filas de teclas de 28 puntos y el 80% del ancho guardado, dentro de los límites de tamaño existentes. Con la división activada, las teclas más pequeñas dejan más espacio entre las mitades y las mantienen cerca de los bordes. El modo de una mano conserva su alineación. Los porcentajes siempre parten del valor guardado y nunca se acumulan.

La vista previa usa el contexto de ejemplo que elijas. Muestra las condiciones que se cumplen, referencias no válidas y ajustes esperados sin ejecutar comandos. La vista previa de la app es independiente del teclado activo. Añade Automatizaciones a la barra superior para ver las modificaciones activas y ejecutar reglas mediante atajos.

Cuando ocurre un evento

Cuando ocurre un evento

  • keyboard.open
  • keyboard.close
  • keyboard.languageChanged
  • keyboard.layoutChanged
  • keyboard.profileChanged
  • keyboard.planeChanged
  • input.changed
  • time.minute
  • user.run

Acciones

  • panel.close
  • plane.letters
  • plane.numbers
  • plane.symbols
  • overrides.clear
  • panel.emoji
  • panel.calculator
  • panel.conversion
  • panel.layouts
  • panel.profiles

La evaluación ocurre mientras el teclado está activo. Las reglas horarias no se ejecutan en segundo plano y los eventos de cierre no están garantizados. Clink no puede identificar la app anfitriona ni cambiar ajustes de iOS. Las reglas conservan los requisitos de Membresía, Acceso total y toque del usuario de las funciones que usan. Importar no concede permisos.

El contrato del plugin

El objeto automation opcional de un archivo .clinkplugin declara eventos, estado, ajustes, comandos, preajustes y espacios para atajos. Cada aportación tiene un identificador estable, una versión de esquema exacta y títulos localizados. El anfitrión crea nombres con el formato plugin/<plugin-id>/<kind>/<id>. Un plugin no puede usar el espacio de nombres del sistema ni el de otro plugin.

El estado publicado, los datos de eventos y los argumentos de comandos admiten booleanos, números acotados y opciones declaradas. Los ajustes también admiten texto limitado. El estado y los ajustes usan claves del diccionario de estado existente del plugin. Los valores temporales se restauran antes de guardar. Los preajustes son reglas normales desactivadas que requieren una selección explícita.

Plugins ›

Hooks

HookCuándo se ejecuta
on_automation(command, args, state)on_automation(command, args, state) ejecuta un comando local aprobado en el entorno aislado existente. Puede actualizar el texto de la barra espaciadora, publicar estado declarado o emitir un evento declarado. Este hook no permite insertar texto, acceder al portapapeles, cambiar ajustes persistentes ni hacer peticiones externas.
automation_emit(name, payload)Emite un evento declarado con sus datos tipados. El anfitrión añade el espacio de nombres y las versiones de esquema del plugin; el script no puede atribuirse un gesto del usuario ni establecer el historial de la cadena de ejecución.
automation_publish(name, value)Publica un valor de estado declarado para las condiciones. Los valores desaparecen al terminar la sesión del teclado o cuando el plugin deja de estar disponible.
automation_run(slot)Llama desde el manejador de acción de un control nativo del plugin. El usuario vincula el espacio de atajo declarado a una regla en Automatizaciones. Un plugin no puede elegir la regla por su cuenta ni activar desde un temporizador un comando que requiera un toque.

Acciones

  • space_text
  • automation_emit
  • automation_publish

Un evento declarado y un comando seguro

Este fragmento de manifiesto va en el campo automation de un archivo de plugin normal. Su script publica si el teclado está listo, emite un evento y actualiza un texto. En el editor, selecciona ese evento, exige el estado ready y elige el comando caption. Leer este ejemplo no instala ni activa ningún plugin.

{
  "schemaVersion": 1,
  "events": [
    {
      "id": "ready",
      "title": {
        "en": "Keyboard ready"
      },
      "version": 1,
      "payload": [
        {
          "id": "ready",
          "key": "ready",
          "title": {
            "en": "Ready"
          },
          "version": 1,
          "type": "bool",
          "choices": [],
          "minimum": 0,
          "maximum": 100,
          "defaultValue": null
        }
      ]
    }
  ],
  "state": [
    {
      "id": "ready",
      "key": "ready",
      "title": {
        "en": "Ready"
      },
      "version": 1,
      "type": "bool",
      "choices": [],
      "minimum": 0,
      "maximum": 100,
      "defaultValue": null
    }
  ],
  "settings": [
    {
      "id": "show_caption",
      "key": "show_caption",
      "title": {
        "en": "Show caption"
      },
      "version": 1,
      "type": "bool",
      "choices": [],
      "minimum": 0,
      "maximum": 100,
      "defaultValue": true
    }
  ],
  "commands": [
    {
      "id": "caption",
      "title": {
        "en": "Refresh caption"
      },
      "version": 1,
      "arguments": [],
      "behavior": "localUI",
      "requiresUserGesture": false,
      "requiresFullAccess": false
    }
  ],
  "presets": [],
  "shortcuts": [
    "run"
  ]
}
def initial():
    return {"ready": False, "show_caption": True}

def on_open(state):
    state["ready"] = True
    automation_publish("ready", True)
    automation_emit("ready", {"ready": True})
    return state

def on_automation(command, args, state):
    if command == "caption":
        space_text("Clink" if state["show_caption"] else None)
    return state

def bar_items(state):
    return [bar_button("run", "Run automation", icon="bolt.circle")]

def on_action(action, value, state):
    if action == "run":
        automation_run("run")
    return state

Comparte reglas con conocimiento

Importa y exporta JSON desde Automatizaciones. Las reglas importadas están desactivadas, reciben nuevos identificadores y conservan sus referencias a temas, distribuciones y plugins. Debes restaurar las referencias que falten antes de ejecutar la regla. Las reglas son globales, con un ámbito de perfil opcional; se guardan por separado de las exportaciones de perfiles y la sincronización con iCloud.

{
  "schemaVersion": 1,
  "shortcutBindings": {},
  "rules": [
    {
      "id": "landscape-split",
      "name": "Landscape split",
      "enabled": false,
      "schemaVersion": 1,
      "kind": "state",
      "trigger": "keyboard.open",
      "triggerVersion": 1,
      "cooldownSeconds": 1,
      "conditions": {
        "mode": "all",
        "items": [
          {
            "id": "landscape",
            "field": "interface.orientation",
            "comparison": "equals",
            "value": "landscape",
            "upper": null,
            "hysteresis": 0,
            "version": 1
          }
        ]
      },
      "actions": [
        {
          "id": "split",
          "kind": "set",
          "target": "layout.split",
          "value": true,
          "version": 1
        }
      ]
    }
  ]
}

Esquema y límites

La versión 1 admite 128 reglas, 24 condiciones y 32 acciones por regla, con importaciones de hasta 1.048.576 bytes. El registro de ajustes ofrece 268 destinos y documenta 39 exclusiones. Los grupos de ajustes no válidos se rechazan completos; los comandos se detienen al primer fallo sin prometer deshacer lo anterior.

Las aportaciones eliminadas, desactivadas o incompatibles de un plugin dejan sus reglas dependientes sin disponibilidad. Los fallos y los tiempos de espera agotados desactivan la aportación afectada durante la sesión. Los comandos tienen un límite de 20.000 pasos y un tiempo breve de ejecución. Las colas acotadas, las pausas entre ejecuciones, los límites de cadena y la estabilización del estado impiden que los eventos repetidos se ejecuten indefinidamente.

Widgets

Clink incluye tres widgets de pantalla de inicio y una Live Activity: un selector de perfiles, tus estadísticas de escritura, dictado rápido y la propia sesión de dictado.

Los widgets leen directamente el archivo de ajustes compartido, así que siguen funcionando con la app cerrada.

App Intents

Hoy se incluyen dos intents, y ninguno abre la app. Switch Keyboard Profile reescribe los ajustes compartidos desde el widget, y un teclado que ya esté en pantalla recoge el cambio al instante. End Dictation alcanza la sesión del micrófono desde la Live Activity, iniciando la app en segundo plano si hace falta.

Cambiar a un perfil creado por ti necesita Membresía, y esa comprobación también se hace dentro del widget. Los perfiles que trae Clink son gratis.

Clink no define frases propias de Atajos, así que no hay nada que decir en voz alta.

Abrir archivos

Clink registra sus tipos de archivo en iOS, así que Archivos, AirDrop, Mensajes y cualquier hoja de compartir ofrecen abrirlos en Clink.

Descargar en el App Store