Uso frequentemente il comando open -a
in Terminale per aprire le applicazioni tramite ssh. Come faccio a completarlo automaticamente con il nome di un'applicazione?
Uso frequentemente il comando open -a
in Terminale per aprire le applicazioni tramite ssh. Come faccio a completarlo automaticamente con il nome di un'applicazione?
_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
Terza versione, che ora dovrebbe essere senza distinzione tra maiuscole e minuscole e funzionare tra virgolette.
Aggiungi quanto segue al tuo .bash_profile
o .bashrc
e avvia una nuova sessione:
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
Non è necessario installare nulla. Funziona con bash
out of the box.
Compilerà automaticamente solo i nomi dei programmi se l'opzione precedente è -a
e altrimenti mostrerà il comportamento predefinito, ad es. restituisce un elenco di tutti i file nella directory corrente o completa il prefisso del percorso corrente.
I risultati sono generati da system_profiler SPApplicationsDataType
, che è il modo più semplice per ottenere tutte le applicazioni che possono essere lanciate in questo modo sul tuo sistema in quel modo. L'elenco viene elaborato per restituire solo i nomi dei programmi, che possono contenere spazi e possono essere diversi dai nomi del gruppo (anche quando si ignora il suffisso .app
Uso: digita open -a
, seguito da uno spazio, seguito da Tab
o Esc
(due volte sul mio sistema, non sicuro se è ovunque).
Esempio che mostra tutte le applicazioni di supporto per il mio scanner:
$ 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
Svantaggi e problemi di questa soluzione:
Ci sono tantissimi programmi sul tuo sistema di cui potresti non essere a conoscenza, come tutto in /System/Library/CoreServices
. Potresti non volerli elencare tutti. OTOH, è davvero facile da vedere e da avviare, ad es. CharacterPalette
o KeyboardViewer
in questo modo. * Configura le mdfind
chiamate in modo appropriato con l'argomento -onlyin
.
È un po 'lento, a causa di Ora utilizza system_profiler SPApplicationsDataType
. Potrebbe essere necessario attendere un secondo o due prima del completamento. mdfind
per ottenere rapidamente i programmi. Grazie a @Lri
È in grado di gestire spazi nei nomi delle applicazioni e nomi di programmi racchiusi tra virgolette, ma è piuttosto hacky. Richiede che la citazione sia il primo carattere: mentre Scan" to "P
è valido in bash
, questo programma non lo rileverà. Il completamento non funziona dopo uno spazio con escape (ad esempio Scan\ to
), utilizzare le virgolette in questi casi ( "Scan to
). Il supporto per gli spazi con escape è utile solo per completare DVD
in DVD\ Player
.
Completamento automatico programmabile per il salvataggio! Necessario un sacco di copie dalla Home page di completamento di Bash , tuttavia vale la pena installarlo per un sacco di magie di completamento automatico . Se lo fai, ti servirà solo l'ultima funzione ( _open
) e il comando di inizializzazione dal basso.
Aggiungi quanto segue 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/
# [email protected]/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
Leggi altre domande sui tag terminal auto-complete