Le menu «Ouvrir avec» du Finder d'accès à partir de la ligne de commande (pour l'achèvement de l'onglet)

Sur Mac OS X, je sais que l'on peut ouvrir un fichier à partir de la ligne de commande avec son application par défaut open , et avec d'autres applications avec open -a <application name> . Ainsi,

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

tout le travail. Ma seule plainte est que lorsque je tape

 open movie.avi -a <TAB> 

Il se complète sur toutes les applications qui existent sur l'ordinateur – par exemple, dans zsh, je reçois

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

– alors que ce que j'aimerais, c'est qu'il ne soit complété que par la poignée d'applications que le menu «Open With» de Finder aurait montré.

Donc, existe-t-il un moyen d'accéder à cette liste que Finder sait, et faire mon shell (zsh, mais je peux passer à bash si cela aide) à connaître la liste, de telle sorte que l'achèvement de l'onglet ne montrerait que ces applications?

AllApplications

 $ 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 

(Il manque encore certaines applications qui sont ouvertes avec le menu).

Pour moi, il semble que

Il se complète sur toutes les applications qui existent sur l'ordinateur – par exemple, dans zsh, je reçois

ce n'est pas vrai. Il ne semble pas y avoir de conscience pour la commande open dans bash ou zsh. En appuyant sur ⇥, il suffit d'utiliser le repli et de compléter sur tous les fichiers de votre répertoire de travail actuel.

Si vous voulez que bash soit conscient des arguments attendus après le «commutateur de la commande open , vous devrez écrire un motif d'achèvement bash pour cela.

Pour ce faire, vous devriez vous familiariser avec l'ensemble complete coquille

 $ 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 indique simplement l'utilisateur à une boîte de dialogue montrant le dossier /Applications . Pour obtenir la liste des applications là-bas, vous pouvez simplement utiliser

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

Ainsi, une finition très rudimentaire pour open qui ne vérifie pas le commutateur -a ou ne gère pas les espaces correctement ressemblerait à ceci

 _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 

Cela s'applique à bash, je ne suis pas familier avec le comportement d'achèvement de zsh.