Warum erweitert bash eine Tilde durch Tabulator, wenn ich einen vim-Dateinamen vervollständige?

8

Wenn ich tippe, cat ~/.bashr<TAB>ist der Vorgang abgeschlossen cat ~/.bashrc.

Wenn ich tippe vim ~/.bashr<TAB>, wird vim /home/neil/.bashrc...

(Es macht dasselbe mit vi, was alias ist "vim".)

Kann ich das ausschalten?

Neil
quelle

Antworten:

5

Dies wird durch / etc / bash_completion gesteuert

Sie können den Erweiterungscode in _expand () auskommentieren, wenn Sie ihn nicht mögen.

Hier ist meine Version in Fedora 17, aber deine sollte ähnlich sein:

# This function expands tildes in pathnames
#
_expand()
{
    # FIXME: Why was this here?
    #[ "$cur" != "${cur%\\}" ] && cur="$cur\\"

    # Expand ~username type directory specifications.  We want to expand
    # ~foo/... to /home/foo/... to avoid problems when $cur starting with
    # a tilde is fed to commands and ending up quoted instead of expanded.

    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
}
johnshen64
quelle
1
Der Speicherort der Abschlussskripte hängt vollständig von Ihrem System ab.
Daniel Beck
Hmm vielleicht. Vielen Dank. Ich benutze heutzutage nur Ubuntu / Fedora / Centos und es scheint, dass die Datei da ist. Ja, wenn es sich um eine andere Distribution handelt, kann ich mir vorstellen, dass sich die Datei / Funktion an einer anderen Stelle befindet, aber sie wird wahrscheinlich immer noch nur von einer Textdatei gesteuert.
Johnshen64
4
Danke, ich habe mein Problem "behoben", indem ich ein function _expand() { :;}in meinem definiert habe ~/.bashrc.
Neil
6

bashkann für bestimmte Befehle eine komplexere automatische Vervollständigung bereitstellen (z. B. andere Argumente für das automatische Vervollständigen von Programmen als Dateinamen). Für den Befehl auf Ihrem System ist eine solche programmierbare Vervollständigungsfunktion definiert vim.

Wenn Sie completean der Eingabeaufforderung eingeben, wird angezeigt, für welche Funktionen die automatische Vervollständigung bereitgestellt wird bash.

$ complete
complete -o default -F _complete_open open

Geben Sie ein type function_name, um mehr über ihre Definition zu erfahren.

$ type _complete_open
_complete_open is a function
_complete_open () 
{ 
   # function definition
}

Um herauszufinden, wo die Funktion definiert wurde. Verwenden Sie Folgendes:

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