dotfiles/talon/user/community/apps/visualstudio/visual_studio.py

248 lines
6.2 KiB
Python

# vs title tracking requires an extension
# https://marketplace.visualstudio.com/items?itemName=mayerwin.RenameVisualStudioWindowTitle
# https://github.com/mayerwin/vs-customize-window-title (VS 2022 support in releases)
# I currently configure the extension as below
# Document (no solution) open: [documentName] - [ideName]
# No document or solution open: [idleName]
# Solution in break mode: [documentName] - [parentPath]\[solutionName] (Debugging) - [ideName]
# Solution in design mode: [documentName] - [parentPath]\[solutionName] - [ideName]
# Solution in running mode: [documentName] - [parentPath]\[solutionName] (Running) - [ideName]
from talon import Context, Module, actions
# is_mac = app.platform == "mac"
ctx = Context()
mod = Module()
apps = mod.apps
apps.visual_studio = """
os: windows
and app.name: Microsoft Visual Studio 2022
os: windows
and app.name: Microsoft Visual Studio 2019
os: windows
and app.name: devenv.exe
"""
ctx.matches = r"""
app: visual_studio
"""
from talon import Context, actions
ctx = Context()
ctx.matches = r"""
os: windows
app: visual_studio
"""
@ctx.action_class("app")
class AppActions:
# talon app actions
def tab_close():
actions.key("ctrl-f4")
def tab_next():
actions.key("ctrl-tab")
def tab_previous():
actions.key("ctrl-shift-tab")
def tab_reopen():
actions.key("ctrl-1 ctrl-r enter")
@ctx.action_class("code")
class CodeActions:
# talon code actions
def toggle_comment():
actions.key("ctrl-k ctrl-/")
@ctx.action_class("edit")
class EditActions:
# talon edit actions
def indent_more():
actions.key("tab")
def indent_less():
actions.key("shift-tab")
def save_all():
actions.key("ctrl-shift-s")
def find_next():
actions.key("enter")
def find_previous():
actions.key("shift-enter")
def line_swap_up():
actions.key("alt-up")
def line_swap_down():
actions.key("alt-down")
def line_clone():
actions.key("ctrl-d")
def jump_line(n: int):
actions.key("ctrl-g")
actions.sleep("100ms")
actions.insert(str(n))
actions.key("enter")
@ctx.action_class("win")
class WinActions:
def filename():
title = actions.win.title()
# this doesn't seem to be necessary on VSCode for Mac
# if title == "":
# title = ui.active_window().doc
result = title.split("-")[0].rstrip()
if "." in result:
# print(result)
return result
return ""
@ctx.action_class("user")
class UserActions:
# def select_word(verb: str):
# actions.key("ctrl-w")
# actions.user.perform_selection_action(verb)
# def select_next_occurrence(verbs: str, text: str):
# actions.edit.find(text)
# actions.sleep("100ms")
# actions.key("esc")
# if verbs is not None:
# actions.user.perform_selection_action(verbs)
# def select_previous_occurrence(verbs: str, text: str):
# actions.edit.find(text)
# actions.key("shift-enter")
# actions.sleep("100ms")
# actions.key("esc")
# if verbs is not None:
# actions.user.perform_selection_action(verbs)
# def go_to_line(verb: str, line: int):
# actions.key("ctrl-g")
# actions.insert(str(line))
# actions.key("enter")
# if verb is not None:
# actions.user.perform_movement_action(verb)
# 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_everywhere(text: str):
"""Triggers find across project"""
actions.key("ctrl-shift-f")
if text:
actions.insert(text)
def find_toggle_match_by_case():
"""Toggles find match by case sensitivity"""
actions.key("alt-c")
def find_toggle_match_by_word():
"""Toggles find match by whole words"""
actions.key("alt-w")
def find_toggle_match_by_regex():
"""Toggles find match by regex"""
actions.key("alt-r")
def replace(text: str):
"""Search and replaces in the active editor"""
actions.key("ctrl-h")
if text:
actions.insert(text)
def replace_everywhere(text: str):
"""Search and replaces in the entire project"""
actions.key("ctrl-shift-h")
if text:
actions.insert(text)
def replace_confirm():
"""Confirm replace at current position"""
actions.key("alt-r")
def replace_confirm_all():
"""Confirm replace all"""
actions.key("alt-a")
def select_previous_occurrence(text: str):
actions.edit.find(text)
actions.key("shift-enter")
actions.sleep("100ms")
actions.key("esc")
def select_next_occurrence(text: str):
actions.edit.find(text)
actions.sleep("100ms")
actions.key("esc")
# find_and_replace.py support end
# multiple_cursor.py support begin
# note: visual studio has no explicit mode for multiple cursors; requires https://marketplace.visualstudio.com/items?itemName=VaclavNadrasky.MultiCaretBooster
def multi_cursor_add_above():
actions.key("shift-alt-up")
def multi_cursor_add_below():
actions.key("shift-alt-down")
# action(user.multi_cursor_add_to_line_ends): does not exist :(
def multi_cursor_disable():
actions.key("escape")
def multi_cursor_enable():
actions.skip()
def multi_cursor_select_all_occurrences():
actions.key("shift-alt-;")
def multi_cursor_select_fewer_occurrences():
actions.key("shift-alt-k")
def multi_cursor_select_more_occurrences():
actions.key("shift-alt->")