talon-scripts/community/core/edit/edit_command_modifiers.py
2025-08-19 08:06:37 -04:00

76 lines
2.3 KiB
Python

from contextlib import suppress
from dataclasses import dataclass
from typing import Callable
from talon import Module, actions
mod = Module()
mod.list("edit_modifier", desc="Modifiers for the edit command")
mod.list(
"edit_modifier_repeatable",
desc="Modifiers for the edit command that are repeatable",
)
@dataclass
class EditModifier:
type: str
count: int = 1
@dataclass
class EditModifierCallback:
modifier: str
callback: Callable
@mod.capture(
rule="({user.edit_modifier}) | ([<number_small>] {user.edit_modifier_repeatable})"
)
def edit_modifier(m) -> EditModifier:
count = 1
with suppress(AttributeError):
count = m.number_small
with suppress(AttributeError):
type = m.edit_modifier
with suppress(AttributeError):
type = m.edit_modifier_repeatable
return EditModifier(type, count=count)
modifiers = [
EditModifierCallback("document", actions.edit.select_all),
EditModifierCallback("paragraph", actions.edit.select_paragraph),
EditModifierCallback("word", actions.edit.extend_word_right),
EditModifierCallback("wordLeft", actions.edit.extend_word_left),
EditModifierCallback("wordRight", actions.edit.extend_word_right),
EditModifierCallback("left", actions.edit.extend_left),
EditModifierCallback("right", actions.edit.extend_right),
EditModifierCallback("lineUp", actions.edit.extend_line_up),
EditModifierCallback("lineDown", actions.edit.extend_line_down),
EditModifierCallback("line", actions.edit.select_line),
EditModifierCallback("lineEnd", actions.edit.extend_line_end),
EditModifierCallback("lineStart", actions.edit.extend_line_start),
EditModifierCallback("fileStart", actions.edit.extend_file_start),
EditModifierCallback("fileEnd", actions.edit.extend_file_end),
EditModifierCallback("selection", actions.skip),
]
modifier_dictionary: dict[str, EditModifierCallback] = {
item.modifier: item for item in modifiers
}
def run_modifier_callback(modifier: EditModifier):
modifier_type = modifier.type
if modifier_type not in modifier_dictionary:
raise ValueError(f"Unknown edit modifier: {modifier_type}")
count = modifier.count
modifier = modifier_dictionary[modifier_type]
for i in range(1, count + 1):
modifier.callback()