Yo con frecuencia el uso de la open -a
comando en la Terminal para abrir las aplicaciones a través de ssh. Cómo puedo hacer auto-completar el nombre de una aplicación?
Respuestas
¿Demasiados anuncios?_complete_open() {
COMPREPLY=()
local cur="${COMP_WORDS[$COMP_CWORD]}"
local prev="${COMP_WORDS[COMP_CWORD-1]}"
[[ "$cur" == -* || "$prev" != '-a' ]] && return
apps="$(mdfind kMDItemKind==Application -onlyin /Applications -onlyin ~/Applications -onlyin /Developer -onlyin ~/Developer | grep -v '/.*/.*/.*/.*/' | sed -E 's|.*/||g;s|\.app$||g' | uniq)"$'Finder\nArchive Utility\nCharacterPalette\nKeyboardViewer'
local IFS=$'\n'
if [[ "${cur:0:1}" = '"' || "${cur:0:1}" = "'" ]]; then
quote="${cur:0:1}"
cur="${cur:1}"
fi
local found="$(grep -i "^$cur" <<< "$apps")"
if [[ "$quote" == '"' ]]; then
found="$(sed "s|^|\"|g;s|$|\"|g" <<< "$found")"
elif [[ "$quote" == "'" ]]; then
found="$(sed "s|^|'|g;s|$|'|g" <<< "$found")"
else
found="$(sed 's| |\\ |g' <<< "$found")"
fi
COMPREPLY=($found)
}
complete -o default -F _complete_open open
Tercera versión, que ahora debe de estar ambos en mayúsculas o en minúsculas y trabajar dentro de las comillas.
Agregue lo siguiente a su .bash_profile
o .bashrc
e iniciar un nuevo período de sesiones:
function _complete_open {
cur=$2
COMPREPLY=( );
[[ "$COMP_WORDS" = "open" ]] || return
[[ "${COMP_WORDS[ $(( $COMP_CWORD - 1 )) ]}" = "-a" ]] || return
OLDIFS="$IFS"
IFS=$'\n'
local _part="${COMP_WORDS[$COMP_CWORD]}"
if [[ "${_part:0:1}" = '"' || "${_part:0:1}" = "'" ]] ; then
COMPREPLY=( $( compgen -W "$( mdfind kMDItemKind==Application | sed -e 's|.*/||g' -e 's|.app$||' | sort -u )" -- $cur ) )
else
COMPREPLY=( $( compgen -W "$( mdfind kMDItemKind==Application | sed -e 's|.*/||g' -e 's|.app$||' -e 's| |\\\\ |g' | sort -u )" -- $cur ) )
fi
IFS="$OLDIFS"
}
complete -o default -F _complete_open open
No hay necesidad de instalar nada. Esto funciona con bash
fuera de la caja.
Sólo autocompletar nombres de programa si la opción anterior está -a
, y de lo contrario mostrar comportamiento predeterminado, por ejemplo, devolver una lista de todos los archivos en el directorio actual o completa de la actual prefijo de la ruta.
Los resultados se generan a partir de system_profiler SPApplicationsDataType
, que es la manera más fácil de conseguir todas las aplicaciones que se pueden iniciar de esta manera en su sistema como ese. La lista es procesada para devolver sólo el nombre del programa, la cual puede contener espacios y puede ser diferente de la del manojo de nombres (incluso cuando se ignoran .app
sufijo)
Uso: Tipo open -a
, seguido por un espacio, seguido de presionar Tab
o Esc
(dos veces en mi sistema, no estoy seguro si es en todas partes).
Ejemplo que muestra todas las aplicaciones de ayuda para mi escáner:
$ open -a Scan
Scan to E-mail Scan to Excel Scan to Folder Scan to Print Scan to Searchable PDF Scan to Word ScanSnap Manager
Las desventajas y los problemas de esta solución:
Hay un montón de programas en su sistema, usted podría no ser consciente de que, como todo en
/System/Library/CoreServices
. Es posible que no desee de la lista de todos ellos. OTOH, es realmente fácil de ver y lanzar por ejemploCharacterPalette
oKeyboardViewer
de esta manera. *Configurar elmdfind
llamada(s) apropiadamente con el-onlyin
argumento.Es un poco lenta, debido a laAhora usasystem_profiler SPApplicationsDataType
. Deberás esperar un segundo o dos antes de la finalización de la muestra.mdfind
para obtener rápidamente los programas. Gracias @LriPuede manejar los espacios en los nombres de aplicación, y el presupuesto adjunto los nombres de los programas, pero es bastante chapucero. Se requiere que la cita es el primer carácter: Mientras
Scan" to "P
es válido enbash
, este programa no lo va a detectar. La finalización no funciona después de un escapó de espacio (por ejemploScan\ to
), el uso de comillas en estos casos ("Scan to
). Apoyo para escapó espacios sólo es bueno para completarDVD
aDVD\ Player
.
Programmeable autocompletado al rescate! Se necesita una gran cantidad de copiar de la Bash de Finalización de la página de inicio sin embargo, que es digno de la instalación de todos modos para una gran cantidad de auto-realización de la magia. Si usted lo hace, usted sólo tendrá la última función (_open
) y la inicialización del comando de abajo.
Agregue lo siguiente a .bashrc
:
# taken from http://bash-completion.alioth.debian.org/
_compopt_o_filenames()
{
# We test for compopt availability first because directly invoking it on
# bash < 4 at this point may cause terminal echo to be turned off for some
# reason, see https://bugzilla.redhat.com/653669 for more info.
type compopt &>/dev/null && compopt -o filenames 2>/dev/null || \
compgen -f /non-existing-dir/ >/dev/null
}
_tilde() {
local result=0
# Does $1 start with tilde (~) and doesn't contain slash (/)?
if [[ ${1:0:1} == "~" && $1 == ${1//\/} ]]; then
_compopt_o_filenames
# Try generate username completions
COMPREPLY=( $( compgen -P '~' -u "${1#\~}" ) )
result=${#COMPREPLY[@]}
fi
return $result
}
_quote_readline_by_ref()
{
if [[ ${1:0:1} == "'" ]]; then
if [[ ${BASH_VERSINFO[0]} -ge 4 ]]; then
# Leave out first character
printf -v $2 %s "${1:1}"
else
# Quote word, leaving out first character
printf -v $2 %q "${1:1}"
# Double-quote word (bash-3)
printf -v $2 %q ${!2}
fi
elif [[ ${BASH_VERSINFO[0]} -le 3 && ${1:0:1} == '"' ]]; then
printf -v $2 %q "${1:1}"
else
printf -v $2 %q "$1"
fi
# If result becomes quoted like this: $'string', re-evaluate in order to
# drop the additional quoting. See also: http://www.mail-archive.com/
# bash-completion-devel@lists.alioth.debian.org/msg01942.html
[[ ${!2:0:1} == '$' ]] && eval $2=${!2}
} # _quote_readline_by_ref()
_filedir()
{
local i IFS=$'\n' xspec
_tilde "$cur" || return 0
local -a toks
local quoted tmp
_quote_readline_by_ref "$cur" quoted
toks=( ${toks[@]-} $(
compgen -d -- "$quoted" | {
while read -r tmp; do
printf '%s\n' $tmp
done
}
))
if [[ "$1" != -d ]]; then
# Munge xspec to contain uppercase version too
[[ ${BASH_VERSINFO[0]} -ge 4 ]] && \
xspec=${1:+"!*.@($1|${1^^})"} || \
xspec=${1:+"!*.@($1|$(printf %s $1 | tr '[:lower:]' '[:upper:]'))"}
toks=( ${toks[@]-} $( compgen -f -X "$xspec" -- $quoted) )
fi
[ ${#toks[@]} -ne 0 ] && _compopt_o_filenames
COMPREPLY=( "${COMPREPLY[@]}" "${toks[@]}" )
} # _filedir()
# only the following is needed if bash-autocompletion is already installed
_open ()
{
local cur;
cur=$2;
COMPREPLY=();
if [ $COMP_CWORD -eq 2 ]; then
COMPREPLY=($(compgen -W "$(/bin/ls /Applications)" -- $cur ));
return 0
fi
_filedir
}
complete -F _open open