8 votes

Pourquoi bash développe-t-il un tilde lorsque je complète un nom de fichier vim?

Si je tape cat ~/.bashr alors cela se complète en cat ~/.bashrc.

Si je tape vim ~/.bashr alors cela se complète en vim /home/neil/.bashrc...

(Cela fonctionne de la même manière avec vi, qui est aliasé en "vim".)

Puis-je désactiver cela?

6voto

Daniel Beck Points 105590

bash peut fournir une autocomplétion plus sophistiquée pour certains commandes (par exemple, l'autocomplétion des arguments de programme autres que les noms de fichiers). Une telle fonction Completion Programmable est définie pour la commande vim sur votre système.

En tapant complete à l'invite de commande, vous verrez quelles fonctions sont utilisées pour fournir l'autocomplétion pour bash.

$ complete
complete -o default -F _complete_open open

Tapez type nom_fonction pour en apprendre davantage sur leur définition.

$ type _complete_open
_complete_open est une fonction
_complete_open () 
{ 
   # définition de la fonction
}

Pour savoir où la fonction a été définie, utilisez ce qui suit :

$ shopt -s extdebug
$ declare -F _complete_open
_complete_open 70 /Users/danielbeck/.bash_profile

5voto

johnshen64 Points 4503

Cela est contrôlé par /etc/bash_completion

vous pouvez commenter le code d'expansion dans _expand() si vous ne l'aimez pas.

voici ma version dans Fedora 17, mais la vôtre devrait être similaire :

# Cette fonction expand les tildes dans les chemins des fichiers
#
_expand()
{
    # FIXME: Pourquoi était-ce ici?
    #[ "$cur" != "${cur%\\}" ] && cur="$cur\\"

    # Élargir les spécifications de répertoire de type ~nom_utilisateur.  Nous voulons développer
    # ~foo/... en /home/foo/... pour éviter des problèmes lorsque $cur commençant par
    # un tilde est envoyé aux commandes et se retrouve entre guillemets au lieu d'être développé.

    if [[ "$cur" == \~*/* ]]; then
        eval cur=$cur
    elif [[ "$cur" == \~* ]]; then
        cur=${cur#\~}
        COMPREPLY=( $( compgen -P '~' -u "$cur" ) )
        [ ${#COMPREPLY[@]} -eq 1 ] && eval COMPREPLY[0]=${COMPREPLY[0]}
        return ${#COMPREPLY[@]}
    fi
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X