223 lines
5.3 KiB
Python
223 lines
5.3 KiB
Python
from talon import Context, actions, ui, Module, app, clip
|
|
|
|
is_mac = app.platform == "mac"
|
|
|
|
ctx = Context()
|
|
mod = Module()
|
|
mod.apps.vscode = """
|
|
os: mac
|
|
and app.bundle: com.microsoft.VSCode
|
|
"""
|
|
mod.apps.vscode = """
|
|
os: linux
|
|
and app.name: Code
|
|
os: linux
|
|
and app.name: code-oss
|
|
"""
|
|
mod.apps.vscode = """
|
|
os: windows
|
|
and app.name: Visual Studio Code
|
|
os: windows
|
|
and app.exe: Code.exe
|
|
"""
|
|
|
|
ctx.matches = r"""
|
|
app: vscode
|
|
"""
|
|
|
|
|
|
@ctx.action_class("win")
|
|
class win_actions:
|
|
def filename():
|
|
title = actions.win.title()
|
|
# this doesn't seem to be necessary on VSCode for Mac
|
|
# if title == "":
|
|
# title = ui.active_window().doc
|
|
|
|
if is_mac:
|
|
result = title.split(" — ")[0]
|
|
else:
|
|
result = title.split(" - ")[0]
|
|
|
|
if "." in result:
|
|
return result
|
|
|
|
return ""
|
|
|
|
|
|
@ctx.action_class("edit")
|
|
class edit_actions:
|
|
def find(text: str):
|
|
if is_mac:
|
|
actions.key("cmd-f")
|
|
else:
|
|
actions.key("ctrl-f")
|
|
|
|
actions.insert(text)
|
|
|
|
def line_swap_up():
|
|
actions.key("alt-up")
|
|
|
|
def line_swap_down():
|
|
actions.key("alt-down")
|
|
|
|
def line_clone():
|
|
actions.key("shift-alt-down")
|
|
|
|
def jump_line(n: int):
|
|
actions.user.vscode("workbench.action.gotoLine")
|
|
actions.insert(str(n))
|
|
actions.key("enter")
|
|
actions.edit.line_start()
|
|
|
|
|
|
@mod.action_class
|
|
class Actions:
|
|
def vscode_terminal(number: int):
|
|
"""Activate a terminal by number"""
|
|
actions.user.vscode(f"workbench.action.terminal.focusAtIndex{number}")
|
|
|
|
|
|
@ctx.action_class("user")
|
|
class user_actions:
|
|
# snippet.py support beginHelp close
|
|
def snippet_search(text: str):
|
|
actions.user.vscode("editor.action.insertSnippet")
|
|
actions.insert(text)
|
|
|
|
def snippet_insert(text: str):
|
|
"""Inserts a snippet"""
|
|
actions.user.vscode("editor.action.insertSnippet")
|
|
actions.insert(text)
|
|
actions.key("enter")
|
|
|
|
def snippet_create():
|
|
"""Triggers snippet creation"""
|
|
actions.user.vscode("workbench.action.openSnippets")
|
|
|
|
# snippet.py support end
|
|
|
|
def tab_jump(number: int):
|
|
if number < 10:
|
|
if is_mac:
|
|
actions.key("ctrl-{}".format(number))
|
|
else:
|
|
actions.key("alt-{}".format(number))
|
|
|
|
def tab_final():
|
|
if is_mac:
|
|
actions.key("ctrl-0")
|
|
else:
|
|
actions.key("alt-0")
|
|
|
|
# splits.py support begin
|
|
def split_number(index: int):
|
|
"""Navigates to a the specified split"""
|
|
if index < 9:
|
|
if is_mac:
|
|
actions.key("cmd-{}".format(index))
|
|
else:
|
|
actions.key("ctrl-{}".format(index))
|
|
|
|
# splits.py support end
|
|
|
|
# find_and_replace.py support begin
|
|
|
|
def find(text: str):
|
|
"""Triggers find in current editor"""
|
|
if is_mac:
|
|
actions.key("cmd-f")
|
|
else:
|
|
actions.key("ctrl-f")
|
|
|
|
if text:
|
|
actions.insert(text)
|
|
|
|
def find_next():
|
|
actions.user.vscode("editor.action.nextMatchFindAction")
|
|
|
|
def find_previous():
|
|
actions.user.vscode("editor.action.previousMatchFindAction")
|
|
|
|
def find_everywhere(text: str):
|
|
"""Triggers find across project"""
|
|
if is_mac:
|
|
actions.key("cmd-shift-f")
|
|
else:
|
|
actions.key("ctrl-shift-f")
|
|
|
|
if text:
|
|
actions.insert(text)
|
|
|
|
def find_toggle_match_by_case():
|
|
"""Toggles find match by case sensitivity"""
|
|
if is_mac:
|
|
actions.key("alt-cmd-c")
|
|
else:
|
|
actions.key("alt-c")
|
|
|
|
def find_toggle_match_by_word():
|
|
"""Toggles find match by whole words"""
|
|
if is_mac:
|
|
actions.key("cmd-alt-w")
|
|
else:
|
|
actions.key("alt-w")
|
|
|
|
def find_toggle_match_by_regex():
|
|
"""Toggles find match by regex"""
|
|
if is_mac:
|
|
actions.key("cmd-alt-r")
|
|
else:
|
|
actions.key("alt-r")
|
|
|
|
def replace(text: str):
|
|
"""Search and replaces in the active editor"""
|
|
if is_mac:
|
|
actions.key("alt-cmd-f")
|
|
else:
|
|
actions.key("ctrl-h")
|
|
|
|
if text:
|
|
actions.insert(text)
|
|
|
|
def replace_everywhere(text: str):
|
|
"""Search and replaces in the entire project"""
|
|
if is_mac:
|
|
actions.key("cmd-shift-h")
|
|
else:
|
|
actions.key("ctrl-shift-h")
|
|
|
|
if text:
|
|
actions.insert(text)
|
|
|
|
def replace_confirm():
|
|
"""Confirm replace at current position"""
|
|
if is_mac:
|
|
actions.key("shift-cmd-1")
|
|
else:
|
|
actions.key("ctrl-shift-1")
|
|
|
|
def replace_confirm_all():
|
|
"""Confirm replace all"""
|
|
if is_mac:
|
|
actions.key("cmd-enter")
|
|
else:
|
|
actions.key("ctrl-alt-enter")
|
|
|
|
def select_previous_occurrence(text: str):
|
|
actions.edit.find(text)
|
|
actions.sleep("100ms")
|
|
actions.key("shift-enter esc")
|
|
|
|
def select_next_occurrence(text: str):
|
|
actions.edit.find(text)
|
|
actions.sleep("100ms")
|
|
actions.key("esc")
|
|
|
|
def select_next_token():
|
|
actions.edit.find("")
|
|
actions.key("enter")
|
|
actions.key("enter")
|
|
actions.key("esc")
|
|
|
|
# find_and_replace.py support end
|