dotfiles/talon/community/community-cursorless-0.4.0/apps/win/wsl/wsl.py
2024-11-16 20:27:38 -07:00

205 lines
5.8 KiB
Python

from talon import Context, Module, actions, imgui, settings, ui, app
import os
import subprocess
mod = Module()
mod.apps.ubuntu = """
os: windows
and app.name: ubuntu.exe
"""
ctx = Context()
ctx.matches = r"""
app: ubuntu
app: windows_terminal
and win.title: /Ubuntu/
"""
directories_to_remap = {}
directories_to_exclude = {}
user_path = os.path.expanduser("~")
if app.platform == "windows":
is_windows = True
import ctypes
GetUserNameEx = ctypes.windll.secur32.GetUserNameExW
NameDisplay = 3
size = ctypes.pointer(ctypes.c_ulong(0))
GetUserNameEx(NameDisplay, None, size)
nameBuffer = ctypes.create_unicode_buffer(size.contents.value)
GetUserNameEx(NameDisplay, nameBuffer, size)
one_drive_path = os.path.expanduser(os.path.join("~", "OneDrive"))
# this is probably not the correct way to check for onedrive, quick and dirty
if os.path.isdir(os.path.expanduser(os.path.join("~", r"OneDrive\Desktop"))):
default_folder = os.path.join("~", "Desktop")
directories_to_remap = {
"Desktop": os.path.join(one_drive_path, "Desktop"),
"Documents": os.path.join(one_drive_path, "Documents"),
"Downloads": os.path.join(user_path, "Downloads"),
"Music": os.path.join(user_path, "Music"),
"OneDrive": one_drive_path,
"Pictures": os.path.join(one_drive_path, "Pictures"),
"Videos": os.path.join(user_path, "Videos"),
}
else:
# todo use expanduser for cross platform support
directories_to_remap = {
"Desktop": os.path.join(user_path, "Desktop"),
"Documents": os.path.join(user_path, "Documents"),
"Downloads": os.path.join(user_path, "Downloads"),
"Music": os.path.join(user_path, "Music"),
"OneDrive": one_drive_path,
"Pictures": os.path.join(user_path, "Pictures"),
"Videos": os.path.join(user_path, "Videos"),
}
def get_win_path(wsl_path):
path = ""
try:
path = (
subprocess.check_output(["wsl", "wslpath", "-w", wsl_path])
.strip(b"\n")
.decode()
)
except:
path = ""
return path
def get_usr_path():
path = ""
try:
path = (
subprocess.check_output(["wsl", "wslpath", "-a", "~"]).strip(b"\n").decode()
)
except:
path = ""
return path
def get_wsl_path(win_path):
path = ""
try:
path = (
subprocess.check_output(["wsl", "wslpath", "-u", "'{}'".format(win_path)])
.strip(b"\n")
.decode()
)
except:
path = ""
return path
@ctx.action_class("user")
class user_actions:
def file_manager_refresh_title():
actions.skip()
def file_manager_current_path():
path = ui.active_window().title
try:
path = path.split(":")[1].lstrip()
except:
path = ""
# print("current: " + path)
if "~" in path:
# the only way I could find to correctly support the user folder:
# get absolute path of ~, and strip /mnt/x from the string
abs_usr_path = get_usr_path()
abs_usr_path = abs_usr_path[abs_usr_path.find("/home") : len(abs_usr_path)]
path = path.replace("~", abs_usr_path)
path = get_win_path(path)
if path in directories_to_remap:
path = directories_to_remap[path]
if path in directories_to_exclude:
path = ""
return path
# def file_manager_terminal_here():
# actions.key("ctrl-l")
# actions.insert("cmd.exe")
# actions.key("enter")
# def file_manager_show_properties():
# """Shows the properties for the file"""
# actions.key("alt-enter")
def file_manager_open_user_directory(path: str):
"""expands and opens the user directory"""
if path in directories_to_remap:
path = directories_to_remap[path]
path = os.path.expanduser(os.path.join("~", path))
if ":" in path:
path = get_wsl_path(path)
actions.user.file_manager_open_directory(path)
def file_manager_open_directory(path: str):
"""opens the directory that's already visible in the view"""
if ":" in str(path):
path = get_wsl_path(path)
actions.insert('cd "{}"'.format(path))
actions.key("enter")
actions.user.file_manager_refresh_title()
def file_manager_select_directory(path: str):
"""selects the directory"""
actions.insert('"{}"'.format(path))
def file_manager_new_folder(name: str):
"""Creates a new folder in a gui filemanager or inserts the command to do so for terminals"""
actions.insert('mkdir "{}"'.format(name))
def file_manager_open_file(path: str):
actions.insert(path)
# actions.key("enter")
def file_manager_select_file(path: str):
actions.insert(path)
def file_manager_open_volume(volume: str):
actions.user.file_manager_open_directory(volume)
def terminal_list_directories():
actions.insert("ls")
actions.key("enter")
def terminal_list_all_directories():
actions.insert("ls -a")
actions.key("enter")
def terminal_change_directory(path: str):
actions.insert("cd {}".format(path))
if path:
actions.key("enter")
def terminal_change_directory_root():
"""Root of current drive"""
actions.insert("cd /")
actions.key("enter")
def terminal_clear_screen():
"""Clear screen"""
actions.key("ctrl-l")
def terminal_run_last():
actions.key("up enter")
def terminal_kill_all():
actions.key("ctrl-c")
actions.insert("y")
actions.key("enter")