在 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 中我得到
open
并非如此。bash或 zsh 中似乎没有任何对该命令的感知。因此,按下⇥只会使用后备并完成当前工作目录中的所有文件。
如果您希望 bash 知道-a
命令切换后预期的参数open
,则需要为此编写一个 bash 完成模式。
为此,您需要熟悉complete
shell 内置
$ 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 的完成行为。