16 votos

Es allí una manera de auto-completar el comando abrir en Terminal?

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?

9voto

Fuzzy Purple Monkey Puntos 702
_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.

7voto

Aidan Ryan Puntos 5056

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 ejemplo CharacterPalette o KeyboardViewer de esta manera. *Configurar el mdfind llamada(s) apropiadamente con el -onlyin argumento.

  • Es un poco lenta, debido a la system_profiler SPApplicationsDataType. Deberás esperar un segundo o dos antes de la finalización de la muestra. Ahora usa mdfind para obtener rápidamente los programas. Gracias @Lri

  • Puede 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 en bash, este programa no lo va a detectar. La finalización no funciona después de un escapó de espacio (por ejemplo Scan\ to), el uso de comillas en estos casos ("Scan to). Apoyo para escapó espacios sólo es bueno para completar DVD a DVD\ Player.

3voto

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X