---
name: powertoys_shortcut_add
kind: function
lang: py
domain: infra
version: "1.0.0"
purity: impure
signature: "def powertoys_shortcut_add(keys: list[str], target_path: str, args: str = \"\", elevated: bool = False, exact_match: bool = False, start_in_dir: str = \"\", config_path: str | None = None) -> None"
description: "Añade o reemplaza un atajo global en el config de PowerToys Keyboard Manager. Convierte nombres legibles de teclas a VK codes y escribe JSON compacto (una linea) para mantener compatibilidad con el formato de PowerToys."
tags: [powertoys, keyboard, windows, wsl, shortcut, config, write, add]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_py_core"
imports: [json, os]
params:
  - name: keys
    desc: "Lista de nombres de teclas (case-insensitive). Ej: ['lctrl', 'lalt', 't']. Modificadores: lctrl/rctrl/ctrl, lalt/ralt/alt, lshift/rshift/shift, lwin/rwin/win. Letras: a-z. Digitos: 0-9. F-keys: f1-f12. Especiales: space, enter, tab, esc."
  - name: target_path
    desc: "Path Windows al ejecutable. Ej: 'C:\\\\Windows\\\\System32\\\\wt.exe'."
  - name: args
    desc: "Argumentos de linea de comandos para el programa (default vacio)."
  - name: elevated
    desc: "Si True, lanza el programa elevado (runProgramElevationLevel=1). Default False."
  - name: exact_match
    desc: "Si True, el atajo requiere coincidencia exacta de teclas. Default False."
  - name: start_in_dir
    desc: "Directorio de trabajo para el programa. Default string vacio."
  - name: config_path
    desc: "Path al default.json. Si None, usa $POWERTOYS_CONFIG o el path WSL por defecto para $USER."
output: "None. Modifica el archivo default.json en disco."
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/infra/powertoys_shortcut_add.py"
notes: |
  error_py_core no existe en el registry. Esta funcion lanza excepciones nativas de Python:
  FileNotFoundError si config_path no existe, json.JSONDecodeError si el JSON es invalido,
  ValueError si un nombre de tecla no esta en VK_CODES.

  El JSON se escribe en formato compacto (separators=(",", ":")) — sin espacios ni saltos de linea —
  para mantener compatibilidad con el formato que usa PowerToys en el archivo original.

  El dict VK_CODES mapea "ctrl"->162, "alt"->164, "shift"->160, "win"->91 como aliases
  a las variantes izquierdas. Para especificar side derecho, usar "rctrl", "ralt", etc.

  Si ya existe una entrada con los mismos originalKeys, la reemplaza en su posicion original.
---

## Ejemplo

```python
from infra.powertoys_shortcut_add import powertoys_shortcut_add

# Anadir Ctrl+Alt+T -> Windows Terminal
powertoys_shortcut_add(
    keys=["lctrl", "lalt", "t"],
    target_path=r"C:\Windows\System32\wt.exe",
    start_in_dir=r"C:\Users\lucas",
)

# Anadir Win+Shift+E -> Explorer elevado
powertoys_shortcut_add(
    keys=["win", "shift", "e"],
    target_path=r"C:\Windows\explorer.exe",
    elevated=True,
)
```

## Notas

Despues de modificar el config, PowerToys necesita reiniciarse para detectar los cambios.
Usar `powertoys_restart_py_infra` para recargar la configuracion automaticamente.
