De acuerdo, he desarrollado una solución que creo que será beneficiosa para los Mac con Apple Silicon que ejecutan Sonoma y probablemente compatible con otras versiones de macOS también. Mi enfoque utiliza un script bash para gestionar el LED de Caps Lock basado en el diseño del teclado, activándolo para diseños distintos a "U.S." y desactivándolo para el diseño "U.S.". Este script es eficiente tanto en CPU como en batería.
Utiliza una versión Mac del binario setleds, similar al que se encuentra en Linux, disponible aquí: https://github.com/damieng/setledsmac.
A continuación se muestra el script bash, completo con opciones --install, --uninstall y --help para mayor comodidad.
#!/bin/bash
# Esta es la ruta donde setleds reside en mi máquina
export PATH=$PATH:$HOME/Tools/Shell
# Define la ruta de plist
plist_path="$HOME/Library/LaunchAgents/com.example.keyboardlayoutmonitor.plist"
plist_label="com.example.keyboardlayoutmonitor"
# Obtiene la ruta completa del script actual
script_path=$(realpath "$BASH_SOURCE")
function install_service {
# Crea un directorio de LaunchAgents si no existe
mkdir -p "$HOME/Library/LaunchAgents"
# Crea el archivo plist
cat << EOF > "$plist_path"
Label
$plist_label
ProgramArguments
$script_path
--main
RunAtLoad
KeepAlive
EOF
# Carga el plist para iniciar el servicio
launchctl load "$plist_path"
echo "Servicio instalado y iniciado."
}
function uninstall_service {
# Descarga el plist para detener el servicio
launchctl unload "$plist_path"
# Elimina el archivo plist
rm -f "$plist_path"
echo "Servicio desinstalado."
}
function show_help {
echo "Uso: $(basename "$0") [OPCIÓN]"
echo "--install Instala el servicio para iniciar automáticamente al iniciar sesión de usuario."
echo "--uninstall Desinstala y detiene el servicio, eliminándolo del inicio automático."
echo "--help Muestra esta ayuda y sale."
echo "--main Ejecuta la funcionalidad principal del script. Destinado para uso interno cuando se inicia el servicio."
echo ""
echo "La opción --install configura el servicio para ser ejecutado automáticamente al iniciar sesión de usuario a través de launchd, asegurando que el script se ejecute en segundo plano y monitoree los cambios en el diseño del teclado."
}
function main_execution {
# Especifica la ubicación del archivo de registro en StudlyCase
log_file="$HOME/Library/Logs/KeyboardLayoutMonitor.log"
# Redirigiendo la salida estándar y el error estándar al archivo de registro
exec >> "$log_file" 2>&1
# La función main_execution existente continúa aquí...
# Inicializa la variable de diseño anterior
previous_layout=""
while true; do
current_layout=$(defaults read ~/Library/Preferences/com.apple.HIToolbox.plist AppleSelectedInputSources | grep -o '"KeyboardLayout Name" = "[^"]*"' | awk -F'"' '{print $(NF-1)}' | head -n 1)
# Solo actualiza LED si ha cambiado el diseño
if [ "$current_layout" != "$previous_layout" ]; then
if [ "$current_layout" == "U.S." ]; then
setleds -caps > /dev/null
else
setleds +caps > /dev/null
fi
# Actualiza el diseño anterior al diseño actual
previous_layout="$current_layout"
fi
sleep 0.25
done
}
# Lógica principal del script para el manejo de parámetros
case "$1" in
--install)
install_service
;;
--uninstall)
uninstall_service
;;
--help)
show_help
;;
--main)
main_execution
;;
*)
echo "Error: Argumento no válido."
show_help
;;
esac