Greifen Sie über die Befehlszeile auf das Finder-Menü „Öffnen mit“ zu (für die Tab-Vervollständigung)

Greifen Sie über die Befehlszeile auf das Finder-Menü „Öffnen mit“ zu (für die Tab-Vervollständigung)

Ich weiß, dass man unter Mac OS X eine Datei von der Kommandozeile aus mit der Standardanwendung mit öffnen kann open, und mit anderen Anwendungen mit open -a <application name>. Somit,

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

alles funktioniert. Meine einzige Beschwerde ist, dass wenn ich tippe

open movie.avi -a <TAB>

es vervollständigt überalleAnwendungen, die auf dem Computer vorhanden sind – zum Beispiel erhalte ich in zsh

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

– während ich mir wünschen würde, dass nur die wenigen Anwendungen geprüft werden, die im Finder-Menü „Öffnen mit“ angezeigt würden.

Gibt es also eine dem Finder bekannte Möglichkeit, auf diese Liste zuzugreifen und meine Shell (zsh, aber ich kann auch zu bash wechseln, wenn das hilft) auf die Liste aufmerksam zu machen, sodass bei der Tab-Vervollständigung nur diese Anwendungen angezeigt werden?

Antwort1

Alle Anwendungen (archive.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

Pflicht

$ 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

(Es fehlen jedoch einige Apps, die im Menü „Öffnen mit“ angezeigt werden.)

Antwort2

Mir scheint, dass

es führt alle auf dem Computer vorhandenen Anwendungen aus – in zsh bekomme ich beispielsweise

ist nicht wahr. Es scheint, als ob der openBefehl in Bash oder Zsh nicht bekannt ist. Wenn Sie also drücken, wird einfach der Fallback verwendet und der Befehl wird über alle Dateien in Ihrem aktuellen Arbeitsverzeichnis ausgeführt.

Wenn Sie möchten, dass Bash die erwarteten Argumente erkennt, die nach dem -aBefehlswechsel kommen open, müssen Sie dafür ein Bash-Vervollständigungsmuster schreiben.

Dazu müssen Sie sich mit dem completeShell-Builtin vertraut machen

$ 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 verweist den Benutzer einfach auf einen Dialog, der den /ApplicationsOrdner anzeigt. Um die Liste der Apps dort zu erhalten, können Sie einfach verwenden

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

Eine sehr rudimentäre Vervollständigung, opendie weder den Schalter überprüft -anoch Leerzeichen korrekt verarbeitet, würde so aussehen

_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

Dies gilt für Bash, ich bin mit dem Vervollständigungsverhalten von Zsh nicht vertraut.

verwandte Informationen