Tengo un MacBook Pro con teclado americano, pero también uso un teclado Bluetooth con distribución española. Para recorrer Windows uso comando+` en el teclado incorporado, pero cuando estoy usando el teclado español esto no funciona y tengo que cambiar el atajo a comando+º (es la tecla que está en la posición correspondiente encima del tabulador). ¿Hay alguna forma de cambiar rápida o automáticamente este atajo para no tener que abrir la ventana de ajustes cada vez que cambio la fuente de entrada?
Respuesta
¿Demasiados anuncios?Respuesta actualizada
El objetivo de esta actualización es proporcionar una solución totalmente automatizada al cambio de atajo de teclado utilizado para Preferencias del sistema > Teclado > Atajos > Teclado > Mover el foco a la siguiente ventana cuando el usuario cambia entre Inglés y Español - ISO en el Entrada menú de la barra de menús y entre el uso de la Inglés americano teclado y el adjunto Bluetooth teclado con un Español - ISO diseño.
Hubo un tiempo en que se podía utilizar PlistBuddy
y o defaults
en Mac OS X/OS X para modificar una entrada en el com.apple.symbolichotkeys.plist archivo para llevar a cabo esta tarea y se actualizaría automáticamente, sin embargo, la actualización ya no es posible en MacOS sin reiniciar. Como resultado, esto se logrará mediante el uso de AppleScript dirigido por osascript
como Agente de lanzamiento y Guiones de interfaz de usuario de la atajo de teclado para Preferencias del sistema > Teclado > Atajos > Teclado > Mover el foco a la siguiente ventana sin tener que reiniciar.
El ejemplo AppleScript código que se muestra más abajo, fue probado y funcionó para mí sin problemas como es bajo MacOS Catalina 10.15.7 y MacOS Big Sur 11.2.2 como shell script utilizando un #!/usr/bin/osascript
shebang y un Agente de lanzamiento que vigila los cambios en el com.apple.HIToolbox.plist archivo y los cambios en el valor de su AppleCurrentKeyboardLayoutInputSourceID clave . También comprueba el valor de parámetros de la AppleSymbolicHotKeys para el objetivo atajo de teclado (27 en este caso de uso), en el com.apple.symbolichotkeys.plist archivo para garantizar los cambios en el com.apple.HIToolbox.plist archivo sólo se activan cuando se cambia de objetivo atajo de teclado porque el método de entrada del teclado ha cambiado.
Los siguientes pasos son necesarios para implementar esta solución y una vez completada, es totalmente automática a partir de entonces, hasta que el Agente de lanzamiento es se detuvo , descargado y se retira cuando ya no se necesita o no se desea.
Crear el shell script :
Sugerencia: Copiar y pegar el comandos del shell de aquí a Terminal y utilizar el mismo ventana hasta que esté completamente terminado.
En Terminal , suponiendo que el pwd
es su Inicio directorio :
touch changeKSforMFTNW; open -e changeKSforMFTNW; chmod +x changeKSforMFTNW
Copiar y pegar el ejemplo AppleScript código que se muestra más abajo, en el changeKSforMFTNW documento y luego guardar y cerrar el documento .
De vuelta en Terminal :
[ ! -d '/usr/local/bin/' ] && sudo mkdir /usr/local/bin/
sudo mv -v changeKSforMFTNW /usr/local/bin/
sudo -k
Cree el Agente de Lanzamiento:
Con la shell script de la que se ha ocupado, cree el Agente de lanzamiento en Terminal , suponiendo que el pwd
es su Inicio directorio :
cd Library
[ ! -d 'LaunchAgents' ] && mkdir LaunchAgents
cd LaunchAgents
touch com.my.change.KS.for.MFTNW.plist
open -e com.my.change.KS.for.MFTNW.plist
Copiar y pegar el ejemplo XML Plist código que se muestra más abajo, en el com.mi.cambio.KS.para.MFTNW.plist documento y cambiar you
en el valor para WatchPaths a su Inicio directorio y luego guardar y cerrar el documento .
Con el com.mi.cambio.KS.para.MFTNW.plist archivo y antes de cargando como el Agente de lanzamiento , osascript
debe añadirse a Preferencias del sistema > Seguridad y privacidad > Privacidad > Accesibilidad . Para ello, en Terminal Ejecutar open /usr/bin
y en el Buscador ventana que se abre a /usr/bin
localizar el osascript
archivo para poder arrastrarlo y soltarlo en el siguiente paso.
Abrir Preferencias del sistema a Seguridad y privacidad > Privacidad > Accesibilidad y haga clic en el botón Cerradura Introduzca sus credenciales (de administrador) y luego arrastre y suelte osascript
en la lista de la derecha de Accesibilidad y asegúrese de que se comprueba. A continuación, puede cerrar Preferencias del sistema .
NOTA: Asegúrese de hacer esto antes de cargar el Agente de lanzamiento .
Carga del Agente de Lanzamiento:
De vuelta en Terminal :
launchctl load com.my.change.KS.for.MFTNW.plist
Esto carga el Agente de lanzamiento y la primera vez que seleccione el idioma de destino en el Entrada menú en el barra de menús que no está seleccionado actualmente, si Eventos del sistema en osascript Preferencias del sistema > Seguridad y privacidad > Privacidad > Automatización no está marcada o no existe, un cuadro de diálogo Por ejemplo, " ". "osascript" quiere acceder al control de "Eventos del sistema". Permitir el control proporcionará acceso a los documentos y datos en "System Events" y para realizar acciones dentro de esa aplicación. ', aparecerá y tendrá que pulsar el botón OK botón.
Tenga en cuenta que si se le presenta el mencionado cuadro de diálogo El shell script fallará esta primera vez debido a la cuadro de diálogo pero basta con seleccionar de nuevo la lengua de destino que no esté seleccionada actualmente en el Entrada menú en el barra de menús y debería funcionar esta vez.
NOTA: Porque esto es usar Guiones de interfaz de usuario una vez que haya seleccionado un objetivo de Entrada menú en el barra de menús tendrá que permitir que el Guiones de interfaz de usuario ¡para completar sin interrupción!
En las pruebas he comprobado que en el cambio normal entre Inglés y Español - ISO en el Entrada menú de la barra de menús que el Guiones de interfaz de usuario tendría lugar casi inmediatamente y tardaría dos o tres segundos en completarse. El tiempo puede variar en función de la velocidad del sistema, de qué otros procesos se estén ejecutando y de si hay alguno CPU intensivo en ese momento.
Ejemplo AppleScript código :
#!/usr/bin/osascript
-- # Flush cache on the 'com.apple.HIToolbox.plist' file.
-- # Flush cache on the 'com.apple.symbolichotkeys.plist' file.
-- #
-- # The next three lines of code are commented out (with a # character)
-- # and I found them not to be necessary, but have left them in if timing
-- # debugging becomes necessary if the cache does need to be flushed.
# do shell script "defaults read com.apple.HIToolbox.plist 'foobar'; exit 0"
# do shell script "defaults read com.apple.symbolichotkeys 'foobar'; exit 0"
# delay 0.5
-- # Get the fully qualified POSIX pathname of the target .plist file.
set thePropertyListFilePath to POSIX path of ¬
(path to preferences from user domain) & ¬
"com.apple.HIToolbox.plist"
-- # See which keyboard layout is the current one.
tell application "System Events" to ¬
tell property list file thePropertyListFilePath to ¬
set theCurrentKeyboardLayout to value of ¬
property list item "AppleCurrentKeyboardLayoutInputSourceID"
-- # Get the value of the parameters of the AppleSymbolicHotKeys for the
-- # target keyboard shortcut as an aggregated numeric string to be used
-- # to stop the script from processing all of its code if the watched .plist
-- # changes for other than to the currently selected keyboard layout.
set shellCMD to ¬
{"/usr/libexec/PlistBuddy -c ", ¬
"'Print :AppleSymbolicHotKeys:27:value:parameters' ", ¬
"$HOME/Library/Preferences/com.apple.symbolichotkeys.plist | ", ¬
"awk '/[0-9]/{sub(/[ ]+/, \"\"); printf( \"%s\", $0 );}'"} ¬
as string
set ksNumericValue to do shell script shellCMD
if (ksNumericValue is "96501048576") and ¬
(theCurrentKeyboardLayout is "com.apple.keylayout.US") then
return
else if (ksNumericValue is "186101048576") and ¬
(theCurrentKeyboardLayout is "com.apple.keylayout.Spanish-ISO") then
return
end if
-- # Check to see if System Preferences is
-- # running and if yes, then close it.
-- #
-- # This is done so the script will not fail
-- # if it is running and a modal sheet is
-- # showing, hence the use of 'killall'
-- # as 'quit' fails when done so, if it is.
-- #
-- # This is also done to allow default behaviors
-- # to be predictable from a clean occurrence.
if running of application "System Preferences" then
try
tell application "System Preferences" to quit
on error
do shell script "killall 'System Preferences'"
end try
delay 0.1
end if
-- # Make sure System Preferences is not running before
-- # opening it again. Otherwise there can be an issue
-- # when trying to reopen it while it is actually closing.
repeat while running of application "System Preferences" is true
delay 0.1
end repeat
-- # Open System Preferences to the Shortcuts tab of the Keyboard pane.
-- #
-- # This UI Script needs it to be visible, hence the activate command.
tell application "System Preferences"
activate
reveal anchor "shortcutsTab" of ¬
pane id "com.apple.preference.keyboard"
end tell
-- # System Events does the navigating around the
-- # Shortcuts tab of the Keyboard pane and changes
-- # the value of the target keyboard shortcut.
tell application "System Events"
-- # Make sure the UI is ready to be navigated.
repeat until (exists checkbox 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences")
delay 0.05
end repeat
-- # Press the Tab key twice.
repeat 2 times
key code 48
delay 0.1
end repeat
-- # Select 'Keyboard' from the list on the left.
-- # This is wrapped in a try statement to get
-- # past a bug in how the select command is
-- # interpreted and is silently eaten.
try
select (every row of ¬
table 1 of ¬
scroll area 1 of ¬
splitter group 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" whose ¬
value of static text 1 = "Keyboard")
end try
-- # Select 'Move focus to next window' from the
-- # list on the right. This is wrapped in a try
-- # statement to get past a bug in how the select
-- # command is interpreted and is silently eaten.
try
select (every row of ¬
outline 1 of ¬
scroll area 2 of ¬
splitter group 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" whose ¬
value of static text 1 of ¬
UI element 2 is "Move focus to next window")
end try
-- # By default, when System Preferences opens, focus is in
-- # the Search text box, and depending on whether or not the
-- # 'Use keyboard navigation to move focus between controls'
-- # is checked, it makes a difference when 'UI Scripting' is
-- # being used. Set a flag so as to handle the differences.
set isChecked to ¬
the value of ¬
checkbox 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" as boolean
-- # Based on the state of the target check box,
-- # press the Tab key the necessary times to
-- # navigate to and or open the text field for
-- # input of the target keyboard shortcut.
if isChecked then
delay 0.1
repeat 3 times
key code 48 -- # Tab key.
delay 0.1
end repeat
else
key code 48 -- # Tab key.
delay 0.01
end if
-- # Toggle the value of the target keyboard shortcut.
if theCurrentKeyboardLayout is "com.apple.keylayout.US" then
key code 50 using command down -- # ?` keys
else if theCurrentKeyboardLayout is "com.apple.keylayout.Spanish-ISO" then
key code 10 using command down -- # ?º keys
end if
delay 0.5
end tell
tell application "System Preferences" to quit
Debido a los comentarios y al estilo de codificación, el script es muy largo. Termina con tell application "System Preferences" to quit
así que asegúrese de resaltarlo todo cuando copie y pegue en script Editor para probar y o en el ** cambioKSforMFTNW** shell script con fines de producción.
Ejemplo XML Plist código :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.my.change.KS.for.MFTNW</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/changeKSforMFTNW</string>
</array>
<key>RunAtLoad</key>
<false/>
<key>WatchPaths</key>
<array>
<string>/Users/you/Library/Preferences/com.apple.HIToolbox.plist</string>
</array>
</dict>
</plist>
Notas:
-
Asegúrese de cambiar
you
en<string>/Users/you/Library/Preferences/com.apple.HIToolbox.plist</string>
en el XML Plist utilizado para el Agente de lanzamiento a la nombre de ti Inicio carpeta . -
Sin el código cambios para dirigir el objetivo correcto
key code
y automatizar completamente la solución, las condiciones mencionadas en la respuesta original, enumeradas a continuación, siguen siendo aplicables. -
El convención de nomenclatura para el shell script Por ejemplo
changeKSforMFTNW
significa, cambiar el atajo de teclado para mover el foco a la siguiente ventana y se aplica a la parte de la com.mi.cambio.KS.para.MFTNW.plist archivo también. Obviamente, para las pruebas necesito usar algo. Sin embargo, cambiar el convención de nomenclatura como usted desea. -
Algunos de los comandos del shell que están formateados como comando compuesto se hacen así porque en una instalación limpia de MacOS el
bin
directorio en/usr/local
no existe aunque/usr/local/bin
está en elPATH
(ypath
en un shell zsh ). Así como elLaunchAgents
directorio en$HOME/Library
. (mkdir -p
podría utilizarse en lugar del[ ... ] | &&
paradigma). -
Al utilizar Agentes de lanzamiento y Lanzar demonios Recomiendo encarecidamente la lectura del páginas del manual para
launchctl
,launchd.plist
ylaunchd
. Puede leer el página del manual paracommand
en Terminal tecleandocommand
y luego haga clic con el botón derecho del ratón y seleccione: Abrir la página del hombre
Revertir los cambios
Para deshacer por completo los cambios realizados, en Terminal :
cd ~/Library/LaunchAgents
launchctl stop com.my.change.KS.for.MFTNW.plist
launchctl unload com.my.change.KS.for.MFTNW.plist
rm com.my.change.KS.for.MFTNW.plist
cd /usr/local/bin
sudo rm changeKSforMFTNW
En Preferencias del sistema > Seguridad y privacidad > Privacidad > Accesibilidad desmarcar y eliminar osascript si no se utiliza de otro modo.
En Preferencias del sistema > Seguridad y privacidad > Privacidad > Automatización desmarque Eventos del sistema en osascript si no se utiliza de otro modo.
Respuesta original
Nota : La respuesta original se mantiene como parte de la respuesta global como el ejemplo AppleScript código utilizado como el prueba de concepto tiene valor para otra persona que quiera esta solución para diferentes entrada del teclado Además de las dos lenguas utilizadas por la OP.
Siempre que tengo que hacer algo repetitivo lo automatizo de alguna manera para no tener que dar manualmente todos los pasos necesarios para realizar la tarea.
En este caso concreto, por mucho que no me guste utilizar Guiones de interfaz de usuario No obstante, lo haré cuando sea la forma más fácil que conozca, teniendo en cuenta todas las cosas.
Presentado como un prueba de concepto El ejemplo AppleScript código que se muestra a continuación fue probado y funcionó para mí sin problemas como es bajo MacOS Catalina 10.15.7 en script Editor bajo las siguientes condiciones:
- Preferencias del sistema > Lengua y región :
- Idiomas preferidos:
- Inglés
- Inglés (EE.UU.) - Primaria
- Preferencias del sistema > Seguridad y privacidad > Privacidad > Accesibilidad
- [?] script Editor
- Preferencias del sistema > Teclado > Atajos > Teclado
- [ ] Utilizar la navegación del teclado para mover el foco entre los controles
- [Usar la navegación del teclado para mover el foco entre los controles
- Permitió la script para funcionar sin interrupciones y no quitarle protagonismo a Preferencias del sistema como es necesario en este caso de uso para poder utilizar Guiones de interfaz de usuario para establecer el atajo de teclado .
- Es posible que sea necesario realizar cambios en el código en general cuando se ejecuta en otras versiones de MacOS y o diferentes Idioma y sólo se probó en las condiciones mencionadas y en la condición expresada en el párrafo siguiente.
También he probado el ejemplo AppleScript código guardado como un AppleScript aplicación , señalando que el aplicación debe añadirse a Preferencias del sistema > Seguridad y privacidad > Privacidad > Accesibilidad y haciendo clic en el botón OK botón en el, por ejemplo, '"Toggle ?` - ?=" quiere acceder al control "System Events". Permitir el control proporcionará acceso a los documentos y datos en "Eventos del sistema", y para realizar acciones dentro de esa aplicación.' cuadro de diálogo. (Obviamente, el nombre del aplicación será lo que se denomine. He utilizado Alternar ?` - ?= para las pruebas).
Aunque no se probó de la siguiente manera, sin embargo, el ejemplo AppleScript código también debería poder utilizarse en un Ejecutar AppleScript acción en un Automatizador Servicio/Acción Rápida o un tipo de automatización de terceros aplicación que puede hacer uso de AppleScript .
El ejemplo AppleScript código activa el valor de la atajo de teclado para: Preferencias del sistema > Teclado > Atajos > Teclado > Mover el foco a la siguiente ventana
Para ello prueba de concepto alterna entre ?` y ?= y ?= no está realmente destinado a ser utilizado, es estrictamente un marcador de posición para lo que el key code
valor de º
es, que tendrá que determinar.
Determino el valor de códigos clave utilizando una utilidad gratuita de terceros llamada Códigos clave , por Muchos trucos y está disponible para su descarga en el sitio web de los desarrolladores, o en el Mac AppStore . (No estoy afiliado al desarrollador de Códigos clave (Sólo un usuario satisfecho).
También he comentado el código para que pueda tener una comprensión de lo que está haciendo, y está cerca de la parte inferior de la código en el que necesitas cambiar:
key code 24 using command down -- # {"?="}
Para:
key code ? using command down -- # {"?º"}
Donde ?
es el valor para Código de la llave: en el Códigos clave aplicación cuando el º
clave está presionado.
O posiblemente 1 utilizar el keystroke
comando Por ejemplo:
keystroke "º" using command down -- # {"?º"}
1 Sin un Español teclado No puedo probar efectivamente el keystroke
comando .
Ejemplo AppleScript código :
-- # Check to see if System Preferences is
-- # running and if yes, then close it.
-- #
-- # This is done so the script will not fail
-- # if it is running and a modal sheet is
-- # showing, hence the use of 'killall'
-- # as 'quit' fails when done so, if it is.
-- #
-- # This is also done to allow default behaviors
-- # to be predictable from a clean occurrence.
if running of application "System Preferences" then
try
tell application "System Preferences" to quit
on error
do shell script "killall 'System Preferences'"
end try
delay 0.1
end if
-- # Make sure System Preferences is not running before
-- # opening it again. Otherwise there can be an issue
-- # when trying to reopen it while it is actually closing.
repeat while running of application "System Preferences" is true
delay 0.1
end repeat
-- # Open System Preferences to the Shortcuts tab of the Keyboard pane.
-- #
-- # This UI Script needs it to be visible, hence the activate command.
tell application "System Preferences"
activate
reveal anchor "shortcutsTab" of ¬
pane id "com.apple.preference.keyboard"
end tell
-- # System Events does the navigating around the
-- # Shortcuts tab of the Keyboard pane and changes
-- # the value of the target keyboard shortcut.
tell application "System Events"
-- # Make sure the UI is ready to be navigated.
repeat until (exists checkbox 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences")
delay 0.1
end repeat
-- # Press the Tab key twice.
repeat 2 times
key code 48
delay 0.1
end repeat
-- # Select 'Keyboard' from the list on the left.
-- # This is wrapped in a try statement to get
-- # past a bug in how the select command is
-- # interpreted and is silently eaten.
try
select (every row of ¬
table 1 of ¬
scroll area 1 of ¬
splitter group 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" whose ¬
value of static text 1 = "Keyboard")
end try
-- # Select 'Move focus to next window' from the
-- # list on the right. This is wrapped in a try
-- # statement to get past a bug in how the select
-- # command is interpreted and is silently eaten.
try
select (every row of ¬
outline 1 of ¬
scroll area 2 of ¬
splitter group 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" whose ¬
value of static text 1 of ¬
UI element 2 is "Move focus to next window")
end try
-- # By default, when System Preferences opens, focus is in
-- # the Search text box, and depending on whether or not the
-- # 'Use keyboard navigation to move focus between controls'
-- # is checked, it makes a difference when 'UI Scripting' is
-- # being used. Set a flag so as to handle the differences.
set isChecked to ¬
the value of ¬
checkbox 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" as boolean
-- # Based on the state of the target check box,
-- # press the Tab key the necessary times to
-- # navigate to and or open the text field for
-- # input of the target keyboard shortcut.
if isChecked then
delay 0.1
repeat 3 times
key code 48 -- # Tab key.
delay 0.1
end repeat
else
key code 48 -- # Tab key.
delay 0.01
end if
-- # Toggle the value of the target keyboard shortcut.
if the value of ¬
text field 1 of ¬
UI element 2 of ¬
(every row of ¬
outline 1 of ¬
scroll area 2 of ¬
splitter group 1 of ¬
tab group 1 of ¬
window 1 of ¬
process "System Preferences" whose ¬
value of ¬
static text 1 of ¬
UI element 2 ¬
is "Move focus to next window") ¬
is {"?`"} then
key code 24 using command down -- # ?= keys
else
key code 50 using command down -- # ?` keys
end if
delay 0.5
end tell
tell application "System Preferences" to quit
Debido a los comentarios y al estilo de codificación, el script es muy largo. Termina con tell application "System Preferences" to quit
así que asegúrese de resaltarlo todo cuando copie y pegue en Script Editor para las pruebas.
Nota: El <em>ejemplo </em><strong>AppleScript </strong><em>código </em>es sólo eso y sin ningún tipo de inclusión <em>tratamiento de errores </em>no contiene ningún otro <em>tratamiento de errores </em>según corresponda. Corresponde al usuario añadir cualquier <em>tratamiento de errores </em>como sea apropiado, necesario o deseado. Eche un vistazo a la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>intente </strong></a><em>declaración </em>y <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error </strong></a><em>declaración </em>en el <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guía del lenguaje AppleScript </strong></a>. Véase también, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Trabajar con errores </strong></a>. Además, el uso del <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>retraso </strong></a><em>comando </em>puede ser necesario entre eventos cuando sea apropiado, por ejemplo <code>delay 0.5</code> con el <em>valor </em>de la <em>retraso </em>ajustado apropiadamente.