4 votos

Establecer el atajo de teclado de los Servicios a través de script OSX

Necesito una forma de establecer lo siguiente de forma programada:

keyboard shortcut

Específicamente para los atajos en Servicios, si eso hace la diferencia. Me pregunto si esto es posible a través de la cáscara o de AppleScript.

EDITAR:

He visto https://stackoverflow.com/questions/7219134/programmatically-add-keyboard-shortcut-to-mac-system-preferences pero aún no tengo claro cómo establecer un atajo para un servicio existente.

5voto

Malik hassan Puntos 16

@chrisKnadler hizo un buen uso de Applescript para hacer esto.

He usado esto antes en el pasado pero lo descarté debido al nuevo problema de que los Mavericks de preferencia están siendo almacenados en caché en todo el sistema.

Lo que significa que sólo podías usar el comando unix

Los valores por defecto escriben...

para conseguir que los resultados cambien realmente en lugar de cambiarlos manualmente o usar Applescript artículo de la lista comandos.

Pero ahora, al echar un vistazo, he encontrado una sugerencia de que puedes simplemente vaciar la caché e iniciar el sistema para leer la preferencia de nuevo con sólo llamar a un

Los valores por defecto se leen...

en el archivo de la lista que tienes el cambio. Esto parece funcionar.

  set theServiceName to "(null) - Print to PDF - runWorkflowAsService"
set libPrefPath to POSIX path of (path to preferences folder from user domain as text)
set PlistFile to "pbs.plist"
set PlistPath to libPrefPath & PlistFile as text
set mainPropertyItem to "NSServicesStatus"
set theKey to "key_equivalent"

tell application "System Events"

    set gp to (get property list item theServiceName of property list item mainPropertyItem of property list file PlistPath)

    tell gp
        --set value of property list item "enabled_services_menu" to true
        --set value of property list item "enabled_context_menu" to true
        set value of property list item theKey to "@^h"

    end tell

end tell

do shell script " defaults read " & quoted form of PlistPath & > /dev/null

Puede que todavía necesites aplicaciones bastante individuales para que muestren el cambio (como es normal)


ACTUALIZACIÓN: Un pequeño cambio.

Añadido > /dev/null al final del comando por defecto, así que sólo se devuelven los errores.

4voto

También puedes usar PlistBuddy y defaults :

/usr/libexec/PlistBuddy -c 'Delete NSServicesStatus:"(null) - test2 - runWorkflowAsService"' ~/Library/Preferences/pbs.plist 2>/dev/null;defaults write pbs NSServicesStatus -dict-add '"(null) - test2 - runWorkflowAsService"' '{key_equivalent = "^~@2";}'

El PlistBuddy no es necesario si no existe una entrada para el servicio. Reemplazar test2 con el nombre del servicio. Deje y vuelva a abrir las solicitudes para aplicar los cambios.

^~@2 es el control-opción-comando-2. Véase http://osxnotes.net/keybindings.html .

3voto

abzcoding Puntos 111

Como la mayoría de las preferencias, los atajos de teclado se pueden establecer usando los comandos de "escritura por defecto" en la Terminal. Es útil si tienes muchos atajos que quieres definir, o si tienes más de un Mac que configurar. Sin embargo, la sintaxis no es exactamente la misma que la de los comandos habituales para establecer una tecla a un valor.

Para los comandos específicos de la aplicación, utilice lo siguiente:

defaults write com.developer.app NSUserKeyEquivalents -dict-add "Menu Item" -string "@$~^k"

Las meta-teclas se establecen como @ para Comando, $ para Shift, ~ para Alt y ^ para Ctrl. k en este ejemplo es la no-meta-tecla que quieres usar.

Para los atajos de todo el sistema, puede utilizar -g en lugar del identificador de la aplicación, por ejemplo.

defaults write -g NSUserKeyEquivalents -dict-add "Menu Item" -string "@$~^k" 

Ten en cuenta que tendrás que relanzar la aplicación antes de que estos surtan efecto. También puedes ver si han tenido éxito en las Preferencias del Sistema, que también necesitarán un relanzamiento para mostrar los cambios.

1voto

Anoop Puntos 58

Los atajos de teclado de los servicios son un poco diferentes de los atajos específicos de las aplicaciones o de todo el sistema, aunque pueden gestionarse utilizando defaults read y defaults write .

La forma más fácil que he encontrado para resolver este tipo de cosas es:

defaults read > /tmp/a

Cambie el atajo de teclado manualmente usando las Preferencias del Sistema

defaults read > /tmp/b
diff /tmp/[ab]

Para el caso específico de los atajos de teclado para Servicios, en OS-X 10.8 los dominios importantes son "com.apple.ServicesMenu.Services" y "pbs". Tienes que mirar el com.apple.ServicesMenu.Services domain para obtener la información necesaria para crear una entrada en el dominio pbs.

Por ejemplo:

El CFVendedServices llave de com.apple.ServicesMenu.Services para "Unarchive to Current Folder es:

{
    NSBundleIdentifier = "cx.c3.theunarchiver";
    NSBundlePath = "/opt/homebrew-cask/Caskroom/the-unarchiver/3.9.1/The Unarchiver.app";
    NSKeyEquivalent = { };
    NSMenuItem = {
        default = "The Unarchiver/Unarchive To Current Folder";
    };
    NSMessage = unarchiveToCurrentFolderWithPasteboard;
    NSPortName = "The Unarchiver";
    NSSendTypes = (
        NSFilenamesPboardType
    );
    NSUUID = <be1910e8 cb1a3475 90854bc5 09f0c0ab>;
},

Para crear un atajo de teclado para ello, la tecla pbs NSServices se construye a partir del NSBundleIdentifier, NSMenuItem y NSMessage. Ejemplo:

defaults read pbs

{
        "cx.c3.theunarchiver - The Unarchiver/Unarchive To Current Folder - unarchiveToCurrentFolderWithPasteboard" =         {
            "enabled_context_menu" = 1;
            "enabled_services_menu" = 1;
            "key_equivalent" = "@~^u";
        };
        "org.vim.MacVim - MacVim/New MacVim Buffer Here - newFileHere" =         {
            "key_equivalent" = "@~^v";
        };
    };
}

Desafortunadamente, el dominio pbs está construido como diccionarios anidados que no pueden ser manejados por defaults write como estos casos más simples para otros atajos de teclado. Necesitarás leer toda la tecla NSServicesStatus, insertar tu nueva entrada y volver a escribirla:

defaults write pbs NSServicesStatus '{
    "com.cocoatech.PathFinder - Path Finder/Show Info - getInfoInPathFinderService" =     {
        "key_equivalent" = "@~^$i";
    };
    "cx.c3.theunarchiver - The Unarchiver/Unarchive To Current Folder - unarchiveToCurrentFolderWithPasteboard" =     {
        "enabled_context_menu" = 1;
        "enabled_services_menu" = 1;
        "key_equivalent" = "@~^u";
    };
    "org.vim.MacVim - MacVim/New MacVim Buffer Here - newFileHere" =     {
        "key_equivalent" = "@~^v";
    };
}'

También puede ser necesario forzar a las pbs a limpiar su caché:

/System/Library/CoreServices/pbs -flush

1voto

Oskar Puntos 1242

Soy perezoso. Utilizo una herramienta como FastScripts para establecer atajos de teclado globales e invocar scripts.

Es gratis a menos que necesites definir 11 o más atajos. Además, el autor es un fino caballero que hace software de calidad y apoya a los usuarios más allá de lo que se podría esperar de una tienda de un solo hombre.

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