Я знаю, что в 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, если это поможет) о списке таким образом, чтобы автодополнение по клавише Tab показывало только эти приложения?
решение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
switch команды 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.