Skip to content

Instantly share code, notes, and snippets.

@rntz
Created November 20, 2021 21:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rntz/e548ff20a28f9e9bd7c6bad8466670d4 to your computer and use it in GitHub Desktop.
Save rntz/e548ff20a28f9e9bd7c6bad8466670d4 to your computer and use it in GitHub Desktop.
from talon import Module, Context, actions
mod = Module()
ctx = Context()
matching_delimiters = {x[0]: x[1] for x in "() [] {} <> “” ‘’".split()}
mod.list('delimiter', desc='Delimiter pair names')
ctx.lists['self.delimiter'] = {
"round": "(", "square": "[", "curly": "{", "angle": "<",
"fancy string": "“",
"fancy quote": "‘",
"angles": "<",
"string": '"',
"quote": "'",
"back string": "`",
"triple back": "```",
}
@mod.action_class
class Actions:
def delimiter_close(delimiter: str) -> str:
"""Turns a delimiter into its corresponding closing delimiter."""
return ''.join(matching_delimiters.get(c, c) for c in delimiter)
def delimiter_insert_between(delimiter: str):
"""Inserts a matching delimiter pair and leaves the cursor in between them."""
after = actions.user.delimiter_close(delimiter)
actions.insert(delimiter + after)
for _ in after: actions.edit.left()
@mod.capture(rule="""
escaping* {user.delimiter} | between escaping* <user.symbol_key>
""")
def delimiter(m) -> str:
"""An opening delimiter, like ( or [."""
delim = m.delimiter if hasattr(m, 'delimiter') else m.symbol_key
for x in m:
if x == 'escaping':
delim = '\\' + delim
return delim
<user.delimiter>: user.delimiter_insert_between(delimiter)
empty <user.delimiter>: "{delimiter}{user.delimiter_close(delimiter)}"
{user.delimiter} that:
text = edit.selected_text()
user.paste("{delimiter}{text}{user.delimiter_close(delimiter)}")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment