En Mac OS X, sé que se puede abrir un archivo desde la línea de comandos con su aplicación predeterminada open
y con otras aplicaciones con open -a <application name>
. De este modo,
open movie.avi
open -a VLC movie.avi
open movie.avi -a VLC
todo el trabajo. Mi única queja es que cuando escribo
open movie.avi -a <TAB>
se completatodoaplicaciones que existen en la computadora, por ejemplo en zsh obtengo
zsh: do you wish to see all 793 possibilities (200 lines)?
- mientras que lo que me gustaría es que se complete solo en el puñado de aplicaciones que habría mostrado el menú "Abrir con" del Finder.
Entonces, ¿hay alguna manera de acceder a esta lista que Finder conozca y hacer que mi shell (zsh, pero puedo cambiar a bash si me ayuda) sea consciente de la lista, de tal manera que al completar la pestaña solo se muestren esas aplicaciones?
Respuesta1
Todas las aplicaciones (archivo.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
$ 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
(Sin embargo, faltan algunas aplicaciones que se muestran en el menú abierto).
Respuesta2
A mi me parece que
completa todas las aplicaciones que existen en la computadora; por ejemplo, en zsh obtengo
no es verdad. No parece haber ningún conocimiento del open
comando en bash o zsh. Entonces, presionar ⇥simplemente usa el respaldo y completa todos los archivos en su directorio de trabajo actual.
Si desea que bash esté al tanto de los argumentos esperados que aparecerán después del -a
cambio del open
comando, deberá escribir un patrón de finalización de bash para ello.
Para hacerlo, deberá familiarizarse con el complete
shell incorporado.
$ 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 simplemente dirige al usuario a un cuadro de diálogo que muestra la /Applications
carpeta. Para obtener la lista de aplicaciones allí, simplemente puede usar
basename -a -s.app /Applications/*.app
Entonces, una finalización muy rudimentaria open
que no verifica el -a
interruptor ni maneja los espacios correctamente se vería así
_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
Esto se aplica a bash, no estoy familiarizado con el comportamiento de finalización de zsh.