[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bash y auto-completado para los alias



Andaba optimizando mi bashrc que estaba muy cargado y arreglé una
utilidad que no había terminado de hacer funcionar.
La comparto con uds, es muy útil para los que usamos alias. 
Es preciso aclarar que para su funcionamiento correcto deben tenerla
posterior al bloque
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi
Esto es solo en caso contrario al que no tengan descomentariado dicho
bloque en /etc/bash.bashrc

# completion_alias_wrapper recibe tres argumentos:
# $1: El alias
# $2: El comando usado en el alias
# $3: Los argumentos del comando en el alias
# Fuente:
http://stackoverflow.com/questions/342969/how-do-i-get-bash-completion-to-work-with-aliases
function completion_alias_wrapper() {
    [[ "$#" == 3 ]] || return 1

    local alias_name="$1"
    local aliased_command="$2"
    local alias_arguments="$3"
    local num_alias_arguments=$(echo "$alias_arguments" | wc -w)

    # Obteniendo descripción del completador para el comando.
    local completion=$(complete -p $aliased_command 2> /dev/null)

    # Solo se puede hacer una envoltura de un completador basado en
función, 
    # así que se busca -F en la variable 'completion'.
    echo $completion | grep -q -- -F || return 0

    local namespace=alias_completion::

    # Se separa el nombre de la función de completado.
    local completion_function=${completion##* -F }
    completion_function=${completion_function%% *}

    # Se evita un ciclo infinito para no envolver una función de
completamiento
    # generada por esta función. Esto puede suceder cuando se corre este
código
    # dos veces para un alias como ls='ls --color=auto' o alias l='ls'
y 
    # alias ls='l foo'
    [[ "${completion_function#$namespace}" != $completion_function ]] &&
return 0

    local wrapper_name="${namespace}${alias_name}"

    eval "function ${wrapper_name}() {
            let COMP_CWORD+=$num_alias_arguments
            args=( \"${alias_arguments}\" )
            COMP_WORDS=( $aliased_command \${args[@]} \
${COMP_WORDS[@]:1} )
            $completion_function
          }"
    # Para crear el nuevo completado se usa el viejo con dos reemplazos:
    # 1) Sustitución de la función con la envoltura.
    local new_completion=${completion/-F * /-F $wrapper_name }
    # 2) Sustitución del comando por el alias.
    new_completion="${new_completion% *} $alias_name"
    eval "$new_completion"
}
# Para cada alias definido (personalmente no me es práctico esto, así
que no la uso)
#eval "$(alias -p | sed -e 's/alias \([^=][^=]*\)='\''\([^ ][^ ]*\) *
\(.*\)'\''/completion_alias_wrapper \1 \2 '\''\3'\'' /')"

-- 
Marcel Sánchez Góngora
Debian testing/sid
Linux User #382151
El pobre puede morir, lo que no puede es estar enfermo.
     ** Proverbio finlandés.

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: