From 24b848aef63d7e3dc5a2cb487e9880564359b058 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 1 Aug 2026 19:03:25 +0200 Subject: [PATCH 1/7] Unpin pre-commit version --- .github/workflows/pre-commit.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 8f51614507..869bafd91c 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -36,10 +36,6 @@ jobs: - name: Install luarocks uses: leafo/gh-actions-luarocks@v6 - # Pin pre-commit to a specific version to avoid breaking changes. - - name: Install pre-commit - run: python -m pip install pre-commit==4.5.1 - - name: Run pre-commit hooks uses: pre-commit/action@v3.0.1 From 9908aa1d0bea5332974a53250fd793a5e6e26ca2 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sat, 1 Aug 2026 19:04:10 +0200 Subject: [PATCH 2/7] Updated talon-tools rev to v0.11.2 --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a57f57b718..4bbfc98410 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -98,7 +98,7 @@ repos: - id: ruff-format - repo: https://github.com/cursorless-dev/talon-tools - rev: v0.9.0 + rev: v0.11.2 hooks: - id: talon-fmt - id: tree-sitter-fmt From 217c6583f5cb301bd311e349e496ea453bdb2aa9 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 16 Aug 2026 11:16:39 +0200 Subject: [PATCH 3/7] Testing disabling actions --- .github/workflows/codeql.yml | 2 +- .github/workflows/deploy.yml | 8 ++++---- .github/workflows/pre-commit.yml | 24 ++++++++++++------------ .github/workflows/test.yml | 8 ++++---- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 6c257088b8..f9ac046b40 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -45,7 +45,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4f7e0ea79f..e2768df0f7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: # This is needed to get the number of commits in the current branch fetch-depth: 0 @@ -58,7 +58,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: # Deploy the exact commit that passed the test workflow. ref: ${{ github.event.workflow_run.head_sha }} @@ -72,7 +72,7 @@ jobs: CURSORLESS_DEPLOY: true - name: Checkout cursorless.nvim plugin repo - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: token: ${{ secrets.CURSORLESS_BOT_TOKEN }} repository: hands-free-vim/cursorless.nvim @@ -107,7 +107,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: fetch-depth: 0 token: ${{ secrets.CURSORLESS_BOT_TOKEN }} diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 869bafd91c..b37a1f7466 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -20,21 +20,21 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Setup python - uses: actions/setup-python@v6 + uses: actions/setup-python@v7 with: python-version-file: "pyproject.toml" - - name: Set up Node.js - uses: ./.github/actions/setup-node + # - name: Set up Node.js + # uses: ./.github/actions/setup-node - - name: Install lua - uses: leafo/gh-actions-lua@v12 + # - name: Install lua + # uses: leafo/gh-actions-lua@v12 - - name: Install luarocks - uses: leafo/gh-actions-luarocks@v6 + # - name: Install luarocks + # uses: leafo/gh-actions-luarocks@v6 - name: Run pre-commit hooks uses: pre-commit/action@v3.0.1 @@ -43,7 +43,7 @@ jobs: uses: pre-commit-ci/lite-action@v1.1.0 if: always() - - name: Pyright - uses: jakebailey/pyright-action@v3 - with: - pylance-version: latest-release + # - name: Pyright + # uses: jakebailey/pyright-action@v3 + # with: + # pylance-version: latest-release diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a0f78a81cf..5afe63ea66 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up Node.js uses: ./.github/actions/setup-node @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up Node.js uses: ./.github/actions/setup-node @@ -66,7 +66,7 @@ jobs: run: git config --global core.autocrlf false - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up Node.js uses: ./.github/actions/setup-node @@ -160,7 +160,7 @@ jobs: run: git config --global core.autocrlf false - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up Node.js uses: ./.github/actions/setup-node From 9e1dd7535c628507c203332548e3606d70c50ff1 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 16 Aug 2026 11:19:02 +0200 Subject: [PATCH 4/7] test --- .github/workflows/pre-commit.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index b37a1f7466..416fde796e 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -30,11 +30,11 @@ jobs: # - name: Set up Node.js # uses: ./.github/actions/setup-node - # - name: Install lua - # uses: leafo/gh-actions-lua@v12 + - name: Install lua + uses: leafo/gh-actions-lua@v12 - # - name: Install luarocks - # uses: leafo/gh-actions-luarocks@v6 + - name: Install luarocks + uses: leafo/gh-actions-luarocks@v6 - name: Run pre-commit hooks uses: pre-commit/action@v3.0.1 @@ -43,7 +43,7 @@ jobs: uses: pre-commit-ci/lite-action@v1.1.0 if: always() - # - name: Pyright - # uses: jakebailey/pyright-action@v3 - # with: - # pylance-version: latest-release + - name: Pyright + uses: jakebailey/pyright-action@v3 + with: + pylance-version: latest-release From e5e365450bf8e25811cfe35aadbe11d0eb0d0834 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 16 Aug 2026 11:26:43 +0200 Subject: [PATCH 5/7] Test --- .github/workflows/pre-commit.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 416fde796e..51fa94b129 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -27,8 +27,8 @@ jobs: with: python-version-file: "pyproject.toml" - # - name: Set up Node.js - # uses: ./.github/actions/setup-node + - name: Set up Node.js + uses: ./.github/actions/setup-node - name: Install lua uses: leafo/gh-actions-lua@v12 @@ -36,6 +36,10 @@ jobs: - name: Install luarocks uses: leafo/gh-actions-luarocks@v6 + # Pin pre-commit to a specific version to avoid breaking changes. + - name: Install pre-commit + run: python -m pip install pre-commit==4.5.1 + - name: Run pre-commit hooks uses: pre-commit/action@v3.0.1 From 390e3ebcae9c7b297b3c99353661de2cb67d4805 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 16 Aug 2026 11:56:42 +0200 Subject: [PATCH 6/7] Enabled more ruff rules --- .github/workflows/pre-commit.yml | 2 +- cursorless-talon/src/actions/actions.py | 10 ++++----- cursorless-talon/src/actions/call.py | 6 +++-- .../src/actions/execute_command.py | 8 +++++-- cursorless-talon/src/apps/vscode_settings.py | 3 +-- cursorless-talon/src/csv_overrides.py | 4 ++-- cursorless-talon/src/fallback.py | 4 ++-- cursorless-talon/src/snippets/snippets.py | 4 ++-- cursorless-talon/src/targets/destination.py | 4 +++- pyproject.toml | 22 +++++++++++++++++-- 10 files changed, 46 insertions(+), 21 deletions(-) diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 51fa94b129..bae47ac7b9 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -36,7 +36,7 @@ jobs: - name: Install luarocks uses: leafo/gh-actions-luarocks@v6 - # Pin pre-commit to a specific version to avoid breaking changes. + # Pin pre-commit to a specific version to avoid breaking changes. - name: Install pre-commit run: python -m pip install pre-commit==4.5.1 diff --git a/cursorless-talon/src/actions/actions.py b/cursorless-talon/src/actions/actions.py index deb21a699e..6e49ff5c94 100644 --- a/cursorless-talon/src/actions/actions.py +++ b/cursorless-talon/src/actions/actions.py @@ -66,11 +66,11 @@ @mod.capture( rule=( - "{user.cursorless_simple_action} |" - "{user.cursorless_experimental_action} |" - "{user.cursorless_callback_action} |" - "{user.cursorless_call_action} |" - "{user.cursorless_custom_action}" + "{user.cursorless_simple_action}" + "| {user.cursorless_experimental_action}" + "| {user.cursorless_callback_action}" + "| {user.cursorless_call_action}" + "| {user.cursorless_custom_action}" ) ) def cursorless_action_or_ide_command(m) -> dict[str, str]: diff --git a/cursorless-talon/src/actions/call.py b/cursorless-talon/src/actions/call.py index c0229ce9a4..106319a1b2 100644 --- a/cursorless-talon/src/actions/call.py +++ b/cursorless-talon/src/actions/call.py @@ -1,3 +1,5 @@ +from typing import Optional + from talon import Module, actions from ..targets.target_types import CursorlessTarget, ImplicitTarget @@ -11,13 +13,13 @@ class Actions: @staticmethod def private_cursorless_call( callee: CursorlessTarget, - argument: CursorlessTarget = ImplicitTarget(), + argument: Optional[CursorlessTarget] = None, ): """Execute Cursorless call action""" actions.user.private_cursorless_command_and_wait( { "name": "callAsFunction", "callee": callee, - "argument": argument, + "argument": argument or ImplicitTarget(), } ) diff --git a/cursorless-talon/src/actions/execute_command.py b/cursorless-talon/src/actions/execute_command.py index 067fc14488..4b0bed2636 100644 --- a/cursorless-talon/src/actions/execute_command.py +++ b/cursorless-talon/src/actions/execute_command.py @@ -1,17 +1,21 @@ +from typing import Optional + from talon import actions from ..targets.target_types import CursorlessTarget def cursorless_execute_command_action( - command_id: str, target: CursorlessTarget, command_options: dict = {} + command_id: str, + target: CursorlessTarget, + command_options: Optional[dict] = None, ): """Execute Cursorless execute command action""" actions.user.private_cursorless_command_and_wait( { "name": "executeCommand", "commandId": command_id, - "options": command_options, + "options": command_options or {}, "target": target, } ) diff --git a/cursorless-talon/src/apps/vscode_settings.py b/cursorless-talon/src/apps/vscode_settings.py index 8304051552..10fddeaaf0 100644 --- a/cursorless-talon/src/apps/vscode_settings.py +++ b/cursorless-talon/src/apps/vscode_settings.py @@ -37,8 +37,7 @@ def vscode_get_setting(key: str, default_value: Any = None): if default_value is not None: return settings.get(key, default_value) - else: - return settings[key] + return settings[key] @staticmethod def vscode_get_setting_with_fallback( diff --git a/cursorless-talon/src/csv_overrides.py b/cursorless-talon/src/csv_overrides.py index 57d78448d5..0041437784 100644 --- a/cursorless-talon/src/csv_overrides.py +++ b/cursorless-talon/src/csv_overrides.py @@ -210,7 +210,7 @@ def unsubscribe() -> None: def check_for_duplicates(filename: str, default_values: ListToSpokenForms): results_map = {} for list_name, values in default_values.items(): - for key, value in values.items(): + for _key, value in values.items(): if value in results_map: existing_list_name = results_map[value] warning = f"WARNING ({filename}): Value `{value}` duplicated between lists '{existing_list_name}' and '{list_name}'" @@ -233,7 +233,7 @@ def create_default_vocabulary_dicts( updated_dict: dict[str, str] = {} for key2, value2 in value.items(): # Enable deactivated(prefixed with a `-`) items - active_key = key2[1:] if key2.startswith("-") else key2 + active_key = key2.removeprefix("-") if active_key: updated_dict[active_key] = value2 default_values_updated[key] = updated_dict diff --git a/cursorless-talon/src/fallback.py b/cursorless-talon/src/fallback.py index f3c3541b29..cfd65de5b0 100644 --- a/cursorless-talon/src/fallback.py +++ b/cursorless-talon/src/fallback.py @@ -113,5 +113,5 @@ def get_modifier_callback(modifier: dict) -> Callable: def get_simple_modifier_callback(key: str) -> Callable: try: return modifier_callbacks[key] - except KeyError: - raise ValueError(f"Unknown Cursorless fallback modifier: {key}") + except KeyError as e: + raise ValueError(f"Unknown Cursorless fallback modifier: {key}") from e diff --git a/cursorless-talon/src/snippets/snippets.py b/cursorless-talon/src/snippets/snippets.py index 651e331bcd..dc240f5b23 100644 --- a/cursorless-talon/src/snippets/snippets.py +++ b/cursorless-talon/src/snippets/snippets.py @@ -38,7 +38,7 @@ class Actions: @staticmethod def cursorless_insert_snippet( body: str, - destination: CursorlessDestination = ImplicitDestination(), + destination: Optional[CursorlessDestination] = None, scope_type: Optional[Union[str, list[str]]] = None, ): """Cursorless: Insert custom snippet """ @@ -48,7 +48,7 @@ def cursorless_insert_snippet( languages=None, substitutions=None, ) - action = InsertSnippetAction(snippet, destination) + action = InsertSnippetAction(snippet, destination or ImplicitDestination()) actions.user.private_cursorless_command_and_wait(action) @staticmethod diff --git a/cursorless-talon/src/targets/destination.py b/cursorless-talon/src/targets/destination.py index 0c01864942..8e67d484fe 100644 --- a/cursorless-talon/src/targets/destination.py +++ b/cursorless-talon/src/targets/destination.py @@ -33,7 +33,9 @@ def cursorless_destination(m) -> Union[ListDestination, PrimitiveDestination]: destinations = [ PrimitiveDestination(insertion_mode, target) for insertion_mode, target in zip( - m.cursorless_insertion_mode_list, m.cursorless_target_list + m.cursorless_insertion_mode_list, + m.cursorless_target_list, + strict=True, ) ] diff --git a/pyproject.toml b/pyproject.toml index 57d1332569..1bdb262470 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,8 +10,26 @@ target-version = "py311" extend-exclude = ["vendor", "resources/playground"] [tool.ruff.lint] -select = ["E", "F", "C4", "I001", "UP", "SIM", "FLY"] -ignore = ["E501", "SIM105", "UP007", "UP035", "UP045"] +select = [ + "E", # pycodestyle + "F", # Pyflakes + "UP", # pyupgrade + "B", # flake8-bugbear + "SIM", # flake8-simplify + "I", # isort + "C4", # Catch incorrect use of comprehensions, dict, list, etc + "ICN", # Use common import conventions + "RET", # Good return practices + "FURB", # Suggest more idiomatic Python patterns + "FLY", # Checks for str.join calls that can be replaced with f-strings. +] +ignore = [ + "E501", # Line too long + "SIM105", # Alow try-except-pass instead of contextlib.suppress({exception}) + "UP007", # Union[X, Y] -> X | Y not supported in Talon 0.4 actions + "UP045", # Optional[X] -> X | None not supported in Talon 0.4 actions + "UP035", # Deprecated import +] [tool.pyright] pythonVersion = "3.11" From 686c85b116df4fd9d41326d412bf0c211d1eb6e2 Mon Sep 17 00:00:00 2001 From: Andreas Arvidsson Date: Sun, 16 Aug 2026 11:59:23 +0200 Subject: [PATCH 7/7] Restore action list --- cursorless-talon/src/actions/actions.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cursorless-talon/src/actions/actions.py b/cursorless-talon/src/actions/actions.py index 6e49ff5c94..deb21a699e 100644 --- a/cursorless-talon/src/actions/actions.py +++ b/cursorless-talon/src/actions/actions.py @@ -66,11 +66,11 @@ @mod.capture( rule=( - "{user.cursorless_simple_action}" - "| {user.cursorless_experimental_action}" - "| {user.cursorless_callback_action}" - "| {user.cursorless_call_action}" - "| {user.cursorless_custom_action}" + "{user.cursorless_simple_action} |" + "{user.cursorless_experimental_action} |" + "{user.cursorless_callback_action} |" + "{user.cursorless_call_action} |" + "{user.cursorless_custom_action}" ) ) def cursorless_action_or_ide_command(m) -> dict[str, str]: