2025-08-19 08:06:37 -04:00

141 lines
3.8 KiB
Python

from talon import Context, Module, actions, app, registry
from ..tags.operators import Operators
mod = Module()
ctx_talon = Context()
ctx_talon_python = Context()
ctx_talon_lists = Context()
# restrict all the talon_* lists to when the user.talon_populate_lists tag
# is active to prevent them from being active in contexts where they are not wanted.
# Do not enable this tag with dragon, as it will be unusable.
# with conformer, the latency increase may also be unacceptable depending on your cpu
# see https://github.com/talonhub/community/issues/600
ctx_talon_lists.matches = r"""
tag: user.talon_populate_lists
"""
mod.tag("talon_python", "Tag to activate talon-specific python commands")
mod.tag(
"talon_populate_lists",
"Tag to activate talon-specific lists of actions, scopes, modes etcetera. Do not use this tag with dragon",
)
mod.list("talon_actions")
mod.list("talon_lists")
mod.list("talon_captures")
mod.list("talon_apps")
mod.list("talon_tags")
mod.list("talon_modes")
mod.list("talon_settings")
mod.list("talon_scopes")
mod.list("talon_modes")
ctx_talon.matches = r"""
code.language: talon
"""
ctx_talon_python.matches = r"""
tag: user.talon_python
"""
def on_update_decls(decls):
# todo modes?
for thing in [
"actions",
"lists",
"captures",
"tags",
"apps",
"settings",
"scopes",
"modes",
]:
l = getattr(decls, thing)
ctx_talon_lists.lists[f"user.talon_{thing}"] = (
actions.user.create_spoken_forms_from_list(
l.keys(), generate_subsequences=False
)
)
# print(
# "List: {} \n {}".format(thing, str(ctx_talon_lists.lists[f"user.talon_{thing}"]))
# )
def on_ready():
# print("on_ready")
on_update_decls(registry.decls)
registry.register("update_decls", on_update_decls)
app.register("ready", on_ready)
@mod.action_class
class Actions:
def talon_code_insert_action_call(text: str, selection: str):
"""inserts talon-specific action call"""
actions.user.code_insert_function(text, selection)
def talon_code_enable_tag(tag: str):
"""enables tag in either python or talon files"""
def talon_code_enable_setting(setting: str):
"""asserts setting in either python or talon files"""
@ctx_talon.action_class("user")
class TalonActions:
def talon_code_enable_tag(tag: str):
"""enables tag in either python or talon files"""
actions.user.paste(f"tag(): {tag}")
def talon_code_enable_setting(setting: str):
"""asserts setting in either python or talon files"""
actions.user.paste(f"{setting} = ")
@ctx_talon_python.action_class("user")
class TalonPythonActions:
def talon_code_insert_action_call(text: str, selection: str):
text = f"actions.{text}({selection or ''})"
actions.user.paste(text)
actions.edit.left()
def talon_code_enable_tag(tag: str):
"""enables tag in either python or talon files"""
actions.user.paste(f'ctx.tags = ["{tag}"]')
if not tag:
actions.edit.left()
actions.edit.left()
def talon_code_enable_setting(setting: str):
"""asserts setting in either python or talon files"""
if not setting:
actions.user.insert_between('ctx.settings["', '"] = ')
else:
actions.user.paste(f'ctx.settings["{setting}"] = ')
operators = Operators(
MATH_AND=" and ",
MATH_OR=" or ",
MATH_SUBTRACT=" - ",
MATH_ADD=" + ",
MATH_MULTIPLY=" * ",
MATH_DIVIDE=" / ",
ASSIGNMENT=" = ",
)
@ctx_talon.action_class("user")
class UserActions:
def code_get_operators() -> Operators:
return operators
def code_insert_function(text: str, selection: str):
text += f"({selection or ''})"
actions.user.paste(text)
actions.edit.left()