コマンドラインから Finder の「開く」メニューにアクセスする (タブ補完用)

コマンドラインから Finder の「開く」メニューにアクセスする (タブ補完用)

Mac OS Xでは、コマンドラインからファイルをデフォルトのアプリケーションで開くには をopen、他のアプリケーションで開くには を使用できることがわかっていますopen -a <application name>。つまり、

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

すべてうまくいきました。唯一の不満は、

open movie.avi -a <TAB>

それは完了します全てコンピュータ上に存在するアプリケーション — 例えばzshでは

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

— 一方、私が望んでいるのは、Finder の「このアプリケーションで開く」メニューに表示される少数のアプリケーションのみを完了することです。

では、Finder が認識しているこのリストにアクセスし、タブ補完でそれらのアプリケーションだけが表示されるように、シェル (zsh ですが、役立つ場合は bash に切り替えることもできます) にリストを認識させる方法はあるでしょうか?

答え1

すべてのアプリケーション (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

ドゥティ

$ 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

(ただし、「開く」メニューに表示されるアプリがいくつか欠落しています。)

答え2

私には、

コンピュータ上に存在するすべてのアプリケーションを補完します。たとえばzshでは、

openは正しくありません。bashまたは zsh では、コマンドは認識されないようです。そのため、 を押すと、フォールバックが使用され、現在の作業ディレクトリ内のすべてのファイルが補完されます。

-abash にコマンドのスイッチ後に予想される引数を認識させたい場合はopen、そのための bash 補完パターンを記述する必要があります。

completeそのためには、シェルの組み込みに慣れる必要があります。

$ 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では、フォルダを表示するダイアログが表示されます/Applications。そこにあるアプリのリストを取得するには、

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

openしたがって、スイッチをチェックせず、スペースも正しく処理しない非常に基本的な補完は-a次のようになります。

_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

これは bash に当てはまりますが、zsh の補完動作についてはよくわかりません。

関連情報