Automasi
Objek automation pilihan dalam fail .clinkplugin mengisytiharkan acara, keadaan, tetapan, arahan, pratetap dan slot pintasan. Setiap sumbangan mempunyai ID tetap, versi skema yang tepat dan tajuk setempat. Hos membentuk nama plugin/<plugin-id>/<kind>/<id>. Pemalam tidak boleh menggunakan ruang nama teras atau ruang nama pemalam lain.
Automasi ›Cara plugin berfungsi
Panel menggantikan kekunci, dan tindakan berjalan sekali pada sebahagian teks. Plugin tidak mempunyai skrin sendiri pada papan kekunci. Clink memanggil fungsinya pada saat tertentu, contohnya apabila papan kekunci dibuka atau apabila anda selesai menaip perkataan, dan plugin boleh mengemas kini bar ruang atau keadaan tersimpannya sendiri. Tetapannya dipaparkan dalam aplikasi menggunakan pembina yang sama seperti panel. WPM Spacebar di bawah ialah plugin yang lengkap.
def initial():
return {"on": False}
def settings(state):
return section("keys.spacebar", [
toggle("Show typing speed", state["on"], action="toggle"),
], title="WPM Spacebar")
def on_action(action, value, state):
state["on"] = value
if value:
claim("spacebar.text")
else:
release("spacebar.text")
space_text(None)
return state
def on_word(word, state):
if state["on"]:
space_text(f"{stats()['wpm']} wpm")
return statePlugin memerlukan Clink Pro. Sebelum memasang plugin daripada repositori, Clink meminta anda membenarkan kod daripada repositori itu, sama seperti untuk panel dan tindakan.
on_key dan on_word menerima apa yang anda taip, kerana begitulah cara pengira perkataan berfungsi. PyMini tiada akses rangkaian atau fail, jadi plugin tidak dapat menghantar apa yang anda taip melalui internet, dan data yang disimpannya kekal dalam Clink pada peranti anda.
Plugin pertama anda
Cara paling cepat ialah skrip permulaan yang ditulis aplikasi untuk anda. Ia meletakkan suis di bawah Kekunci > Bar ruang dan, semasa suis hidup, mengira perkataan pada bar ruang. Lima langkah, tiada fail untuk dimuat turun.
- Buka tab Plugin, hidupkan plugin di bahagian atas, dan ketik + untuk plugin baharu.
- Editor dibuka pada skrip permulaan. Baca sekali: initial(), settings(), on_action(), on_open() dan on_word() ialah keseluruhannya.
- Tukar ke Pratonton. Hidupkan suis, kemudian ketik on_open dan on_word beberapa kali dan perhatikan tiruan bar ruang dan konsol.
- Simpan. Plugin hidup dalam senarai, dan suisnya kini juga berada di bawah Kekunci > Bar ruang.
- Buka papan kekunci di mana-mana dan taip. Bar ruang mengira bersama.
def initial():
return {"on": False, "words": 0}
def settings(state):
return section("keys.spacebar", [
toggle("Count words on the space bar", state["on"], action="toggle"),
], title="Word count")
def on_action(action, value, state):
if action == "toggle":
state["on"] = value
if value:
claim("spacebar.text")
else:
release("spacebar.text")
space_text(None)
return state
def on_open(state):
state["words"] = 0
if state["on"]:
space_text("0 words")
return state
def on_word(word, state):
state["words"] += 1
if state["on"]:
space_text(f"{state['words']} words")
return stateCangkuk
Takrifkan mana-mana daripada 33 fungsi ini dan tinggalkan yang tidak diperlukan. Setiap satu menerima state sebagai argumen terakhir. Yang bertindak balas kepada sesuatu memulangkan state, sama ada diubah atau tidak. Yang menjawab soalan (elements, draw, effects, cangkuk rupa, haptics, hitboxes, suggestions dan correct) memulangkan jawapannya, dan masih boleh mengubah state di tempatnya.
| Cangkuk | Bila ia berjalan |
|---|---|
on_automation(command, args, state) | on_automation(command, args, state) menjalankan arahan setempat yang diluluskan dalam kotak pasir sedia ada. Ia boleh mengemas kini tulisan pada bar ruang, menerbitkan keadaan yang diisytiharkan atau mengeluarkan acara yang diisytiharkan. Hook ini tidak membenarkan penyisipan teks, akses papan klip, perubahan tetapan kekal atau permintaan luar. |
initial() | Sekali, sebelum ada sebarang keadaan tersimpan. Pulangkan dict berisi apa sahaja yang boleh disimpan oleh JSON. |
settings(state) | Apabila tetapan plugin dipaparkan dalam aplikasi. Pulangkan kawalannya sebagai pokok nod. Ia tidak pernah berjalan dalam papan kekunci. |
on_action(action, value, state) | Apabila salah satu kawalan plugin digunakan. on_action(action, state), tanpa value, juga berfungsi. |
on_open(state) | Apabila papan kekunci muncul. Tempat yang sesuai untuk membaca stats() atau menetapkan bar ruang. |
on_close(state) | Apabila papan kekunci ditutup. Keadaan disimpan sejurus selepas itu. |
on_key(key, state) | Setiap kali kekunci menaip sesuatu. Ini berjalan pada setiap ketukan kekunci, jadi pastikan ia pantas. |
on_word(word, state) | Apabila perkataan selesai, sama ada melalui ruang, cadangan atau leretan. |
on_backspace(state) | Apabila kekunci backspace ditekan. Ia tidak menerima teks, hanya keadaan. |
on_suggestion(word, state) | Apabila cip cadangan diketik. word ialah yang diketik. |
on_language(code, state) | Apabila bahasa menaip bertukar. code ialah bahasa baharu, seperti en atau de. |
on_field(kind, state) | Apabila papan kekunci menyambung ke medan. kind ialah default, email, url, number, phone, password atau search. |
on_tick(state) | Sekali sesaat selagi papan kekunci kelihatan, sama ada anda menaip atau tidak. Cangkuk untuk apa-apa yang mesti berubah sendiri: jam, kira detik, atau kadar yang patut jatuh ke sifar apabila anda berhenti. |
on_swipe(direction, state) | Kuis yang bermula pada kekunci huruf: "left", "right", "up", "up_left" atau "up_right". Kuis hanya dibaca apabila taipan leret dimatikan. Jika cangkuk tidak meminta apa-apa, kuis kekal sebagai ketukan biasa; jika ia meminta sesuatu, huruf tempat kuis bermula ditarik balik dahulu. |
elements(state) | Apa yang plugin ini tawarkan kepada susun atur tersuai. Kembalikan entri element(id, name, icon=, width=), atau tinggalkan cangkuk ini. |
draw(id, state) | Wajah satu elemen, sebagai pepohon nod. Berjalan lebih kurang sekali sesaat selagi papan kekunci kelihatan. |
effects(state) | Kesan cahaya yang ditawarkan plugin ini kepada halaman Kesan. Kembalikan entri light_effect(...), atau tinggalkan cangkuk ini. |
key_styles(state) | Gaya kekunci untuk editor tema. Pulangkan entri key_style(...); lihat Rupa di bawah. |
themes(state) | Tema lengkap untuk tab Plugin dalam editor tema. Pulangkan entri theme(...). |
popups(state) | Gaya pop timbul kekunci. Pulangkan entri popup_style(...). |
animations(state) | Animasi: apa-apa campuran entrance(...), press_animation(...), letter_animation(...) dan transition(...). |
backgrounds(state) | Latar beranimasi. Pulangkan entri background(...) yang dibina daripada lapisan particles(...). |
layouts(state) | Susun atur papan kekunci. Pulangkan entri layout(...). |
trails(state) | Jejak leretan yang ditawarkan plugin ini kepada pemilih jejak. Pulangkan entri trail(...); lihat Rupa di bawah. |
haptics(state) | Satu haptik bagi setiap kekunci, sebagai dict daripada nama kekunci kepada rasa. Dibaca apabila papan kekunci dibuka dan kira-kira sekali sesaat. |
hitboxes(state) | Satu kawasan sentuh bagi setiap kekunci, sebagai dict daripada nama kekunci kepada hitbox(...). Dibaca pada rentak yang sama dengan haptics. |
on_touch(key, x, y, state) | Selepas setiap ketikan: kekunci yang menerimanya, dan di mana pada kekunci itu jari mendarat. x dan y bermula dari -0.5 hingga 0.5, dengan 0 di tengah. |
suggestions(word, state) | Perkataan untuk bar cadangan semasa word sedang ditaip. Berjalan setiap kali bar menjadi tenang, bukan pada setiap kekunci. |
correct(word, fix, state) | Ruang baru sahaja menamatkan word. Pulangkan perkataan untuk dimasukkan sebagai ganti, False untuk mengekalkannya seperti yang ditaip, atau None supaya pembetulan papan kekunci sendiri kekal. |
bar_items(state) | Butang dan tombol yang ditawarkan plugin ini kepada bar atas. Pulangkan entri bar_button(...) dan bar_knob(...), atau tinggalkan cangkuk ini. |
key_art(state) | Lukisan untuk dicat pada kekunci, sebagai dict daripada nama kekunci kepada bentuk. Dibaca semula selepas setiap peristiwa yang didengari plugin, jadi keadaan yang diubah dalam sesuatu cangkuk terus kelihatan pada kekunci. |
events(state) | Nama peristiwa yang mahu didengari on_event, dibaca sekali semasa plugin dimuatkan. Tanpa cangkuk ini, plugin mendengar semuanya kecuali peristiwa yang kerap. |
on_event(name, info, state) | Satu cangkuk untuk segala yang berlaku: open, close, word, backspace, suggestion, language, field, shift dan plane, serta key, key_down, key_up, predictions dan tick yang kerap, yang perlu diminta mengikut nama dalam events(state). |
def on_key(key, state):
if key == " " and setting("language") == "en":
state["spaces"] = state.get("spaces", 0) + 1
return state
def on_close(state):
haptic("light")
return stateAplikasi dan papan kekunci berkongsi satu salinan keadaan. Hidupkan suis dalam aplikasi dan suis itu hidup apabila papan kekunci dibuka seterusnya. Apa sahaja yang dikira oleh papan kekunci ada di situ apabila anda membuka tetapan plugin itu nanti. Papan kekunci menyimpan keadaan apabila ditutup, bukan selepas setiap kekunci.
Cadangan semasa pada bar ruang
Baca cadangan utama yang dipaparkan melalui context()["suggestion"]. Langgan peristiwa predictions untuk menerima perubahan dalam info["suggestion"]. Kedua-duanya memerlukan akses kepada data penaipan. on_suggestion berjalan selepas cadangan diterima, bukan apabila ramalan berubah. Panggil space_text(value or None) untuk menetapkan label atau memulihkannya apabila tiada cadangan. Ini mengubah label sahaja, bukan tindakan bar ruang.
def initial():
return {}
def events(state):
return ["predictions"]
def on_open(state):
space_text(context()["suggestion"] or None)
return state
def on_event(name, info, state):
if name == "predictions":
space_text(info["suggestion"] or None)
return state
def on_close(state):
space_text(None)
return stateKeadaan
Keadaan ialah satu dict. initial() membinanya pada kali pertama; selepas itu setiap cangkuk mendapat dict yang sama, mengubahnya, dan memulangkannya. Ia menyimpan apa sahaja yang JSON boleh simpan: nombor, rentetan, senarai, dict bersarang. Aplikasi menyimpannya selepas setiap kawalan yang anda gunakan, papan kekunci semasa ditutup, dan kedua-duanya membaca fail yang sama, jadi ia tidak pernah lama bercanggah.
def initial():
return {"session": 0, "total": 0, "longest": ""}
def on_open(state):
state["session"] = 0 # starts over each time the keyboard opens
return state
def on_word(word, state):
state["session"] += 1
state["total"] += 1 # survives, it is saved when the keyboard closes
if len(word) > len(state["longest"]):
state["longest"] = word
return state
def settings(state):
return vstack([
text(f"{state['total']:,} words so far"),
text(f"Longest: {state['longest'] or '...'}", size=13, color="gray"),
button("Start over", "reset", style="destructive"),
])
def on_action(action, value, state):
if action == "reset":
return initial()
return stateMemulangkan state ialah tabiat yang baik, tetapi tidak wajib: dict itu rujukan, jadi mengubahnya di tempat juga berfungsi. Pulangkan dict lain, seperti initial() di atas, dan itu menjadi keadaan.
Tetapan dan bahagian
settings(state) memulangkan pokok nod yang dibina dengan pembina panel: text, toggle, slider, stepper, segmented, button, row, field dan susun atur. Ia dipaparkan pada halaman plugin dalam tab Plugin. Bungkus sebahagiannya dalam section(anchor, children, title) dan bahagian itu turut dipaparkan pada salah satu skrin tetapan Clink sendiri, di sebelah tetapan yang berkaitan.
def settings(state):
return vstack([
text("Counts words as you type.", size=13),
section("keys.spacebar", [
toggle("Count on the space bar", state["on"], action="toggle"),
stepper(state["goal"], min=10, max=500, step=10, label="Goal", key="goal"),
], title="Word count"),
])Kawalan yang paling kerap diperlukan plugin. Setiap satu sama ada menulis nilai baharunya ke dalam keadaan di bawah key, atau menamakan action untuk on_action, atau kedua-duanya. Senarai pembina penuh, termasuk susun atur, ada di halaman panel.
| Pembina | Apa yang dilukis |
|---|---|
toggle(label, on=False, key="", action="") | Satu suis. key menulis True atau False ke dalam kunci keadaan itu. |
slider(value, min=0, max=100, step=1, label="", key="", action="") | Peluncur antara min dan max. key menulis kedudukannya ke dalam kunci keadaan itu. |
stepper(value, min=0, max=100, step=1, label="", key="", action="") | Satu nilai dengan − dan + di sebelahnya, antara min dan max. |
segmented(options, value=None, key="", action="") | Satu pilihan daripada senarai. key menulis pilihan itu ke dalam kunci keadaan. |
field(key, placeholder="", action="", submit="") | Kotak teks yang terikat pada state[key]. Mengetiknya mengalihkan kekunci ke kunci itu; submit menamakan pengendali yang dijalankan oleh Return. |
button(label, action="", value=None, insert="", set=None, style="plain", icon="", enabled=True) | Satu butang. insert menaip teksnya ke dalam apa yang sedang anda tulis, set menggabungkan kunci ke dalam keadaan, dan action menamakan pengendali untuk on_action. style menerima plain, primary, tinted, quiet atau destructive. |
row(title, subtitle="", detail="", icon="", action="", value=None, insert="") | Baris yang boleh diketik: tajuk, baris kedua, ikon, dan butiran di sebelah kanan. |
text(s, size=17, weight="regular", color="", align="leading", lines=0, mono=False) | Satu baris teks. weight menerima regular, medium, semibold, bold, heavy, light atau thin; align menerima leading, center atau trailing; lines mengehadkan bilangan baris; color menerima nama warna atau #RRGGBB. |
Ke mana bahagian pergi
Sauh ialah ID kad pada salah satu skrin tetapan Clink sendiri. Namakannya dalam section() dan kawalan plugin dilukis tepat di bawah kad itu, dengan nama plugin di atasnya. Cara paling mudah untuk mencarinya: dalam aplikasi, buka Lagi > Pembangun dan hidupkan Tunjukkan ID. Setiap kad mendapat lencana maklumat kecil yang menamakan ID-nya dan menyalinnya apabila diketik; halaman menunjukkan ID mereka pada bar tajuk.
Setiap sauh yang boleh dinamakan bahagian
analytics.heatmapanalytics.privacyanalytics.trendsanalytics.typing-testautomations.rulesgestures.accentsgestures.cursorgestures.deletegestures.generalgestures.suggestionsgestures.swipehaptics.feelkeys.adaptivekeys.faceskeys.hitboxeskeys.hitmapkeys.long-presskeys.numberrowkeys.onehandedkeys.roundnesskeys.sizekeys.spacebarkeys.spacingkeys.splitlanguages.applanguages.customlanguages.managelanguages.packslanguages.switchlanguages.typinglayout.arrangelayout.arrangementlayout.buildlayout.longpresslayout.presetslayout.topbarmotion.deletemotion.entrancemotion.glowmotion.key-pressmotion.key-responsemotion.lettersmotion.space-responsemotion.transitionpopups.stylesound.keysoundstext.automationtext.contenttext.correctionstext.historytext.punctuationtext.speedtext.suggestionstext.symbolsthemes.backgroundthemes.canvasthemes.theme
keys.spacebar mempunyai tempatnya sendiri, pada skrin Bar ruang itu sendiri. Bahagian dengan sauh yang tiada dalam senarai ini masih dipaparkan pada halaman plugin, jadi kesilapan taip merugikan anda satu kad, bukan plugin itu.
Pengambilalihan
Apabila plugin mengendalikan salah satu tetapan Clink sendiri, orang itu patut melihatnya, dan kedua-duanya tidak patut bertelagah. claim(control) menyatakan plugin memilikinya: aplikasi menamakan plugin pada kad tetapan itu, dan medan teks bar ruang dikunci selagi ia dipegang. release(control) memulangkannya. Ambil alih dalam on_action yang menghidupkan ciri anda, lepaskan dalam yang mematikannya, dan tetapkan nilai kembali kepada None atau nilai lamanya pada masa yang sama. Plugin yang dimatikan dalam senarai melepaskan semua yang dipegangnya.
def on_action(action, value, state):
if action == "toggle":
state["on"] = value
if value:
claim("spacebar.text")
space_text("...")
else:
release("spacebar.text")
space_text(None) # hand the person's own text back
return stateDua plugin boleh mengambil alih kawalan yang sama; aplikasi menamakan yang mengambil alih terakhir. Pengambilalihan direkodkan oleh aplikasi, jadi ambil alih daripada on_action, yang berjalan di situ. Pengambilalihan yang dibuat dalam papan kekunci tidak diingati.
Arahan dan bacaan
Plugin boleh menggunakan semua arahan panel, serta enam arahan dan dua bacaan khusus untuknya. Arahan dimasukkan ke dalam baris gilir dan dilaksanakan selepas fungsi anda kembali, jadi tiada apa-apa pada papan kekunci berubah di tengah-tengah panggilan. Bacaan memulangkan nilai seperti keadaannya sejurus sebelum panggilan.
| Panggilan | Apa yang dilakukan |
|---|---|
space_text(text) | Memaparkan kapsyen pada bar ruang, sehingga 32 aksara. Hantar None untuk kembali kepada teks bar ruang pengguna sendiri. |
space_language_text(text) | Menggantikan lencana bahasa di sudut bar ruang, dengan sendirinya dan walaupun lencana asal dimatikan. Satu baris, sehingga 12 aksara; "" menyembunyikannya dan None memulangkan teks asal. |
space_language_flag(language) | Meletakkan bendera pada lencana itu bagi sesuatu id bahasa seperti en_GB, daripada seni bendera yang disertakan. None memulangkan kelakuan asal. |
space_language_emoji(language) | Lencana yang sama sebagai emoji bendera wilayah itu. Ketiga-tiga arahan lencana berkongsi satu tempat, jadi menghidupkan satu plugin lencana mematikan yang lain. |
set_setting(name, value) | Menukar satu tetapan Clink mengikut nama kepada nilai jenis yang betul: boolean, nombor dalam julatnya, salah satu pilihannya atau teks. Nama yang tidak dikenali menimbulkan KeyError. Nilai jenis yang salah atau di luar julat tidak digunakan, dan konsol editor menyatakan apa yang dijangka tetapan itu. |
claim(control) | Mengambil alih satu tetapan Clink sendiri. Kadnya dalam aplikasi menamakan plugin yang memegangnya. |
release(control) | Memulangkan tetapan itu. Mematikan plugin akan melepaskan semua yang diambil alih olehnya. |
suggest(words) | Meletakkan sehingga sepuluh perkataan anda sendiri di hadapan bar cadangan. Ia kekal sehingga satu diketik, padam ditekan atau medan bertukar, dan suggest([]) mengosongkannya lebih awal. Mengetik satu akan menaipnya. |
banner(text) | Menunjukkan mesej ringkas pada papan kekunci seketika. Untuk isyarat, bukan untuk perbualan. |
press(key) | Menjalankan salah satu kekunci papan kekunci sendiri seolah-olah ia diketik: "space" atau "delete". Nama lain menimbulkan ValueError. |
pick_suggestion(slot) | Mengambil cadangan di bahagian "left", "center" atau "right" bar, sama seperti mengetiknya. Bagi bar yang ditatal, yang dikira ialah apa yang kelihatan pada skrin. Di dalam on_swipe, pilihan dibuat daripada bar seperti keadaannya ketika jari mula menyentuh. |
stats() | Memulangkan dict dengan wpm, peak_wpm, keystrokes, words dan streak. wpm dikemas kini secara langsung semasa plugin hidup. Jumlah keseluruhan datang daripada Analitik dan berhenti dikemas kini jika Analitik dimatikan. |
setting(name) | Membaca salah satu tetapan yang disenaraikan di bawah mengikut nama. Nama lain akan menimbulkan KeyError. |
context() | Petikan keadaan yang sama seperti yang dibaca panel, ditambah suggestion, shift (off, on atau locked) dan plane bagi sesuatu plugin. Akses data menaip itulah yang mengisi kunci dokumen; shift kekal boleh dibaca tanpanya. |
| Kunci | Kandungan |
|---|---|
stats()["wpm"] | Perkataan seminit bagi beberapa saat terakhir, dikira daripada aksara yang sampai ke medan. Ia muncul sesaat dua selepas anda mula, turun semasa anda berhenti sekejap, dan mencapai 0 apabila anda berhenti. Memadam tidak pernah menambahnya. |
stats()["peak_wpm"] | Kadar terbaik yang pernah direkodkan oleh Analitik. |
stats()["keystrokes"] | Kekunci yang ditekan, sepanjang masa, seperti yang dikira Analitik. |
stats()["words"] | Perkataan yang disahkan, sepanjang masa. |
stats()["streak"] | Hari berturut-turut menaip, berakhir hari ini. |
setting(name) dan set_setting(name, value) berkongsi satu senarai nama, dan claim(control) juga menerima mana-mana daripadanya. Boolean dibaca sebagai True atau False, nombor sebagai nombor, pilihan sebagai id-nya. Senarai itu sengaja panjang: plugin boleh bertindak balas kepada, atau mengendalikan, hampir semua yang boleh ditetapkan seseorang dalam aplikasi.
Nama yang diterima oleh setting()
analyticsemoji.skin_toneemoji.trailing_spacegestures.cursorgestures.cursor_stylegestures.highlight_shiftgestures.plane_slidegestures.predictive_flickgestures.quick_accentgestures.swipegestures.swipe_deletegestures.swipe_multi_wordgestures.swipe_space_commitgestures.swipe_two_thumbgestures.trailgestures.trail_stylegestures.trail_widthhaptics.enabledhaptics.intensityhaptics.sharpnesskeys.accentskeys.glyph_scalekeys.heightkeys.long_press_hintkeys.popup_stylekeys.popupskeys.radiuskeys.row_spacingkeys.spacingkeys.uppercasekeys.widthlanguagelanguage.bar_keylanguage.bar_key_stylelanguage.modelayoutlayout.dismiss_shortcutlayout.number_rowlayout.number_row_scalelayout.one_handedlayout.one_handed_shortcutlayout.one_handed_sidelayout.one_handed_widthlayout.splitlayout.split_gaplayout.split_number_rowlayout.split_shortcutlayout.split_space_barpet.cornerpet.enabledpet.speciessettings.accentHoldDelaysettings.accentMoveCancelsettings.activateWithIconsettings.adaptiveGrowsettings.adaptiveHitboxessettings.adaptivePredictAtWordStartsettings.adaptivePredictionWeightsettings.adaptiveShrinksettings.adaptiveSpacesettings.aiAutocorrectsettings.aiCompletionssettings.aiExtensionEnabledsettings.aiSearchsettings.aiToolsColorOverridessettings.aiToolsDiffStylesettings.aiToolsDisabledsettings.aiToolsLayoutStylesettings.aiToolsOrdersettings.aiToolsPromptOverridessettings.aiTranslatesettings.alternatingSplitsettings.arabicIndicNumeralssettings.backgroundEffectOverridesettings.clipboardCloseOnPastesettings.clipboardDeleteOnPastesettings.clipboardIgnoreImagessettings.clipboardIgnorePinsOnDeletesettings.clipboardStylesettings.cursorActivationHapticsettings.cursorLineStridesettings.cursorStepHapticsettings.customPanelsStandalonesettings.customPetIDsettings.deleteWordSwipeEngagesettings.deleteWordSwipeStridesettings.dictationAssistsettings.dictationAssistCustomsettings.dictationAssistLevelsettings.dictationColorSchemesettings.dictationGlassCapsulesettings.dictationSmartActionssettings.dictationStylesettings.dictationVisualStylesettings.dragUpThresholdsettings.emojiCategoryOrdersettings.emojiCellSpacingsettings.emojiColumnCountsettings.emojiCrossAxisSwitchesTabsettings.emojiCustomSetssettings.emojiGlyphScalesettings.emojiHiddenCategoriessettings.emojiHiddenFromPanelssettings.emojiRecentsCapsettings.emojiRecentsSortsettings.emojiRememberCategorysettings.emojiRowCountsettings.emojiScrollDirectionsettings.emojiSearchSlotsettings.emojiShowABCKeysettings.emojiShowBackspaceKeysettings.emojiStartCategoryIDsettings.emojiTabBarSlotsettings.emojiTabIconStylesettings.emojiToneHoldDelaysettings.extensionOrdersettings.extraTopBarssettings.formFreeCornerssettings.formLayoutEnabledsettings.gifShareAsLinksettings.glassPerRowMergesettings.glassReleaseResponsesettings.gridSwitchAnimationsettings.gridSwitchDurationsettings.handwritingInkColorsettings.handwritingInkGlowsettings.handwritingInkStylesettings.handwritingInkWidthsettings.hitboxScalesettings.iconPickerStylesettings.keyBloomScalesettings.keyLightingsettings.keyPressGlowsettings.keyPressInstantsettings.keyPressLingersettings.keySpringDampingsettings.keySpringResponsesettings.keyboardBottomPaddingsettings.keyboardLanguagessettings.keyboardTopPaddingsettings.longPressGlyphScalesettings.minPressVisiblesettings.notepadBrowseStylesettings.notepadModesettings.numberRowFontSizesettings.numberRowLeadingKeyssettings.numberRowTrailingKeyssettings.oneHandedCustomKeyssettings.oneHandedExtraKeyssettings.panelButtonHitboxScalesettings.persistentLeadingKeyssettings.persistentTrailingKeyssettings.petIdleMotionsettings.petScalesettings.pinyinFuzzyEnabledsettings.pluginLookssettings.popupSpringDampingsettings.popupSpringResponsesettings.predictiveFlickSuggestionPositionsettings.predictiveFlickSuggestionsSeparatesettings.reduceEffectsOnLowPowersettings.repeatAccelStepsettings.repeatHoldDelaysettings.repeatInitialIntervalsettings.repeatMinIntervalsettings.replacementsLayoutsettings.rowInsetssettings.secondaryNeuralModelsEnabledsettings.separateActivationsettings.separateLanguageLayoutssettings.showCaptureOverlaysettings.showCorrectionFieldsettings.showHitboxOverlaysettings.showIconsBeforeTypingsettings.showRecentEmojisettings.showTouchHeatmapsettings.showTouchSurfaceBoundssettings.showTouchTelemetryOverlaysettings.slideUpPickerStylesettings.solidPopupOpacitysettings.soundVoicesettings.spaceBloomScalesettings.spaceCursorActivationDelaysettings.spaceCursorDragScalesettings.spaceCursorStridesettings.spaceLeanMultipliersettings.spaceSpringDampingsettings.spaceSpringResponsesettings.spatialBiasEnabledsettings.spatialBiasGainsettings.splitIndicessettings.splitOtherPlanessettings.stickerGridSnapsettings.stickerPlacementssettings.suggestionDebounceDelaysettings.suggestionHitboxScalesettings.suggestionSegmentLiquidGlasssettings.suggestionSegmentStylesettings.suggestionSegmentsFollowThemesettings.suggestionSeparatorColorsettings.suggestionSeparatorStylesettings.suggestionTopPaddingsettings.swipeKeyMorphsettings.swipeMorphRadiussettings.swipeMorphStrengthsettings.swipeTrailEndWidthsettings.swipeTrailMaxLengthsettings.swipeTrailStartWidthsettings.swipeTrailTrimsettings.toolsButtonStylesettings.toolsHiddenFromPanelssettings.topBarItemssettings.topBarOrdersettings.translateLanguageOrdersettings.translateLanguagesDisabledsettings.translateStylesettings.translateTonesettings.vietnameseInputMethodsound.enabledsound.packsound.volumespacebar.cornerspacebar.language_codespacebar.sizespacebar.textstickers.enabledtext.arithmetictext.auto_capitalizetext.auto_punctuationtext.autocorrecttext.autocorrect_everywheretext.contactstext.conversionstext.double_space_periodtext.learningtext.punctuation_spacingtext.return_to_letterstext.revert_on_deletetext.smart_quotestext.suggestionstext.suggestions_animationtext.suggestions_heighttext.suggestions_scrolltext.suggestions_stylethemetheme.backgroundtheme.darktheme.delete_glyphtheme.entrancetheme.glyph_presstheme.lighttheme.match_systemtheme.press_styletheme.reactive_backgroundtools.calculatortools.clingtools.clipboardtools.conversiontools.dictationtools.dictionarytools.emojitools.giftools.handwritingtools.layout_switchertools.notepadtools.plugin_switchertools.profilestools.replacementstools.textfxtools.theme_switchertools.translate
Arahan
insert()backspace()delete_word()replace()move_cursor()copy()close()haptic()toast()
Seperti view() dalam panel, settings() sepatutnya hanya menerangkan kawalan. Arahan yang dipanggil daripadanya diabaikan dan dicatat dalam konsol.
Contoh
Lima plugin kecil, setiap satu lengkap. Tampal satu ke dalam plugin baharu, simpan, dan ia berjalan.
def initial():
return {"on": True}
def settings(state):
return section("keys.spacebar", [
toggle("Language on the space bar", state["on"], action="toggle"),
], title="Language badge")
def on_action(action, value, state):
if action != "toggle":
return state
state["on"] = value
if value:
claim("spacebar.text")
space_text(setting("language").upper())
else:
release("spacebar.text")
space_text(None)
return state
def on_open(state):
if state["on"]:
space_text(setting("language").upper())
return state
def on_language(code, state):
if state["on"]:
space_text(code.upper())
return stateSHORTCUTS = {"omw": "on my way", "brb": "be right back", "ty": "thank you"}
def on_key(key, state):
if key != " ":
return state
words = context()["before"].split()
if words and words[-1] in SHORTCUTS:
# the space is already in the text, so it goes too and comes back after
replace(len(words[-1]) + 1, SHORTCUTS[words[-1]] + " ")
return statedef initial():
return {"goal": 200, "count": 0}
def settings(state):
return vstack([
stepper(state["goal"], min=50, max=2000, step=50, label="Words per session", key="goal"),
progress(state["count"], total=state["goal"], label=f"{state['count']} of {state['goal']}"),
])
def on_open(state):
state["count"] = 0
return state
def on_word(word, state):
state["count"] += 1
if state["count"] == state["goal"]:
haptic("medium")
banner("Goal reached")
return statedef initial():
return {"muted": False, "was_on": True}
def on_field(kind, state):
# a password or a number field is not a place for key sounds
quiet = kind in ("password", "number", "phone")
if quiet and not state["muted"]:
state["was_on"] = setting("sound.enabled")
state["muted"] = True
set_setting("sound.enabled", False)
elif not quiet and state["muted"]:
state["muted"] = False
if state["was_on"]:
set_setting("sound.enabled", True)
return stateNAMES = ["sam", "ana", "team"]
def on_key(key, state):
typing = context()["before"].split(" ")[-1]
if typing.startswith("@"):
start = typing[1:].lower()
suggest([n for n in NAMES if n.startswith(start)])
state["showing"] = True
elif state.get("showing"):
suggest([]) # the mention is over, give the bar back
state["showing"] = False
return statedef on_swipe(direction, state):
if direction == "left":
delete_word()
elif direction == "right":
press("space") # the space bar's own path, so it autocorrects
elif direction == "up":
pick_suggestion("center")
elif direction == "up_left":
pick_suggestion("left")
elif direction == "up_right":
pick_suggestion("right")
return stateElemen dalam susun atur
Susun atur tersuai dibina daripada kekunci dan elemen: jalur emoji terkini, baris digit, pad kursor. Plugin boleh menambah miliknya sendiri. elements(state) menyatakan apa yang ditawarkan dan draw(id, state) melukisnya, jadi sebuah kekunci boleh menunjukkan apa sahaja yang plugin boleh kira: graf kelajuan menaip, jam, kira detik, atau penunjuk bateri anda sendiri.
Dua cangkuk membina satu. elements(state) menyenaraikan apa yang anda tawarkan, satu entri bagi setiap elemen, dan aplikasi membacanya untuk mengisi palet editor susun atur. draw(id, state) diberi salah satu id itu dan memulangkan apa yang hendak dilukis. Sebuah plugin boleh menawarkan beberapa; draw ditanya setiap satu mengikut namanya.
| Panggilan | Apa yang dilakukan |
|---|---|
element(id, name, icon="", width=2) | Satu elemen yang ditawarkan. width dikira dalam lebar kekunci, seperti susun atur mengiranya, dan icon ialah SF Symbol yang ditunjukkan editor pada paletnya. |
sparkline(values, min=None, max=None, fill=False) | Satu garis melalui siri nombor, memenuhi ruang yang diberi. Tinggalkan min dan max dan ia muat dengan nilainya sendiri. Hanya plugin boleh melukisnya, dan ia dibuat untuk sebuah kekunci. |
POINTS = 30
def initial():
return {"history": []}
def elements(state):
return [element("sparkline", "WPM sparkline", icon="waveform.path.ecg", width=3)]
def on_tick(state):
history = state["history"]
history.append(stats()["wpm"])
state["history"] = history[-POINTS:]
return state
def draw(id, state):
rate = state["history"][-1] if state["history"] else 0
return hstack([
sparkline(state["history"], min=0, max=max(60, max(state["history"] or [0])), fill=True),
text(f"{rate}", size=12, weight="semibold"),
], spacing=5, align="center")Wajah elemen ialah pepohon nod, seperti halaman tetapan, tetapi kekunci bukan halaman tetapan: hanya nod yang melukis digunakan, dan apa-apa yang boleh diketik diabaikan. Kekunci itu sudah milik susun atur, jadi tiada tempat untuk butang di dalamnya.
APA YANG BOLEH DILUKIS
sparklinetextbadgeiconprogresshstackvstackspacerdivider
Ukur ia untuk sebuah kekunci. width dikira dalam lebar kekunci: 1 ialah satu huruf dan 3 lebih kurang satu pertiga baris, dan penggunanya boleh mengubah saiznya kemudian. Teks mendapat satu baris dan mengecil supaya muat; warna mengikut warna teks kekunci secara lalai, jadi elemen sepadan dengan kekunci di sekelilingnya melainkan anda minta yang lain. Sparkline menyimpan 120 titik terakhirnya, lebih daripada yang boleh ditunjukkan sebuah kekunci.
import time
def elements(state):
return [element("clock", "Clock", icon="clock", width=2)]
def draw(id, state):
return text(time.format("HH:mm"), size=15, weight="semibold")GOAL = 200
def initial():
return {"words": 0}
def elements(state):
return [element("goal", "Word goal", icon="target", width=2)]
def on_open(state):
state["words"] = 0
return state
def on_word(word, state):
state["words"] += 1
return state
def draw(id, state):
return vstack([
text(f"{state['words']}/{GOAL}", size=11),
progress(state["words"], total=GOAL),
], spacing=2)Elemen tinggal dalam susun atur tersuai, jadi ada susun atur untuk dibina dahulu. Pratetap tidak boleh memuatkannya: mencabangkan pratetap menjadi susun atur anda sendiri ialah perkara pertama yang ditawarkan editor.
- Pasang plugin dan hidupkannya. Elemennya muncul sebaik sahaja anda berbuat demikian.
- Buka Susun Atur, cipta atau cabangkan susun atur tersuai, dan pergi ke Atur.
- Ketik Elemen, pilih elemen plugin daripada jalur itu, dan tetapkan lebarnya.
Pratonton editor melukis setiap elemen yang ditawarkan skrip, lebih kurang sebesar kekunci yang akan memuatkannya, di bawah model bar ruang. Simpan dan letakkannya sekali, dan papan kekunci melukis benda yang sama.
Elemen hanya menunjukkan apa yang dilukis plugin: mengetiknya tidak melakukan apa-apa, kerana kekunci itu sudah milik susun atur. Susun atur menyimpan elemen itu walaupun pluginnya dimatikan atau dibuang, dan kekunci terisi semula apabila plugin kembali.
Butang dan tombol pada bar atas
Jalur di atas kekunci disusun di Susun Atur > Bar Atas, dan plugin boleh menawarkan kawalannya sendiri untuk jalur itu. bar_items(state) memulangkannya: bar_button(...) untuk sesuatu yang diketuk, bar_knob(...) untuk sesuatu yang dipusing. Senarai itu dibaca apabila papan kekunci dibuka dan sekali lagi selepas setiap ketukan, jadi satu item boleh datang dan pergi mengikut keadaan plugin.
| Panggilan | Apa yang dilakukan |
|---|---|
bar_items(state) | Segala yang ditawarkan plugin ini kepada bar, sebagai senarai. Sesuatu id hanya perlu unik dalam plugin itu; bar menyimpannya di sebelah id plugin sendiri. id yang berulang mengekalkan yang pertama, dan item yang tidak lagi dipulangkan oleh cangkuk itu tidak lagi dilukis. |
bar_button(id, name, icon="", title="") | Sebuah butang. name ialah apa yang disenaraikan oleh penyunting dan apa yang dibaca VoiceOver. icon ialah SF Symbol dan title ialah label sehingga 12 aksara di sebelahnya: dengan ikon tanpa title, ikon berdiri sendiri; tanpa ikon, teks yang berdiri sendiri. Butang tidak mempunyai nilai mahupun julat. Satu ketukan memanggil on_action(id, None, state), dan segala yang dilakukannya berlaku di situ. |
bar_knob(id, name, icon="", min=0, max=1, step=0, value=0, setting=None, art=None, rotor=None) | Sebuah tombol. min dan max ialah julatnya, step membuatnya melangkah apabila lebih besar daripada sifar, dan value ialah tempat ia bermula. Sebaliknya, setting= mengikatnya pada salah satu kawalan nombor app itu sendiri, yang kemudian membekalkan julat dan kedudukannya. art= dan rotor= melukisnya dalam Python. |
def initial():
return {"width": 2.0}
def bar_items(state):
return [
bar_button("sig", "Sign off", icon="signature", title="Sign off"),
bar_knob("volume", "Key volume", icon="speaker.wave.2", setting="sound.volume"),
bar_knob("width", "Trail width", icon="scribble", min=1, max=6, step=0.5, value=state["width"]),
]
def on_action(action, value, state):
if action == "sig":
insert(" sent from Clink")
elif action == "width":
state["width"] = value
return stateKedua-duanya kembali melalui on_action(action, value, state), dikenali melalui id item, jadi item bar sesuatu plugin dan kawalan tetapannya berkongsi satu cangkuk. Ketukan menghantar None. Tombol menghantar nilainya pada setiap deten selagi jari masih turun dan sekali lagi apabila dilepaskan, jadi plugin boleh mengikuti seretan itu atau menunggu nilai terakhir.
Tombol dengan setting= memusingkan nilai yang app sudah ada, dinamakan daripada senarai Arahan dan bacaan di atas, seperti sound.volume atau haptics.intensity. Nama yang app tidak kenal menjadi KeyError dalam konsol. Julat dan kedudukan permulaan datang daripada kawalan itu, salinan papan kekunci sendiri berubah sambil anda menyeret supaya ketukan berikutnya sudah berada pada aras baharu, dan nilainya disimpan apabila dilepaskan. Tombol kelantangan atau haptik yang dinaikkan daripada sifar turut menghidupkan semula bunyi atau haptik sepanjang seretan itu, supaya setiap deten didengar dan dirasai semasa naik; menyimpan suis itu ialah kerja set_setting plugin sendiri di dalam on_action.
Tombol boleh dilukis dalam Python. art= ialah bahagian yang kekal diam, bezel atau badannya, dan rotor= ialah muka yang berpusing, dari -135 darjah pada minimum hingga +135 darjah pada maksimum. Kedua-duanya menerima bentuk, warna, kecerunan dan bayang yang sama seperti seni kekunci, sehingga enam belas bentuk setiap satu, dan unit="key" menskalakan koordinat kepada dail segi empat sama itu, di mana penunjuk pada y negatif menghala ke atas. Lukisan itu diberi warna teks bar sebagai "text" dan warna penegas tema sebagai "accent". Tinggalkan kedua-duanya dan tombol itu menjadi cincin dengan ikon di dalamnya; penyunting juga boleh memberikan sebarang kemasan terbina dalam kepada tombol yang sudah berada di bar.
Tiada apa-apa yang sampai ke bar itu dengan sendirinya. Item diletakkan dengan tangan, sama seperti menu dan cadangan.
- Pasang plugin dan hidupkannya. Item barnya muncul serta-merta.
- Buka Susun Atur > Bar Atas.
- Tambah butang atau tombol plugin itu dan seret ke tempatnya. Tombol pula boleh dipilihkan kemasannya.
Pembina melangkau kata kunci yang tidak dikenalinya, tanpa ralat. setting=, min=, max=, step=, value=, art= dan rotor= milik bar_knob sahaja, jadi bar_button yang diberi salah satunya tetap dibina sebagai butang biasa dan tiada apa-apa diberitahu: kerja butang tempatnya di dalam on_action. Sebaliknya title= milik butang, dan tombol melangkaunya.
Kesan cahaya
Plugin boleh menambah pencahayaan kekuncinya sendiri. effects(state) memulangkan entri light_effect(...), dan setiap satu muncul dalam apl di bawah Kesan > Daripada pemalam, di sebelah gaya terbina dalam dan kesan yang dibina sendiri oleh pengguna. Kesan ialah data, bukan lukisan: timbunan lapisan yang dianimasikan sendiri oleh papan kekunci. Jadi tiada apa-apa dalam skrip berjalan setiap bingkai, dan permukaan kekunci, huruf, cahaya, kilauan ketika ditekan dan tidur ketika melahu semuanya berfungsi seperti gaya terbina dalam.
| Panggilan | Apa yang dilakukan |
|---|---|
light_effect(id, name, layers=[...], colors=[], icon="") | Satu kesan. id hanya perlu unik dalam plugin. layers ialah senarai light_layer(...), dikenakan dari atas ke bawah. colors ialah sehingga lapan rentetan "#rrggbb" yang dilalui warna secara berulang; tanpanya, kesan mengikut tetapan Warna pengguna. |
light_layer(pattern, ...) | Satu lapisan: corak daripada senarai di bawah. Setiap kata kunci adalah pilihan. |
COLORS = ["#00e5ff", "#7c4dff", "#ff4081"]
def effects(state):
return [
light_effect("tide", "Tide", colors=COLORS, layers=[
light_layer("solid", low=0.2, high=0.2),
light_layer("wave", moves="both", speed=0.8, size=1.5,
direction="up"),
]),
]Corak
solidpulsewavegradienttwinklesweeprainflickerchecker
| Kunci | Apa yang dilakukan |
|---|---|
moves="light" | Apa yang diubah oleh corak: "light" untuk kecerahan, "color", atau "both". |
mix="add" | Bagaimana kecerahannya bergabung dengan lapisan di atas: "add", "max" untuk mengekalkan yang lebih terang, atau "multiply" untuk meredupkannya seperti topeng. |
shape="smooth" | Naik turun pulse, wave dan gradient: "smooth", "ramp", "step" atau "spike". |
direction="right" | Arah pergerakan wave, gradient, sweep dan rain: "right", "left", "down", "up", atau "out" dari tengah. |
speed=1 | Dari 0 hingga 4. Pada 0 corak itu kekal diam. |
size=1 | Dari 0.25 hingga 4: berapa kali corak berulang merentasi papan kekunci. Bagi twinkle ia menetapkan berapa banyak kekunci menyala, bagi sweep panjang ekornya. |
low=0, high=1 | Kecerahan yang dilalui corak, setiap satu dari 0 hingga 1. low yang lebih tinggi daripada high menterbalikkannya. |
color_span=1, color_offset=0 | Sejauh mana corak bergerak merentasi warna, dan di mana ia bermula, setiap satu dari 0 hingga 1. |
def effects(state):
return [
light_effect("scanner", "Scanner", layers=[
light_layer("wave", moves="color", speed=0.3),
light_layer("sweep", mix="multiply", speed=1.2, size=1.5),
]),
]Memilih kesan menyalinnya ke dalam tetapan pengguna, jadi ia terus berfungsi walaupun plugin dimatikan. Selagi plugin hidup dan salah satu kesannya sedang berjalan, papan kekunci membaca effects(state) semula ketika dibuka dan kira-kira sekali sesaat selepas itu, lalu menukar apa-apa yang berubah. Begitulah kesan mengikut keadaan, masa atau stats().
def effects(state):
# Rounded, so the effect only changes when the pace really does.
tempo = round(0.3 + min(stats()["wpm"], 120) / 40, 1)
return [
light_effect("tempo", "Tempo", colors=["#ff3d7f", "#ffb000"], layers=[
light_layer("wave", moves="both", speed=tempo, low=0.15),
]),
]Butang effects dalam editor menyenaraikan apa yang ditawarkan skrip. Untuk melihatnya bergerak, simpan plugin, pilih kesan itu di bawah Kesan > Daripada pemalam, dan lihat papan kekunci di bahagian atas skrin itu.
Bundarkan apa-apa yang bergoyang, seperti kadar menaip. Kesan yang kembali berbeza setiap saat akan ditukar setiap saat tanpa faedah. Corak atau kata kunci yang tidak dikenali ialah ValueError dalam konsol editor, dan kesan tanpa lapisan ditinggalkan.
Rupa
Tujuh cangkuk menawarkan pilihan kepada apl: key_styles, themes, popups, animations, backgrounds, trails dan layouts. Setiap satu memulangkan entri yang dibina dengan panggilan di bawah, dan ia muncul di bawah Daripada pemalam di sebelah pilihan terbina dalam. Tema ialah pengecualian: ia mendapat tab Plugin sendiri dalam editor tema. Rupa ialah nombor dan perkataan, bukan kod lukisan, jadi tiada apa-apa dalam skrip berjalan setiap bingkai. Memilih satu menyalinnya ke dalam tetapan orang itu, jadi ia terus berfungsi walaupun pemalam dimatikan, dan memilih pilihan terbina dalam selepas itu mengetepikannya.
| Panggilan | Apa yang dilakukan |
|---|---|
key_style(id, name, material=, variant=, shape=, shadow=, cap=cap(...)) | Gaya kekunci, digunakan pada tema yang sedang dibuka dalam editor tema, daripada kad Gaya. Hanya medan yang dinamakan berubah: material, variant, shape, glass, fan, inner_radius, face_inset, edges, raised dan light_angle mekanikal, shadow (0 ialah rata) dan outline. Warna kekal milik tema. |
cap(outline="round", corner=None, travel=2, layers=[cap_layer(...)]) | Permukaan kekunci bercat untuk sesuatu gaya kekunci, ditindan daripada entri cap_layer(...). outline ialah round atau rect, corner menggantikan jejari bucu, dan travel ialah sedalam mana kekunci itu turun apabila ditekan. |
cap_layer(kind, paint, inset=0, x=0, y=0, blur=0, fade=None, when=[...]) | Satu lapisan permukaan kekunci bercat. kind ialah fill, stroke atau inner, paint menerima tatabahasa warna kekunci, satu color(...) atau satu gradient(...), dan when mengehadkan lapisan itu kepada pale, dark, pressed, resting dan highlighted. moves=False menahan lapisan itu diam sementara kekunci turun. |
theme(id, name, background=, keys=, key_text=, style=key_style(...), ...) | Tema lengkap, dalam tab Plugin editor tema. background, keys dan key_text diperlukan, sebagai warna "#rrggbb"; special, special_text, accent, background_bottom (peralihan ke arah bawah), dark, font dan weight adalah pilihan. style=key_style(...) menetapkan kemasannya. Memilihnya memasangnya sebagai tema tersuai. |
popup_style(id, name, shape="tile", width=48, height=56, lift=30, ...) | Gelembung di atas kekunci yang ditekan, di bawah Rupa > Pop timbul. shape ialah "tile", "round" atau "balloon"; width, height, lift dan font_size dalam mata, dan response serta damping menetapkan pegasnya. |
entrance(id, name, opacity=0, x=0, y=0, scale=1, tilt=0, spin=0, ...) | Cara papan kekunci tiba, di bawah Rupa > Kemunculan. opacity, x, y, scale, tilt dan spin ialah titik mulanya; ia kembali rehat dengan pegas mengikut response dan damping. |
press_animation(id, name, scale=, x=0, y=0, rotation=0, ...) | Bentuk kekunci yang ditahan, di bawah Reaksi > Geometri: scale (atau scale_x dan scale_y), x, y dan rotation pada tekanan penuh. |
letter_animation(id, name, scale=, x=0, y=0, rotation=0, anchor="center") | Gerak sekali yang dimainkan huruf pada setiap ketikan, di bawah Reaksi > Huruf: nombor yang sama pada puncaknya, ditambah anchor. |
transition(id, name, x=0, y=0, scale=1, tilt=0, fade=True, duration=None) | Pertukaran antara huruf, 123 dan #+=, di bawah Rupa > Peralihan. x dan y ialah sejauh mana kekunci lama bergerak, sebagai bahagian papan kekunci, dan yang baharu tiba dari arah cermin. Ia juga menerima scale, tilt, fade dan duration. |
background(id, name, layers=[...], colors=[]) | Latar beranimasi, di bawah Rupa > Latar: sehingga empat lapisan particles(...) dan sehingga lapan warna "#rrggbb". |
particles(shape="glow", count=40, size=4, speed=20, direction="none", ...) | Satu lapisan latar. shape ialah "dot", "glow", "streak", "ring" atau "square"; count, size, speed, direction, spread, gravity, wobble, life, twinkle dan opacity membentuk gerakan, dan burst melontar zarah dari setiap kekunci yang ditekan. |
layout(id, name, rows=[...], left=[], right=[]) | Susun atur, di bawah Susun atur > Susunan. Setiap baris ialah senarai kekunci: rentetan ialah huruf, layout_key(...) ialah yang lain. left dan right meletakkan sehingga tiga kekunci di sebelah bar ruang. Memilihnya memasang susun atur tersuai biasa. |
layout_key(glyph, action="insert", width=1) | Kekunci yang bukan huruf biasa. action ialah salah satu daripada insert, spacer, shift, delete, space, return, numbers, emoji, globe, tab, left, right, undo, redo atau dismiss, dan width dikira dalam kekunci. |
trail(id, name, layers=[...], colors=[]) | Satu jejak leretan. layers ialah entri trail_line, trail_stamps dan trail_head, dilukis mengikut urutan, dan colors ialah palet yang dirujuknya. |
trail_line(width=1, tail_width=1, color=-1, glow=0, dash=0, gap=0, band=0, flow=0) | Garisan di sepanjang leretan. tail_width menipiskan hujung lama, color=-1 mengadun seluruh palet di sepanjang garisan, dan dash, gap, band serta flow memecahkannya atau menjadikannya bergerak. |
trail_stamps(shape="dot", size=1, spacing=14, scatter=0, spin=0, twinkle=0, color=-1) | Bentuk yang digugurkan di sepanjang leretan: dot, ring, square, diamond, star, spark atau heart. spacing ialah jarak antaranya dalam titik, scatter melemparkannya keluar dari garisan, spin memusingkannya dan twinkle menjadikannya timbul tenggelam. |
trail_head(shape="dot", size=1.5, pulse=0, opacity=1, color=-1, glow=0) | Tanda di hujung jari. pulse membuatnya bernafas dan glow menyebarkan cahaya di sekelilingnya. |
def animations(state):
return [
entrance("swoop", "Swoop", y=90, scale=0.94, tilt=-20,
response=0.5, damping=0.72),
press_animation("dip", "Dip", scale=0.93, y=2),
letter_animation("bounce", "Bounce", y=-7, scale=1.12,
anchor="bottom"),
transition("glide", "Glide", x=0.3, scale=0.96),
]def backgrounds(state):
return [
background("snowfall", "Snowfall", colors=["#ffffff", "#cfe8ff"], layers=[
particles(shape="dot", count=70, size=2.2, speed=28,
direction="down", spread=12, wobble=10, life=9),
particles(shape="glow", count=0, size=3, life=1,
burst=8, burst_speed=90),
]),
]Pulangkan nod trail daripada trails(state). Setiap jejak mempunyai palet colors dan lapisan seperti trail_line. Dengan color=-1, garisan mengadunkan warna palet sepanjang leretan. Dayakan pemalam, kemudian pilih jejaknya di bawah Daripada pemalam dalam pemilih jejak. Menyimpan grafik dalam keadaan sahaja tidak melukis jejak.
def trails(state):
return [trail("rainbow", "Rainbow", colors=["#ff0000", "#ff8800", "#ffff00", "#00cc44", "#0066ff", "#9900ff"],
layers=[trail_line(width=1.3, tail_width=0.2, color=-1)])]Rupa disalin semasa dipilih, jadi menukar skrip kemudian tidak mengubah rupa yang sudah digunakan; ia perlu dipilih semula. Kata kunci yang salah eja, perkataan di luar senarainya atau teks di tempat nombor ialah ralat dalam konsol editor, dan nombor dikekalkan dalam julat yang digunakan oleh kawalan apl sendiri.
Seni pada kekunci
key_art(state) memulangkan dict daripada nama kekunci kepada lukisan, dan papan kekunci mengecatnya di dalam kekunci itu. Nama kekunci ialah nama yang sama seperti pada haptics, dengan sandaran letters dan keys. Lukisan ialah senarai shape(...), satu bentuk tunggal, satu lapisan art([...]) atau senarai lapisan, dan setiap lapisan beralih ke lukisan berikutnya mengikut jamnya sendiri, jadi satu kekunci boleh membawa dua benda yang bergerak pada kelajuan berbeza.
| Panggilan | Apa yang dilakukan |
|---|---|
art(shapes, animate=0, curve="ease_out") | Satu lapisan yang beranimasi. Hulurkan lukisan baharu dan lapisan itu beralih kepadanya dalam animate saat mengikut curve: ease_out, linear, ease_in, ease_in_out atau spring. Beberapa lapisan pada satu kekunci beranimasi sendiri-sendiri. |
shape(kind, anchor="center", unit="pt", x=0, y=0, size=, width=, height=, fill=, stroke=, ...) | Satu benda yang dilukis: circle, rect, capsule, line, path, text atau icon. Ia duduk pada x dan y dari sesuatu anchor pada kekunci, dalam titik atau, dengan unit="key", dalam pecahan kekunci. fill dan stroke menerima warna heks, "text", "accent", satu color(...) atau satu gradient(...), dan ada juga line_width, corner, trim_from, trim_to, rotation, opacity, blur serta sehingga tiga bayang. |
graph(values, min=None, max=None, width=0.8, height=0.25, stroke=, fill=) | Satu siri nombor yang dibentangkan menjadi bentuk biasa, untuk dicantum pada senarai bentuk atau digunakan sendirian. 60 sampel terhingga terbaharu disimpan, sempadan datang daripada siri itu sendiri jika tidak diberi, dan fill menambah laluan tertutup ke garis dasar di bawah garisan. |
color(value, opacity=1) | Satu warna: nilai heks, atau "text" atau "accent" yang diselesaikan terhadap kekunci tempat ia jatuh, pada opacity. |
gradient(kind, colors, stops=[], start=, end=, center=, radius=0.5) | Kecerunan lurus atau jejari menerusi senarai warna. stops meletakkannya, start dan end menghalakan yang lurus, center dan radius meletakkan yang jejari. |
shadow(color, radius=4, x=0, y=0) | Bayang di bawah sesuatu bentuk, sehingga tiga. Bayang lebar yang memenuhi kekunci mengikut bucu kekunci dan bukannya memotongnya bersegi; cahaya pula terlepas keluar daripada kekunci. |
Lukisan itu dibaca semula selepas setiap peristiwa yang didengari plugin, dan itulah seluruh gelungnya: ubah keadaan dalam on_event(name, info, state), lukis daripadanya dalam key_art(state). events(state) menamakan peristiwa yang dikehendaki dan dibaca sekali semasa plugin dimuatkan. Tanpanya, plugin mendengar semuanya kecuali key, key_down, key_up, predictions dan tick, yang menjalankan skrip pada setiap ketukan atau setiap saat dan perlu diminta. Perubahan shift dan satah melukis semula seni itu sama ada ada yang mendengar atau tidak, dan ia turut sampai ke context().
def initial():
return {"shift": "off"}
def events(state):
return ["shift"]
def on_event(name, info, state):
state["shift"] = info["state"]
return state
def key_art(state):
if state["shift"] != "locked":
return {}
lamp = shape("circle", anchor="top_right", x=-7, y=7, size=5,
fill="accent", shadow=shadow("accent", radius=4))
return {"shift": art([lamp], animate=0.12)}Bentuk
circlerectcapsulelinepathtexticon
Enam belas bentuk bagi satu kekunci, dikira merentas semua lapisannya, dan 64 titik bagi satu laluan; selebihnya digugurkan. Sesuatu bentuk dilukis di dalam kotak width dan height-nya sendiri, dan kotak tanpa ketebalan tidak mengecat apa-apa, jadi garis mendatar perlu height kecilnya sendiri dengan titik-titiknya di tengah kotak itu (height=0.03, points=[[0, 0.5], [1, 0.5]]) atau ia senyap-senyap tidak muncul.
Haptik, kotak sentuh dan pembetulan
haptics(state) dan hitboxes(state) memulangkan dict dengan nama kekunci sebagai kunci: huruf itu sendiri, "space", "delete", "return", "shift" atau "globe", kemudian "letters" untuk mana-mana huruf yang tidak dinamakan dan "keys" untuk semua yang lain. Kekunci yang ditinggalkan oleh pemalam mengekalkan tetapan orang itu sendiri. Kedua-dua jadual dibaca apabila papan kekunci dibuka dan kira-kira sekali sesaat, jadi tiada apa-apa berjalan pada setiap ketikan kerananya.
| Panggilan | Apa yang dilakukan |
|---|---|
feel(style=None, intensity=None, sharpness=None) | Haptik: style ialah "soft", "light", "medium", "heavy", "rigid" atau "off", dan intensity serta sharpness (0 hingga 1) melarasnya. Perkataan gaya sahaja pun boleh. |
hitbox(scale=1, x=0, y=0) | Kawasan sentuh: x dan y mengalihkan sasaran kekunci sebanyak bahagian saiznya itu, paling banyak separuh kekunci, dan scale membesarkan atau mengecilkannya. Nombor sahaja ialah scale. |
def haptics(state):
return {
"space": "heavy",
"return": "rigid",
"delete": feel(intensity=0.45, sharpness=0.9),
}on_touch(key, x, y, state) berjalan selepas setiap ketikan, sebaik ketikan itu diuruskan, dengan tempat pada kekunci di mana jari mendarat. Kedudukan diukur berbanding kekunci seperti yang dilukis, bukan sasarannya yang dialihkan, jadi pemalam boleh mengalihkan setiap kekunci ke arah tempat ia benar-benar ditekan tanpa mengejar alihannya sendiri.
def initial():
return {"keys": {}}
def on_touch(key, x, y, state):
if len(key) != 1:
return state
n, ax, ay = state["keys"].get(key, [0, 0.0, 0.0])
n = min(n + 1, 50)
ax += (x - ax) / n
ay += (y - ay) / n
state["keys"][key] = [n, ax, ay]
return state
def hitboxes(state):
boxes = {}
for key in state["keys"]:
n, x, y = state["keys"][key]
if n >= 12:
boxes[key] = hitbox(x=round(x * 0.6, 2), y=round(y * 0.6, 2))
return boxessuggestions(word, state) meletakkan perkataan di hadapan bar semasa perkataan ditaip. correct(word, fix, state) berjalan sekali bagi setiap perkataan apabila ruang menamatkannya, dengan pembetulan papan kekunci sendiri atau None, walaupun autobetul dimatikan. Pulangkan perkataan untuk memasukkannya, False untuk mengekalkan perkataan seperti yang ditaip, atau None untuk menyerahkannya kepada papan kekunci. Pemalam pertama yang menjawab menang, dan padam sejurus selepas itu membatalkannya seperti autobetul yang lain.
SHORT = {"brb": "be right back", "omw": "on my way", "idk": "I don't know"}
def suggestions(word, state):
long = SHORT.get(word.lower())
return [long] if long else []
def correct(word, fix, state):
if len(word) > 1 and word.isupper():
return False
return NoneKedua-dua cangkuk tidak berjalan dalam medan kata laluan. Cip pembetulan dalam bar menunjukkan pembetulan papan kekunci sendiri, bukan apa yang akan dipulangkan oleh correct, dan jadual yang diubah dalam on_touch sampai ke papan kekunci pada rentak seterusnya.
Menguji dalam editor
Pratonton editor ialah papan kekunci pengganti. Ia melukis settings(state) secara langsung, mencetuskan mana-mana cangkuk dengan satu ketikan menggunakan perkataan, kekunci atau jenis medan contoh, menunjukkan bar ruang seperti yang ditinggalkan plugin, dan menyenaraikan semua yang diminta plugin daripada papan kekunci. stats() memulangkan nombor rekaan di situ, jadi kadar muncul tanpa menaip.
- Gunakan kawalan dalam pratonton. Setiap satu menjalankan on_action dan melukis semula.
- Ketik butang cangkuk mengikut urutan yang akan dilakukan papan kekunci: on_open, kemudian on_word atau on_key beberapa kali, kemudian on_close.
- Baca konsol. Arahan muncul seperti yang anda tulis, baris print() di bawahnya, dan ralat menamakan barisnya.
- Muat semula untuk memulakan keadaan dari awal. Menyunting skrip tidak menetapkannya semula dengan sendirinya.
Pratonton tiada dokumen, jadi insert() dan replace() hanya mencatat. Untuk mencubanya, simpan dan taip dalam mana-mana medan dengan papan kekunci terbuka.
Had
Apabila plugin masuk sebagai fail atau daripada repositori, Clink menyemaknya sebelum menyimpannya. Ia mesti kurang daripada 64,000 bait dan 1,600 baris, mentakrifkan sekurang-kurangnya satu cangkuk, hanya mengimport modul yang dibenarkan, dan tidak mengandungi mana-mana yang berikut:
Tidak dibenarkan dalam plugin yang dikongsi
__exec(eval(open(compile(
Modul yang boleh diimport oleh plugin yang dikongsi
jsonmathrandomresystime
Setiap panggilan cangkuk mendapat 2,000,000 langkah pentafsir, sama seperti pemaparan panel. Namun on_key berjalan pada setiap ketukan kekunci, jadi kerja berat di situ akan memperlahankan penaipan jauh sebelum had itu dicapai.
Fail
Plugin ialah satu dokumen JSON. id kekal stabil merentas kemas kini, version ialah teks bebas yang dipaparkan dalam senarai, icon ialah nama SF Symbol, dan source ialah skrip dengan baris baharu yang dilepaskan. Kongsikannya daripada pemeriksa editor, atau import satu dengan butang anak panah pada tab Plugin.
{
"id": "word-count",
"name": "Word count",
"icon": "text.word.spacing",
"summary": "Counts words on the space bar",
"version": "1.0",
"author": "You",
"enabled": true,
"source": "def initial():\n return {\"on\": False}\n..."
}Plugin dikongsi sebagai fail .clinkplugin, iaitu dokumen JSON dengan skrip di dalamnya. Plugin diterbitkan melalui repositori dengan cara yang sama seperti panel, dengan folder fail, manifes dan keluaran. Repositori rasmi ialah anti-ltd/clink-plugins.
Repositori ›Apabila sesuatu tidak berlaku
Selalunya ia salah satu daripada ini.
| Gejala | Apa yang perlu disemak |
|---|---|
| Tiada apa-apa berlaku | Plugin dimatikan di bahagian atas tab Plugin, plugin dimatikan dalam senarai, atau tiada keahlian Clink Pro. Ketiga-tiganya menyebabkan papan kekunci tidak menjalankan sebarang plugin. |
| Teks bar ruang dikelabukan | Plugin telah mengambil alihnya. Baris di bawah medan menamakan yang mana; matikan suis plugin itu, atau plugin itu sendiri, untuk mendapatkan medan kembali. |
| Bahagian itu tiada | Sauh tersalah eja. Bandingkan dengan Tunjukkan ID dalam aplikasi, dan ingat bahagian itu masih dipaparkan pada halaman plugin sendiri, tempat yang patut dilihat dahulu. |
| Kekunci elemen kosong | Plugin di belakangnya dimatikan, dibuang, atau draw(id, state)-nya menimbulkan ralat. Susun atur tetap menyimpan kekunci itu, jadi ia terisi semula sebaik plugin dihidupkan. Lihat ralatnya dalam konsol editor. |
| Elemen tidak pernah berubah | draw masih ditanya, jadi keadaan di belakangnya yang tidak bergerak. Apa yang menyuap wajah itu perlu dikemas kini daripada cangkuk: on_tick untuk sesuatu yang berubah sendiri, on_word atau on_key untuk sesuatu yang mengikut taipan. |
| set_setting() tidak berbuat apa-apa | Nama yang tiada dalam senarai di atas menimbulkan KeyError. Nilai jenis yang salah atau di luar julat dilangkau, dan konsol editor menyatakan apa yang dijangka tetapan itu. Tetapan berpagar juga kembali asal tanpa keahlian. |
| Kiraan ditetapkan semula | Papan kekunci menyimpan keadaan semasa ditutup, bukan pada setiap kekunci. Papan kekunci yang dimatikan sistem di tengah sesi kehilangan apa yang dikira pluginnya sejak dibuka. Simpan jumlah dalam cangkuk sebelah aplikasi apabila itu penting. |
| Menaip terasa perlahan | Sesuatu yang berat berjalan dalam on_key. Alihkannya ke on_word, kurangkan kerjanya, atau cache apa yang dikiranya dalam keadaan. |
| Kesan tiada di bawah Daripada pemalam | Plugin mesti dihidupkan dan plugin itu didayakan, dan effects(state) mesti memulangkan light_effect dengan sekurang-kurangnya satu lapisan. Ketik effects dalam editor untuk melihat apa yang dipulangkan, dan cari ValueError dalam konsol. |
| Item bar atas tidak berbuat apa-apa apabila digunakan | Ketukan dan tombol yang dilepaskan kedua-duanya tiba di on_action(action, value, state), dipadankan mengikut id item dan bukan namanya. Tombol menulis tetapan hanya apabila bar_knob menamakannya dalam setting=; tanpa itu nilainya terpulang kepada plugin, dan butang tidak pernah menulis tetapan. |