從命令列存取 Finder 的「開啟方式」選單(用於 Tab 補全)

從命令列存取 Finder 的「開啟方式」選單(用於 Tab 補全)

在 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 知道的這個列表,並使我的 shell(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 中我得到

不是真的。openbash 或 zsh 中的命令似乎沒有任何意識。因此,按下只是使用後備並完成當前工作目錄中的所有檔案。

如果您希望 bash 了解命令-a切換後出現的預期參數open,則需要為此編寫 bash 完成模式。

為此,您需要熟悉completeshell 內建命令

$ 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 的完成行為。

相關內容