Acceda al menú "Abrir con" del Finder desde la línea de comandos (para completar la pestaña)

Acceda al menú "Abrir con" del Finder desde la línea de comandos (para completar la pestaña)

En Mac OS X, sé que se puede abrir un archivo desde la línea de comandos con su aplicación predeterminada openy con otras aplicaciones con open -a <application name>. De este modo,

open movie.avi
open -a VLC movie.avi
open movie.avi -a VLC

todo el trabajo. Mi única queja es que cuando escribo

open movie.avi -a <TAB>

se completatodoaplicaciones que existen en la computadora, por ejemplo en zsh obtengo

zsh: do you wish to see all 793 possibilities (200 lines)? 

- mientras que lo que me gustaría es que se complete solo en el puñado de aplicaciones que habría mostrado el menú "Abrir con" del Finder.

Entonces, ¿hay alguna manera de acceder a esta lista que Finder conozca y hacer que mi shell (zsh, pero puedo cambiar a bash si me ayuda) sea consciente de la lista, de tal manera que al completar la pestaña solo se muestren esas aplicaciones?

Respuesta1

Todas las aplicaciones (archivo.org)

$ AllApplications -h

Created 03 March 2011 by Hank McShane
version 0.1
requires Mac OS X 10.4 or higher

Use this command line tool to get the path to all applications that can open a file from Launch Services.

Usage: AllApplications -path path/to/file

$ ext=png; f=/tmp/allapps.$ext; touch $f; AllApplications -path $f; rm $f
/Applications/Preview.app
/2/copies/Safari.app
/Applications/TeX/LaTeXiT.app
/Applications/WebKit.app
/Applications/Sequential.app
/Applications/ImageOptim.app
/Applications/Acorn.app
/Developer/Applications/Graphics Tools/Core Image Fun House.app
/2/copies/Preview.app
/Developer/Applications/Dashcode.app
/Applications/GraphicConverter.app
/Applications/Google Chrome.app
/Applications/Adobe Photoshop CS5/Adobe Photoshop CS5.app
/Applications/Utilities/QuickTime Player 7.app
/Applications/Utilities/ColorSync Utility.app
/Applications/Safari.app
/Applications/Adobe Device Central CS5/Adobe Device Central CS5.app
/Applications/Firefox.app

duti

$ duti -d public.png
com.apple.Preview
$ duti -l public.png
com.SequentialX.Sequential
com.flyingmeat.Acorn
net.pornel.ImageOptim
com.apple.system-library
com.apple.ColorSyncUtility
com.apple.Preview

(Sin embargo, faltan algunas aplicaciones que se muestran en el menú abierto).

Respuesta2

A mi me parece que

completa todas las aplicaciones que existen en la computadora; por ejemplo, en zsh obtengo

no es verdad. No parece haber ningún conocimiento del opencomando en bash o zsh. Entonces, presionar simplemente usa el respaldo y completa todos los archivos en su directorio de trabajo actual.

Si desea que bash esté al tanto de los argumentos esperados que aparecerán después del -acambio del opencomando, deberá escribir un patrón de finalización de bash para ello.

Para hacerlo, deberá familiarizarse con el completeshell incorporado.

$ help complete
complete: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]
    For each NAME, specify how arguments are to be completed.
    If the -p option is supplied, or if no options are supplied, existing
    completion specifications are printed in a way that allows them to be
    reused as input.  The -r option removes a completion specification for
    each NAME, or, if no NAMEs are supplied, all completion specifications.

OS X Lion simplemente dirige al usuario a un cuadro de diálogo que muestra la /Applicationscarpeta. Para obtener la lista de aplicaciones allí, simplemente puede usar

basename -a -s.app /Applications/*.app

Entonces, una finalización muy rudimentaria openque no verifica el -ainterruptor ni maneja los espacios correctamente se vería así

_openComp() 
{
        local WLIST cur
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        WLIST=`basename -a -s.app /Applications/*.app`
        COMPREPLY=( $(compgen -W "${WLIST}" -- ${cur}) )
        return 0
}
complete -F _openComp open

Esto se aplica a bash, no estoy familiarizado con el comportamiento de finalización de zsh.

información relacionada