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

130 lines
3.1 KiB
Python

from talon import Context, Module, actions, settings
from ..tags.operators import Operators
ctx = Context()
mod = Module()
ctx.matches = r"""
code.language: elixir
"""
# Elixir keywords and constructs
ctx.lists["user.code_keyword"] = {
"def": "def ",
"def p": "defp ",
"def module": "defmodule ",
"do": "do ",
"end": "end",
"if": "if ",
"else": "else ",
"cond": "cond ",
"case": "case ",
"when": "when ",
"f n": "fn ",
"receive": "receive ",
"after": "after ",
"try": "try ",
"catch": "catch ",
"rescue": "rescue ",
"raise": "raise ",
"with": "with ",
"unless": "unless ",
"import": "import ",
"alias": "alias ",
"require": "require ",
"use": "use ",
}
operators = Operators(
LAMBDA="->",
ASSIGNMENT=" = ",
MATH_ADD=" + ",
MATH_SUBTRACT=" - ",
MATH_MULTIPLY=" * ",
MATH_DIVIDE=" / ",
MATH_EQUAL=" === ",
MATH_NOT_EQUAL=" !== ",
MATH_WEAK_EQUAL=" == ",
MATH_WEAK_NOT_EQUAL=" != ",
MATH_WEAK_AND=" && ",
MATH_WEAK_OR=" || ",
MATH_WEAK_NOT="!",
MATH_GREATER_THAN=" > ",
MATH_GREATER_THAN_OR_EQUAL=" >= ",
MATH_LESS_THAN=" < ",
MATH_LESS_THAN_OR_EQUAL=" <= ",
MATH_AND=" and ",
MATH_OR=" or ",
MATH_NOT="not ",
MATH_IN=" in ",
MATH_NOT_IN=" not in ",
)
@ctx.action_class("user")
class UserActions:
def code_get_operators() -> Operators:
return operators
def code_self():
actions.auto_insert("self")
def code_insert_true():
actions.auto_insert("true")
def code_insert_false():
actions.auto_insert("false")
def code_insert_null():
actions.insert("nil")
def code_insert_is_null():
actions.insert(" == nil")
def code_insert_is_not_null():
actions.insert(" != nil")
def code_state_else_if():
actions.user.insert_between("else if ", " do\nend")
def code_insert_function(text: str, selection: str):
text += f"({selection or ''})"
actions.user.paste(text)
actions.edit.left()
def code_default_function(text: str):
result = "def {}".format(
actions.user.formatted_text(
text, settings.get("user.code_private_function_formatter")
)
)
actions.user.code_insert_function(result, None)
def code_public_function(text: str):
actions.user.code_default_function(text)
def code_private_function(text: str):
"""Inserts private function declaration"""
result = "defp {}".format(
actions.user.formatted_text(
text, settings.get("user.code_private_function_formatter")
)
)
actions.user.code_insert_function(result, None)
def code_import_module(text: str):
actions.auto_insert("import ")
actions.insert(text)
def code_alias_module(text: str):
actions.auto_insert("alias ")
actions.insert(text)
def code_require_module(text: str):
actions.auto_insert("require ")
actions.insert(text)
def code_use_module(text: str):
actions.auto_insert("use ")
actions.insert(text)