2 votos

¿Cómo puedo hacer que mi bloqueo de mayúsculas indique el idioma de entrada actual?

Después de una década en Linux, recientemente he hecho la transición a un MacBook ARM por su conveniencia y experiencia de usuario.

En mi antiguo HP con Linux, configuré el LED de Caps Lock para indicar cuando estaba activo el diseño de teclado búlgaro. Principalmente uso los idiomas de entrada inglés y búlgaro, por lo que sería ideal que el LED de Caps Lock se iluminara para búlgaro (y permaneciera apagado para inglés).

Ya he configurado mi tecla de Caps Lock para cambiar los idiomas de entrada en Mac. ¿Existe algún método sencillo para replicar el comportamiento del LED aquí?

Nota: Uso frecuentemente aplicaciones en modo de pantalla completa, ocultando la barra superior, por lo que prefiero un indicador visual de teclado para evitar la necesidad de salir de pantalla completa para verificar el idioma actual, reduciendo así errores de escritura.

¡Gracias de antemano!

5voto

benjarrell Puntos 98

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X