자동화

프리셋이나 직접 만든 규칙으로 저장된 설정을 바꾸지 않고 입력 중 키보드를 조정하세요.

상태 규칙은 조건이 맞는 동안 임시 설정을 적용합니다. 화면 방향, 창 너비, 모양, 언어, 배열, 입력 필드 속성, 시간 또는 플러그인이 선언한 상태를 조합할 수 있습니다. 모든 조건이 필요한지, 하나만 맞으면 되는지 선택하세요. 알 수 없는 컨텍스트는 부정 조건을 충족한 것으로 취급하지 않습니다.

이벤트 규칙은 키보드가 열릴 때, 언어나 입력 필드 속성이 바뀔 때, 플러그인이 이벤트를 보낼 때 또는 단축키를 탭할 때 실행됩니다. 명령은 이벤트마다 한 번 실행됩니다. 임시 설정은 키보드를 닫거나 규칙을 바꾸거나 세션의 덮어쓰기를 지울 때까지 유지됩니다.

저장된 설정이 언제나 기준

규칙은 현재 저장된 설정 위에 적용됩니다. 드래그해 우선순위를 바꿀 수 있으며 뒤에 있는 규칙이 우선합니다. 규칙을 끄면 그 규칙의 변경 사항이 사라집니다. 임시 덮어쓰기가 끝나도 새로 저장한 설정은 남습니다. 프로필 동작은 임시로 적용되며 저장된 프로필을 선택하거나 다시 쓰지 않습니다.

컴팩트 프리셋은 기존 크기 제한 안에서 키 행 높이를 28포인트, 너비를 저장된 값의 80%로 설정합니다. 분할을 켜면 작아진 키만큼 양쪽 사이의 공간이 넓어지고 키는 화면 가장자리 가까이에 유지됩니다. 한 손 모드는 자체 정렬을 유지합니다. 비율은 항상 저장된 값을 기준으로 하며 반복해서 누적되지 않습니다.

미리보기는 직접 선택한 예시 컨텍스트를 사용합니다. 명령을 실행하지 않고 일치하는 조건, 잘못된 참조, 예상 설정을 보여 줍니다. 앱의 미리보기는 실제 키보드 상태와 별개입니다. 상단 바에 자동화를 추가하면 적용 중인 덮어쓰기를 보고 단축키 규칙을 실행할 수 있습니다.

이벤트가 발생할 때

이벤트가 발생할 때

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

동작

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

키보드가 활성화되어 있을 때 조건을 평가합니다. 시간 규칙은 백그라운드에서 실행되지 않으며 종료 이벤트도 보장되지 않습니다. Clink는 호스트 앱을 식별하거나 iOS 설정을 바꿀 수 없습니다. 사용하는 기능의 멤버십, 전체 접근 및 사용자 탭 요구 사항은 규칙에도 그대로 적용됩니다. 가져오기로 권한이 부여되지는 않습니다.

플러그인 계약

.clinkplugin 파일의 선택적 automation 객체에서 이벤트, 상태, 설정, 명령, 프리셋, 단축키 슬롯을 선언합니다. 각 기능에는 고정 ID, 정확히 일치해야 하는 스키마 버전, 현지화된 제목이 있습니다. 호스트가 plugin/<plugin-id>/<kind>/<id> 형식의 이름을 만듭니다. 플러그인은 코어나 다른 플러그인의 이름 공간을 사용할 수 없습니다.

공개 상태, 이벤트 데이터 및 명령 인수는 불리언, 범위가 정해진 숫자, 선언된 선택지를 받습니다. 설정에는 길이가 제한된 텍스트도 사용할 수 있습니다. 상태와 설정은 기존 플러그인 상태 딕셔너리의 키를 사용합니다. 임시 값은 저장 전에 복원됩니다. 프리셋은 일반적인 꺼진 규칙이며 명시적으로 선택해야 합니다.

플러그인 ›

실행 시점
on_automation(command, args, state)on_automation(command, args, state)는 기존 샌드박스에서 허용된 로컬 명령을 실행합니다. 스페이스 바 문구를 갱신하거나 선언된 상태를 공개하거나 선언된 이벤트를 보낼 수 있습니다. 이 훅에서는 텍스트 삽입, 클립보드 접근, 영구 설정 변경, 외부 요청이 허용되지 않습니다.
automation_emit(name, payload)선언된 이벤트를 타입이 지정된 데이터와 함께 보냅니다. 호스트가 플러그인 이름 공간과 스키마 버전을 추가합니다. 스크립트는 사용자 제스처나 실행 체인의 이력을 직접 지정할 수 없습니다.
automation_publish(name, value)조건에 사용할 선언된 상태 값 하나를 공개합니다. 키보드 세션이 끝나거나 플러그인을 사용할 수 없게 되면 값이 사라집니다.
automation_run(slot)플러그인 네이티브 컨트롤의 동작 핸들러에서 호출하세요. 사용자가 자동화에서 선언된 단축키 슬롯을 규칙에 연결합니다. 플러그인은 몰래 규칙을 선택하거나 타이머를 통해 탭이 필요한 명령을 실행할 수 없습니다.

동작

  • space_text
  • automation_emit
  • automation_publish

선언된 이벤트와 안전한 명령

이 매니페스트 조각은 일반 플러그인 파일의 automation 필드에 넣습니다. 스크립트는 키보드 준비 상태를 공개하고 이벤트를 보내며 문구를 갱신합니다. 편집기에서 해당 이벤트를 선택하고 ready 상태를 조건으로 지정한 뒤 caption 명령을 고르세요. 이 예시를 읽는 것만으로 플러그인이 설치되거나 활성화되지는 않습니다.

{
  "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

내용을 확인하고 규칙 공유하기

자동화에서 JSON을 가져오고 내보낼 수 있습니다. 가져온 규칙은 꺼진 상태로 새 식별자를 받으며 테마, 배열, 플러그인 참조를 유지합니다. 없는 참조는 규칙을 실행하기 전에 복구해야 합니다. 규칙은 전역으로 적용되며 필요하면 프로필로 범위를 제한할 수 있습니다. 프로필 내보내기 및 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
        }
      ]
    }
  ]
}

스키마와 제한

버전 1은 규칙 128개, 규칙당 조건 24개와 동작 32개를 지원하며 가져오기 크기는 최대 1,048,576바이트입니다. 설정 레지스트리는 대상 268개와 문서화된 제외 항목 39개를 제공합니다. 잘못된 설정 묶음은 전체가 거부됩니다. 명령은 첫 실패에서 멈추며 이전 효과를 되돌린다고 보장하지 않습니다.

플러그인 기능이 삭제되거나 꺼지거나 호환되지 않으면 관련 규칙을 사용할 수 없습니다. 충돌과 시간 초과는 해당 세션 동안 문제의 기능을 비활성화합니다. 명령에는 20,000단계와 짧은 실행 시간 제한이 있습니다. 제한된 큐, 실행 간격, 체인 길이 제한, 상태 안정화로 이벤트의 무한 반복을 방지합니다.

위젯

Clink에는 홈 화면 위젯 셋과 실시간 액티비티 하나가 있습니다. 프로필 전환기, 입력 통계, 빠른 받아쓰기, 그리고 받아쓰기 세션 자체입니다.

위젯은 공유 설정 파일을 바로 읽으므로 앱이 닫혀 있어도 계속 동작합니다.

App Intents

지금은 두 개가 있고, 둘 다 앱을 열지 않습니다. Switch Keyboard Profile는 위젯에서 공유 설정을 고쳐 쓰고, 이미 떠 있는 키보드가 그 변화를 곧바로 받아들입니다. End Dictation는 실시간 액티비티에서 마이크 세션에 닿으며, 필요하면 앱을 백그라운드로 띄웁니다.

직접 만든 프로필로 바꾸려면 멤버십이 필요하고, 이 확인은 위젯 안에서도 이루어집니다. Clink가 함께 제공하는 프로필은 무료입니다.

Clink는 자체 단축어 문구를 정의하지 않으므로 소리 내어 부를 명령은 없습니다.

파일 열기

Clink는 자기 파일 형식을 iOS에 등록해 두므로 파일, 에어드롭, 메시지, 어떤 공유 시트에서든 Clink로 열 수 있습니다.

App Store에서 다운로드