Establecer atajo de teclado de Servicios a través de un script OSX

4

Necesito una forma de configurar lo siguiente mediante programación:

EspecíficamenteparaaccesosdirectosenServicios,siesomarcaunadiferencia.MepreguntosiestoesposibleatravésdeshelloAppleScript?

EDITAR:

Hevisto enlace pero estoy Aún no está claro cómo establecer un acceso directo para un servicio existente.

    
pregunta Chris Knadler 29.12.2013 - 21:55

5 respuestas

5

@chrisKnadler hizo un buen punto al usar Applescript para hacer esto.

He usado esto antes en el pasado, pero lo desconté debido a que el nuevo problema en Mavericks es que la preferencia se almacena en caché en todo el sistema.

Lo que significa que solo puedes usar el comando unix

  

escribir por defecto ...

para hacer que los resultados cambien realmente en lugar de cambiarlos manualmente o usar los comandos plist item de Applescript

Sin embargo, ahora que he echado un vistazo ha encontrado una sugerencia de que simplemente puede vaciar la memoria caché e iniciar el sistema para leer la preferencia de nuevo simplemente llamando a un

  

valores predeterminados leídos ...

en el archivo plist que has cambiado. 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

Es posible que aún necesite aplicaciones bastante individuales para que muestren el cambio (como es normal)

ACTUALIZACIÓN: Pequeño cambio.

Se agregó > /dev/null al final del comando predeterminado, por lo que solo se devuelven los errores.

    
respondido por el markhunte 02.01.2014 - 15:16
4

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 comando PlistBuddy no es necesario si no existe una entrada para el servicio. Reemplace test2 con el nombre del servicio. Salga y vuelva a abrir las aplicaciones para aplicar los cambios.

^~@2 es control-option-command-2. Consulte enlace .

    
respondido por el user495470 03.01.2014 - 01:52
3

Como la mayoría de las preferencias, los atajos de teclado pueden configurarse usando los comandos de "escritura predeterminada" en el Terminal. Útil si tiene muchos accesos directos que desea definir, o si tiene más de una Mac para configurar. Sin embargo, la sintaxis no es exactamente la misma que la de los comandos habituales para establecer una clave en un valor.

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

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

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

Para los accesos directos de todo el sistema, puedes usar -g en lugar del identificador de la aplicación, por ejemplo

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

Tenga en cuenta que deberá reiniciar la aplicación antes de que surtan efecto. También puede ver si han tenido éxito en las Preferencias del sistema, que también necesitarán un reinicio para mostrar los cambios.

    
respondido por el abzcoding 01.01.2014 - 10:49
1

Los métodos abreviados de teclado de los servicios son un poco diferentes de los métodos abreviados específicos de la aplicación o de todo el sistema, aunque se pueden administrar 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 método abreviado de teclado manualmente usando Preferencias del sistema

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

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

Por ejemplo:

La clave CFVendedServices de com.apple.ServicesMenu.Services para "Desarchivar en la carpeta actual 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 método abreviado de teclado, la clave NSServices pbs se construye a partir de 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 se construye como diccionarios anidados que no pueden ser manejados por defaults write como este, casos más simples para otros atajos de teclado. Deberá leer la clave completa de NSServicesStatus, insertar su nueva entrada y luego 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 pbs a vaciar su caché:

/System/Library/CoreServices/pbs -flush
    
respondido por el dttocs 01.01.2014 - 18:39
1

Soy perezoso: utilizo una herramienta como FastScripts para configurar atajos de teclado globales e invocar scripts.

Es gratis a menos que necesites 11 o más accesos directos definidos. Además, el autor es un buen caballero que crea software de calidad y apoya a los usuarios mucho más allá de lo que podría esperar de una tienda para un solo hombre.

    
respondido por el bmike 02.01.2014 - 08:16

Lea otras preguntas en las etiquetas