diff --git a/apps/vscode/snippets/python_snippets.py b/apps/vscode/snippets/python_snippets.py index 6be11e1177..365d27a938 100644 --- a/apps/vscode/snippets/python_snippets.py +++ b/apps/vscode/snippets/python_snippets.py @@ -5,7 +5,7 @@ ctx = Context() ctx.matches = r""" app: vscode -tag: user.python +code.language: python """ # short name -> ide clip name ctx.lists["user.snippets"] = { diff --git a/core/modes/language_modes.py b/core/modes/language_modes.py index 20144baee7..a71953b0bc 100644 --- a/core/modes/language_modes.py +++ b/core/modes/language_modes.py @@ -1,8 +1,5 @@ from talon import Context, Module, actions -ctx = Context() -mod = Module() - # Maps language mode names to the extensions that activate them. Only put things # here which have a supported language mode; that's why there are so many # commented out entries. TODO: make this a csv file? @@ -59,7 +56,20 @@ "r": ["are language"], "tex": ["tech", "lay tech", "latex"], } + +mod = Module() + +ctx = Context() + +ctx_forced = Context() +ctx_forced.matches = r""" +tag: user.code_language_forced +""" + + +mod.tag("code_language_forced", "This tag is active when a language mode is forced") mod.list("language_mode", desc="Name of a programming language mode.") + ctx.lists["self.language_mode"] = { name: language for language in language_extensions @@ -73,41 +83,36 @@ for ext in extensions.split() } -# Create a context for each defined language -for lang in language_extensions.keys(): - mod.tag(lang) - mod.tag(f"{lang}_forced") - c = Context() - # Context is active if language is forced or auto language matches - c.matches = f""" - tag: user.{lang}_forced - tag: user.auto_lang - and code.language: {lang} - """ - c.tags = [f"user.{lang}"] - -# Create a mode for the automated language detection. This is active when no lang is forced. -mod.tag("auto_lang") -ctx.tags = ["user.auto_lang"] +forced_language = "" @ctx.action_class("code") -class code_actions: +class CodeActions: def language(): - result = "" file_extension = actions.win.file_ext() - if file_extension and file_extension in extension_lang_map: - result = extension_lang_map[file_extension] - return result + return extension_lang_map.get(file_extension, "") + + +@ctx_forced.action_class("code") +class ForcedCodeActions: + def language(): + return forced_language @mod.action_class class Actions: def code_set_language_mode(language: str): """Sets the active language mode, and disables extension matching""" + global forced_language assert language in language_extensions - ctx.tags = [f"user.{language}_forced"] + forced_language = language + # Update tags to force a context refresh. Otherwise `code.language` will not update. + # Necessary to first set an empty list otherwise you can't move from one forced language to another. + ctx.tags = [] + ctx.tags = ["user.code_language_forced"] def code_clear_language_mode(): """Clears the active language mode, and re-enables code.language: extension matching""" - ctx.tags = ["user.auto_lang"] + global forced_language + forced_language = "" + ctx.tags = [] diff --git a/lang/batch/batch.py b/lang/batch/batch.py index bc5a3dfafe..3a4b67ffc0 100644 --- a/lang/batch/batch.py +++ b/lang/batch/batch.py @@ -2,7 +2,7 @@ ctx = Context() ctx.matches = r""" -tag: user.batch +code.language: batch """ diff --git a/lang/batch/batch.talon b/lang/batch/batch.talon index 683e41f775..fe66aeccc0 100644 --- a/lang/batch/batch.talon +++ b/lang/batch/batch.talon @@ -1,4 +1,4 @@ -tag: user.batch +code.language: batch - tag(): user.code_comment_line diff --git a/lang/c/c.py b/lang/c/c.py index 5294fda554..91b271ce03 100644 --- a/lang/c/c.py +++ b/lang/c/c.py @@ -10,7 +10,7 @@ ctx = Context() ctx.matches = r""" -tag: user.c +code.language: c """ ctx.lists["self.c_pointers"] = { diff --git a/lang/c/c.talon b/lang/c/c.talon index 5042064643..538ce606e8 100644 --- a/lang/c/c.talon +++ b/lang/c/c.talon @@ -1,4 +1,4 @@ -tag: user.c +code.language: c - tag(): user.code_imperative diff --git a/lang/csharp/csharp.py b/lang/csharp/csharp.py index 0ead7db078..ec725e1b64 100644 --- a/lang/csharp/csharp.py +++ b/lang/csharp/csharp.py @@ -2,7 +2,7 @@ ctx = Context() ctx.matches = r""" -tag: user.csharp +code.language: csharp """ ctx.lists["user.code_common_function"] = { "integer": "int.TryParse", diff --git a/lang/csharp/csharp.talon b/lang/csharp/csharp.talon index 6d5778161b..d59ff34b67 100644 --- a/lang/csharp/csharp.talon +++ b/lang/csharp/csharp.talon @@ -1,4 +1,4 @@ -tag: user.csharp +code.language: csharp - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/css/css.py b/lang/css/css.py index 879cbbdfd1..241088326d 100644 --- a/lang/css/css.py +++ b/lang/css/css.py @@ -4,7 +4,8 @@ global_ctx = Context() ctx = Context() ctx.matches = """ -tag: user.css +code.language: css +code.language: scss """ mod.list("css_at_rule", desc="List of CSS @rules") diff --git a/lang/css/css.talon b/lang/css/css.talon index 955e5714d8..bd9d0fd986 100644 --- a/lang/css/css.talon +++ b/lang/css/css.talon @@ -1,4 +1,5 @@ -tag: user.css +code.language: css +code.language: scss - tag(): user.code_comment_block_c_like tag(): user.code_functions_common diff --git a/lang/css/scss.talon b/lang/css/scss.talon deleted file mode 100644 index 9b5953d928..0000000000 --- a/lang/css/scss.talon +++ /dev/null @@ -1,3 +0,0 @@ -tag: user.scss -- -tag(): user.css diff --git a/lang/go/go.talon b/lang/go/go.talon index 81b04f6cf0..abfc21f7c6 100644 --- a/lang/go/go.talon +++ b/lang/go/go.talon @@ -1,4 +1,4 @@ -tag: user.go +code.language: go - variadic: "..." logical and: " && " diff --git a/lang/html/html.talon b/lang/html/html.talon new file mode 100644 index 0000000000..d3096fb354 --- /dev/null +++ b/lang/html/html.talon @@ -0,0 +1,4 @@ +code.language: html +code.language: javascriptreact +code.language: typescriptreact +- diff --git a/lang/java/java.py b/lang/java/java.py index 6c9938fb74..e5a569f0d5 100644 --- a/lang/java/java.py +++ b/lang/java/java.py @@ -3,7 +3,7 @@ ctx = Context() mod = Module() ctx.matches = r""" -tag: user.java +code.language: java """ # Primitive Types diff --git a/lang/java/java.talon b/lang/java/java.talon index 2b6512790f..cc8e65efe1 100644 --- a/lang/java/java.talon +++ b/lang/java/java.talon @@ -1,4 +1,4 @@ -tag: user.java +code.language: java - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/javascript/javascript.py b/lang/javascript/javascript.py index ab9fa78331..2c3c69bcf1 100644 --- a/lang/javascript/javascript.py +++ b/lang/javascript/javascript.py @@ -2,8 +2,11 @@ mod = Module() ctx = Context() -ctx.matches = """ -tag: user.javascript +ctx.matches = r""" +code.language: javascript +code.language: typescript +code.language: javascriptreact +code.language: typescriptreact """ ctx.lists["user.code_common_function"] = { diff --git a/lang/javascript/javascript.talon b/lang/javascript/javascript.talon index a4c6080149..c05b6092d1 100644 --- a/lang/javascript/javascript.talon +++ b/lang/javascript/javascript.talon @@ -1,4 +1,7 @@ -tag: user.javascript +code.language: javascript +code.language: typescript +code.language: javascriptreact +code.language: typescriptreact - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/javascript/javascriptreact.talon b/lang/javascript/javascriptreact.talon deleted file mode 100644 index c360f2259d..0000000000 --- a/lang/javascript/javascriptreact.talon +++ /dev/null @@ -1,3 +0,0 @@ -tag: user.javascriptreact -- -tag(): user.javascript diff --git a/lang/lua/lua.py b/lang/lua/lua.py index 9fbad5f3a9..8205c12c97 100644 --- a/lang/lua/lua.py +++ b/lang/lua/lua.py @@ -3,7 +3,7 @@ mod = Module() ctx = Context() ctx.matches = r""" -tag: user.lua +code.language: lua """ mod.setting( diff --git a/lang/lua/lua.talon b/lang/lua/lua.talon index 0f741f11b2..b5378e4130 100644 --- a/lang/lua/lua.talon +++ b/lang/lua/lua.talon @@ -1,4 +1,4 @@ -tag: user.lua +code.language: lua - tag(): user.code_imperative diff --git a/lang/markdown/markdown.py b/lang/markdown/markdown.py index 914eb4215d..3a38bcb4f8 100644 --- a/lang/markdown/markdown.py +++ b/lang/markdown/markdown.py @@ -3,6 +3,10 @@ mod = Module() ctx = Context() +ctx.matches = r""" +code.language: markdown +""" + mod.list("markdown_code_block_language", desc="Languages for code blocks") ctx.lists["user.markdown_code_block_language"] = { "typescript": "typescript", diff --git a/lang/markdown/markdown.talon b/lang/markdown/markdown.talon index ea42ce4369..d44024cce9 100644 --- a/lang/markdown/markdown.talon +++ b/lang/markdown/markdown.talon @@ -1,4 +1,4 @@ -tag: user.markdown +code.language: markdown - (level | heading | header) one: edit.line_start() diff --git a/lang/php/php.py b/lang/php/php.py index da6cb452cd..57454b10dc 100644 --- a/lang/php/php.py +++ b/lang/php/php.py @@ -2,7 +2,7 @@ ctx = Context() ctx.matches = r""" -tag: user.php +code.language: php """ ctx.lists["user.code_type"] = { diff --git a/lang/php/php.talon b/lang/php/php.talon index 795eb7fda5..4b1e165d7a 100644 --- a/lang/php/php.talon +++ b/lang/php/php.talon @@ -1,4 +1,4 @@ -tag: user.php +code.language: php - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/proto/proto.py b/lang/proto/proto.py index 47e995e1eb..a193efe696 100644 --- a/lang/proto/proto.py +++ b/lang/proto/proto.py @@ -4,7 +4,7 @@ ctx = Context() ctx.matches = r""" -tag: user.protobuf +code.language: protobuf """ ctx.lists["user.code_type"] = { diff --git a/lang/proto/proto.talon b/lang/proto/proto.talon index f423720d63..a5441f5cde 100644 --- a/lang/proto/proto.talon +++ b/lang/proto/proto.talon @@ -1,4 +1,4 @@ -tag: user.protobuf +code.language: protobuf - # this is pretty bare-bones, further contributions welcome diff --git a/lang/python/python.py b/lang/python/python.py index bcf2827f0c..ae58f7810e 100644 --- a/lang/python/python.py +++ b/lang/python/python.py @@ -5,7 +5,7 @@ mod = Module() ctx = Context() ctx.matches = r""" -tag: user.python +code.language: python """ ctx.lists["user.code_common_function"] = { "enumerate": "enumerate", diff --git a/lang/python/python.talon b/lang/python/python.talon index 9024ceb2a4..6584965cb3 100644 --- a/lang/python/python.talon +++ b/lang/python/python.talon @@ -1,4 +1,4 @@ -tag: user.python +code.language: python - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/r/r.py b/lang/r/r.py index c9c6749ba9..1b2e3eaa56 100644 --- a/lang/r/r.py +++ b/lang/r/r.py @@ -3,7 +3,7 @@ ctx = Context() ctx.matches = r""" -tag: user.r +code.language: r """ ctx.lists["user.code_common_function"] = { diff --git a/lang/r/r.talon b/lang/r/r.talon index 2d1b410753..b9240c1735 100644 --- a/lang/r/r.talon +++ b/lang/r/r.talon @@ -1,4 +1,4 @@ -tag: user.r +code.language: r - tag(): user.code_imperative diff --git a/lang/ruby/ruby.py b/lang/ruby/ruby.py index 10079dff4e..88c820970c 100644 --- a/lang/ruby/ruby.py +++ b/lang/ruby/ruby.py @@ -2,7 +2,7 @@ ctx = Context() ctx.matches = r""" -tag: user.ruby +code.language: ruby """ diff --git a/lang/ruby/ruby.talon b/lang/ruby/ruby.talon index 5c22fddcba..af8dcf01ce 100644 --- a/lang/ruby/ruby.talon +++ b/lang/ruby/ruby.talon @@ -1,4 +1,4 @@ -tag: user.ruby +code.language: ruby - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/rust/rust.py b/lang/rust/rust.py index 196699aea2..56a1dbc91d 100644 --- a/lang/rust/rust.py +++ b/lang/rust/rust.py @@ -50,7 +50,7 @@ def code_comment_documentation_block_inner(): ctx = Context() ctx.matches = r""" -tag: user.rust +code.language: rust """ scalar_types = { diff --git a/lang/rust/rust.talon b/lang/rust/rust.talon index 07db95e35f..a0b6923759 100644 --- a/lang/rust/rust.talon +++ b/lang/rust/rust.talon @@ -1,4 +1,4 @@ -tag: user.rust +code.language: rust - tag(): user.code_comment_line tag(): user.code_comment_block_c_like diff --git a/lang/scala/scala.py b/lang/scala/scala.py index 5cfe62937d..4b75694cc8 100644 --- a/lang/scala/scala.py +++ b/lang/scala/scala.py @@ -3,7 +3,7 @@ ctx = Context() mod = Module() ctx.matches = r""" -tag: user.scala +code.language: scala """ # Scala Common Types diff --git a/lang/scala/scala.talon b/lang/scala/scala.talon index 8359e9c783..bd0cc8903a 100644 --- a/lang/scala/scala.talon +++ b/lang/scala/scala.talon @@ -1,4 +1,4 @@ -tag: user.scala +code.language: scala - tag(): user.code_imperative tag(): user.code_object_oriented diff --git a/lang/sql/sql.py b/lang/sql/sql.py index 06d8f1f75e..1812ed15c9 100644 --- a/lang/sql/sql.py +++ b/lang/sql/sql.py @@ -2,7 +2,7 @@ ctx = Context() ctx.matches = r""" -tag: user.sql +code.language: sql """ # these vary by dialect diff --git a/lang/sql/sql.talon b/lang/sql/sql.talon index 540b31b63b..6e94c08ea4 100644 --- a/lang/sql/sql.talon +++ b/lang/sql/sql.talon @@ -1,4 +1,4 @@ -tag: user.sql +code.language: sql - tag(): user.code_operators_math tag(): user.code_comment_line diff --git a/lang/talon/talon.py b/lang/talon/talon.py index 632360084e..7015410935 100644 --- a/lang/talon/talon.py +++ b/lang/talon/talon.py @@ -31,7 +31,7 @@ mod.list("talon_modes") ctx.matches = r""" -tag: user.talon +code.language: talon """ ctx.lists["user.code_common_function"] = { "insert": "insert", diff --git a/lang/talon/talon.talon b/lang/talon/talon.talon index 119b1e65bf..88828b9773 100644 --- a/lang/talon/talon.talon +++ b/lang/talon/talon.talon @@ -1,4 +1,4 @@ -tag: user.talon +code.language: talon - tag(): user.code_operators_math tag(): user.code_operators_assignment diff --git a/lang/terraform/terraform.py b/lang/terraform/terraform.py index 1dab33f262..5589d6710f 100644 --- a/lang/terraform/terraform.py +++ b/lang/terraform/terraform.py @@ -3,7 +3,7 @@ ctx = Context() mod = Module() ctx.matches = r""" -tag: user.terraform +code.language: terraform """ types = { diff --git a/lang/terraform/terraform.talon b/lang/terraform/terraform.talon index f17f9744fd..437258e402 100644 --- a/lang/terraform/terraform.talon +++ b/lang/terraform/terraform.talon @@ -1,4 +1,4 @@ -tag: user.terraform +code.language: terraform - tag(): user.code_comment_block_c_like tag(): user.code_comment_line diff --git a/lang/typescript/typescript.py b/lang/typescript/typescript.py index 29c02e2768..18c806912e 100644 --- a/lang/typescript/typescript.py +++ b/lang/typescript/typescript.py @@ -2,7 +2,10 @@ ctx = Context() ctx.matches = r""" -tag: user.typescript +code.language: typescript +code.language: typescriptreact +# Make typescript win over javascript +mode: command """ ctx.lists["user.code_type"] = { diff --git a/lang/typescript/typescript.talon b/lang/typescript/typescript.talon index c99fc11310..9e7f314e9f 100644 --- a/lang/typescript/typescript.talon +++ b/lang/typescript/typescript.talon @@ -1,6 +1,6 @@ -tag: user.typescript +code.language: typescript +code.language: typescriptreact - -tag(): user.javascript type union []: " | {code_type or ''}" type intersect []: " & {code_type or ''}" diff --git a/lang/typescript/typescriptreact.talon b/lang/typescript/typescriptreact.talon deleted file mode 100644 index 23c7dd2de5..0000000000 --- a/lang/typescript/typescriptreact.talon +++ /dev/null @@ -1,4 +0,0 @@ -tag: user.typescriptreact -- -tag(): user.typescript -tag(): user.javascriptreact diff --git a/lang/vimscript/vimscript.py b/lang/vimscript/vimscript.py index 8af5168a08..aa67d1a655 100644 --- a/lang/vimscript/vimscript.py +++ b/lang/vimscript/vimscript.py @@ -3,7 +3,7 @@ mod = Module() ctx = Context() ctx.matches = r""" -tag: user.vimscript +code.language: vimscript """ ctx.lists["self.vimscript_functions"] = { diff --git a/lang/vimscript/vimscript.talon b/lang/vimscript/vimscript.talon index 863b4bc289..03e3fa829f 100644 --- a/lang/vimscript/vimscript.talon +++ b/lang/vimscript/vimscript.talon @@ -1,4 +1,4 @@ -tag: user.vimscript +code.language: vimscript - tag(): user.code_imperative tag(): user.code_operators_assignment