Skip to content

Commit

Permalink
Merge branch 'main' into centralized-please-command
Browse files Browse the repository at this point in the history
  • Loading branch information
jaresty authored Oct 6, 2024
2 parents 7558483 + df82aac commit e68172f
Show file tree
Hide file tree
Showing 24 changed files with 363 additions and 152 deletions.
3 changes: 3 additions & 0 deletions BREAKING_CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ and when the change was applied given the delay between changes being
submitted and the time they were reviewed and merged.

---
* 2024-09-07 Removed `get_list_from_csv` from `user_settings.py`. Please
use the new `track_csv_list` decorator, which leverages Talon's
`talon.watch` API for robustness on Talon launch.
* 2024-09-07 If you've updated `community` since 2024-08-31, you may
need to replace `host:` with `hostname:` in the header of
`core/system_paths-<hostname>.talon-list` due to an issue with
Expand Down
13 changes: 4 additions & 9 deletions apps/emacs/emacs_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,9 @@ def emacs_command_short_form(command_name: str) -> Optional[str]:
return emacs_commands.get(command_name, Command(command_name)).short


def load_csv():
filepath = Path(__file__).parents[0] / "emacs_commands.csv"
with resource.open(filepath) as f:
rows = list(csv.reader(f))
@resource.watch("emacs_commands.csv")
def load_commands(f):
rows = list(csv.reader(f))
# Check headers
assert rows[0] == ["Command", " Key binding", " Short form", " Spoken form"]

Expand All @@ -46,7 +45,7 @@ def load_csv():
continue
if len(row) > 4:
print(
f'"{filepath}": More than four values in row: {row}. '
f"emacs_commands.csv: More than four values in row: {row}. "
+ " Ignoring the extras"
)
name, keys, short, spoken = (
Expand All @@ -70,7 +69,3 @@ def load_csv():
if c.spoken:
command_list[c.spoken] = c.name
ctx.lists["self.emacs_command"] = command_list


# TODO: register on change to file!
app.register("ready", load_csv)
41 changes: 22 additions & 19 deletions core/abbreviate/abbreviate.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

from talon import Context, Module

from ..user_settings import get_list_from_csv
from ..user_settings import track_csv_list

mod = Module()
ctx = Context()
mod.list("abbreviation", desc="Common abbreviation")


abbreviations_list = {}
abbreviations = {
"J peg": "jpg",
"abbreviate": "abbr",
Expand Down Expand Up @@ -447,24 +448,26 @@
"work in progress": "wip",
}

# This variable is also considered exported for the create_spoken_forms module
abbreviations_list = get_list_from_csv(
"abbreviations.csv",
headers=("Abbreviation", "Spoken Form"),
default=abbreviations,

@track_csv_list(
"abbreviations.csv", headers=("Abbreviation", "Spoken Form"), default=abbreviations
)
def on_abbreviations(values):
global abbreviations_list

# Matches letters and spaces, as currently, Talon doesn't accept other characters in spoken forms.
PATTERN = re.compile(r"^[a-zA-Z ]+$")
abbreviation_values = {
v: v for v in abbreviations_list.values() if PATTERN.match(v) is not None
}
# note: abbreviations_list is imported by the create_spoken_forms module
abbreviations_list = values

# Allows the abbreviated/short form to be used as spoken phrase. eg "brief app" -> app
abbreviations_list_with_values = {
**abbreviation_values,
**abbreviations_list,
}
# Matches letters and spaces, as currently, Talon doesn't accept other characters in spoken forms.
PATTERN = re.compile(r"^[a-zA-Z ]+$")
abbreviation_values = {
v: v for v in abbreviations_list.values() if PATTERN.match(v) is not None
}

ctx = Context()
ctx.lists["user.abbreviation"] = abbreviations_list_with_values
# Allows the abbreviated/short form to be used as spoken phrase. eg "brief app" -> app
abbreviations_list_with_values = {
**{v: v for v in abbreviation_values.values()},
**abbreviations_list,
}

ctx.lists["user.abbreviation"] = abbreviations_list_with_values
58 changes: 41 additions & 17 deletions core/create_spoken_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,34 +6,58 @@

from talon import Module, actions

from .abbreviate.abbreviate import abbreviations_list
from .file_extension.file_extension import file_extensions
from .keys.keys import symbol_key_words
from .numbers.numbers import digits_map, scales, teens, tens
from .user_settings import track_csv_list

mod = Module()


DEFAULT_MINIMUM_TERM_LENGTH = 2
EXPLODE_MAX_LEN = 3
FANCY_REGULAR_EXPRESSION = r"[A-Z]?[a-z]+|[A-Z]+(?![a-z])|[0-9]+"
FILE_EXTENSIONS_REGEX = "|".join(
re.escape(file_extension.strip()) + "$"
for file_extension in file_extensions.values()
)
SYMBOLS_REGEX = "|".join(re.escape(symbol) for symbol in set(symbol_key_words.values()))
REGEX_NO_SYMBOLS = re.compile(
"|".join(
[
FANCY_REGULAR_EXPRESSION,
FILE_EXTENSIONS_REGEX,
]
FILE_EXTENSIONS_REGEX = r"^\b$"
file_extensions = {}


def update_regex():
global REGEX_NO_SYMBOLS
global REGEX_WITH_SYMBOLS
REGEX_NO_SYMBOLS = re.compile(
"|".join(
[
FANCY_REGULAR_EXPRESSION,
FILE_EXTENSIONS_REGEX,
]
)
)
REGEX_WITH_SYMBOLS = re.compile(
"|".join([FANCY_REGULAR_EXPRESSION, FILE_EXTENSIONS_REGEX, SYMBOLS_REGEX])
)


update_regex()


@track_csv_list("file_extensions.csv", headers=("File extension", "Name"))
def on_extensions(values):
global FILE_EXTENSIONS_REGEX
global file_extensions
file_extensions = values
FILE_EXTENSIONS_REGEX = "|".join(
re.escape(file_extension.strip()) + "$" for file_extension in values.values()
)
)
update_regex()


abbreviations_list = {}


@track_csv_list("abbreviations.csv", headers=("Abbreviation", "Spoken Form"))
def on_abbreviations(values):
global abbreviations_list
abbreviations_list = values

REGEX_WITH_SYMBOLS = re.compile(
"|".join([FANCY_REGULAR_EXPRESSION, FILE_EXTENSIONS_REGEX, SYMBOLS_REGEX])
)

REVERSE_PRONUNCIATION_MAP = {
**{str(value): key for key, value in digits_map.items()},
Expand Down
12 changes: 7 additions & 5 deletions core/file_extension/file_extension.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from talon import Context, Module

from ..user_settings import get_list_from_csv
from ..user_settings import track_csv_list

mod = Module()
mod.list("file_extension", desc="A file extension, such as .py")
Expand Down Expand Up @@ -55,11 +55,13 @@
"dot log": ".log",
}

file_extensions = get_list_from_csv(
ctx = Context()


@track_csv_list(
"file_extensions.csv",
headers=("File extension", "Name"),
default=_file_extensions_defaults,
)

ctx = Context()
ctx.lists["self.file_extension"] = file_extensions
def on_update(values):
ctx.lists["self.file_extension"] = values
6 changes: 6 additions & 0 deletions core/keys/arrow_key.talon-list
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
list: user.arrow_key
-
down: down
left: left
right: right
up: up
27 changes: 27 additions & 0 deletions core/keys/function_key.talon-list
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
list: user.function_key
-
f one: f1
f two: f2
f three: f3
f four: f4
f five: f5
f six: f6
f seven: f7
f eight: f8
f nine: f9
f ten: f10
f eleven: f11
f twelve: f12
f thirteen: f13
f fourteen: f14
f fifteen: f15
f sixteen: f16
f seventeen: f17
f eighteen: f18
f nineteen: f19
f twenty: f20
# these f keys are not supported by all platforms (eg Mac) and are disabled by default
#f twenty one: f21
#f twenty two: f22
#f twenty three: f23
#f twenty four: f24
19 changes: 19 additions & 0 deletions core/keys/keypad_key.talon-list
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
list: user.keypad_key
-
key pad zero: keypad_0
key pad one: keypad_1
key pad two: keypad_2
key pad three: keypad_3
key pad four: keypad_4
key pad five: keypad_5
key pad six: keypad_6
key pad seven: keypad_7
key pad eight: keypad_8
key pad nine: keypad_9
key pad point: keypad_decimal
key pad plus: keypad_plus
key pad minus: keypad_minus
key pad star: keypad_multiply
key pad slash: keypad_divide
key pad equals: keypad_equals
key pad clear: keypad_clear
68 changes: 9 additions & 59 deletions core/keys/keys.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,4 @@
from talon import Context, Module, app

from ..user_settings import get_list_from_csv

# used for number keys & function keys respectively
digits = "zero one two three four five six seven eight nine".split()
f_digits = "one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty".split()

from talon import Context, Module, actions, app

mod = Module()
mod.list("letter", desc="The spoken phonetic alphabet")
Expand All @@ -15,6 +8,7 @@
mod.list("modifier_key", desc="All modifier keys")
mod.list("function_key", desc="All function keys")
mod.list("special_key", desc="All special keys")
mod.list("keypad_key", desc="All keypad keys")
mod.list("punctuation", desc="words for inserting punctuation into text")


Expand Down Expand Up @@ -42,6 +36,12 @@ def number_key(m) -> str:
return m.number_key


@mod.capture(rule="{self.keypad_key}")
def keypad_key(m) -> str:
"One keypad key"
return m.keypad_key


@mod.capture(rule="{self.letter}")
def letter(m) -> str:
"One letter key"
Expand Down Expand Up @@ -74,7 +74,7 @@ def any_alphanumeric_key(m) -> str:

@mod.capture(
rule="( <self.letter> | <self.number_key> | <self.symbol_key> "
"| <self.arrow_key> | <self.function_key> | <self.special_key> )"
"| <self.arrow_key> | <self.function_key> | <self.special_key> | <self.keypad_key>)"
)
def unmodified_key(m) -> str:
"A single key with no modifiers"
Expand Down Expand Up @@ -104,17 +104,6 @@ def letters(m) -> str:


ctx = Context()
modifier_keys = {
# If you find 'alt' is often misrecognized, try using 'alter'.
"alt": "alt", #'alter': 'alt',
"control": "ctrl", #'troll': 'ctrl',
"shift": "shift", #'sky': 'shift',
"super": "super",
}
if app.platform == "mac":
modifier_keys["command"] = "cmd"
modifier_keys["option"] = "alt"
ctx.lists["self.modifier_key"] = modifier_keys

# `punctuation_words` is for words you want available BOTH in dictation and as key names in command mode.
# `symbol_key_words` is for key names that should be available in command mode, but NOT during dictation.
Expand Down Expand Up @@ -212,42 +201,3 @@ def letters(m) -> str:
symbol_key_words.update(punctuation_words)
ctx.lists["self.punctuation"] = punctuation_words
ctx.lists["self.symbol_key"] = symbol_key_words
ctx.lists["self.number_key"] = {name: str(i) for i, name in enumerate(digits)}
ctx.lists["self.arrow_key"] = {
"down": "down",
"left": "left",
"right": "right",
"up": "up",
}

simple_keys = [
"end",
"enter",
"escape",
"home",
"insert",
"pagedown",
"pageup",
"space",
"tab",
]

alternate_keys = {
"wipe": "backspace",
"delete": "backspace",
#'junk': 'backspace',
"forward delete": "delete",
"page up": "pageup",
"page down": "pagedown",
}
# mac apparently doesn't have the menu key.
if app.platform in ("windows", "linux"):
alternate_keys["menu key"] = "menu"
alternate_keys["print screen"] = "printscr"

special_keys = {k: k for k in simple_keys}
special_keys.update(alternate_keys)
ctx.lists["self.special_key"] = special_keys
ctx.lists["self.function_key"] = {
f"F {name}": f"f{i}" for i, name in enumerate(f_digits, start=1)
}
2 changes: 2 additions & 0 deletions core/keys/letter.talon-list
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
list: user.letter
-
# for common alternative spoken forms for letters, visit
# https://talon.wiki/quickstart/improving_recognition_accuracy/#collected-alternatives-to-the-default-alphabet
air: a
bat: b
cap: c
Expand Down
9 changes: 9 additions & 0 deletions core/keys/mac/modifier_key.talon-list
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
list: user.modifier_key
os: mac
-
alt: alt
control: ctrl
shift: shift
super: cmd
command: cmd
option: alt
14 changes: 14 additions & 0 deletions core/keys/mac/special_key.talon-list
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
list: user.special_key
os: mac
-
end: end
home: home
minus: minus
enter: enter
page down: pagedown
page up: pageup
escape: escape
tab: tab
wipe: backspace
delete: backspace
forward delete: delete
Loading

0 comments on commit e68172f

Please sign in to comment.