Die Tab-Vervollständigung funktioniert nicht für Argumente, wenn der Befehl ein Alias ​​ist

7

Ich habe einen Alias, ee, der für meinen Lieblingseditor mg definiert ist. Wenn ich so etwas mache

mg fo

und dann auf Tab drücken, wenn eine Datei foo existiert, bekomme ich Tab-Vervollständigung zu:

mg foo

Auf den meisten Systemen, die ich verwende (z. B. alle Versionen von Ubuntu seit vielen Jahren und einige Installationen von Debian),

ee fo

auch komplett zu vervollständigen

ee foo

Auf einem von mir verwendeten System mit Debian 6.0 und GNU Bash 4.1.5 (1) -Veröffentlichung schlägt die Tab-Vervollständigung für die Version mit dem Alias ​​fehl. Beachten Sie, dass dies kein Problem beim Vervollständigen des Alias ​​selbst ist - es ist ein Problem beim Vervollständigen der Argumente des Alias-Befehls. Gibt es eine Möglichkeit, dieses Verhalten auf dem Debian-System zu beheben? Upgrade auf Bash 4.2.x? Mit Konfigurationsdateien herumspielen?

Ben Crowell
quelle
2
Haben Sie das Bash-Completion-Paket installiert? Beschaffen Sie /etc/bash_completion?
Jordan
@jordanm: Ja, Bash-Vervollständigung ist installiert. Ich weiß nicht, ob ich / etc / bash_completion für jede Anmeldesitzung automatisch beschaffe, aber ich vermute, dass ich irgendwo bin, weil $ BASH_COMPLETION definiert ist. Wenn ich eine explizite "source / etc / bash_completion" mache, wird das Problem nicht behoben.
Ben Crowell

Antworten:

4

Bearbeiten: OK. Scheint, als hätte ich die Situation falsch verstanden. Dachten Sie meinten Programmoptionen wie in:

$ mplayer_alias -pla<tab><tab>
-playing-msg  -playlist
$

Aber ich denke, es ist die Vervollständigung der Datei. Ich weiß es nicht, aber probieren Sie es aus.

Als schnelle Lösung sollte dies funktionieren:

complete -f -o default ee

Geben:

$ ee<tab><tab>
file1 file2 file3
$

ab programmierbaren Vervollständigungs-Builtins . ZB -X patternkann das nützlich sein. ZB ausschließen .swpund .swoDateien:

complete -f -X '*.sw[op]' ee

nur zeigen .zip, .ZIP:

complete -f -o default -X '!*.+(zip|ZIP)' my_unzip_alias

Bei einigen müssen Sie möglicherweise eine shopt -s extglobKonfigurationsdatei hinzufügen .



ALTE Antwort:

Sie könnten so etwas in Ihrem ausprobieren .bash_completion.

Zumindest als Vorspeise.

Die Kernidee besteht darin, completeden Alias einfach mit dem vorhandenen vollständigen Skript für das reale Programm hinzuzufügen . Hier gehe ich davon aus, dass sie alle im Format sind:

complete -F _complete_function_from_original program_name

Sie können das bekommen, was es ist, indem Sie Folgendes ausführen : complete -p program_name. Am besten zuerst überprüfen.

Für einige Methoden wie apt-getkann man nur Alias ​​+ Laden verwenden:

_load_comp_hack apt-get myalias

Für andere wie mplayereinen braucht man einen Funktions-Wrapper, wie zB:

myalias() { mplayer "$@"; }
                      |
                      +--- Could be messy

Es ist durchaus möglich, dass es einen besseren Weg gibt, dies zu lösen, aber für meinen Gebrauch hat es gut funktioniert. Ich verwende es hauptsächlich für Wrapper-Skripte, bei denen ich die Funktionalität des ursprünglichen Programms erweitere. Habe es nicht für Aliase verwendet.

Ich fühle mich bei diesem Hack nicht sicher, aber Sie könnten sehen, ob es funktioniert.

_load_comp_hack()
{
    local cc=
    # Make sure completion scripts are sourced.
    # Report error if source fail.
    if . "/usr/share/bash-completion/completions/$1" >/dev/null 2>&1; then
        # Extract the completion function used by the "real" program.
        if cc="$(complete -p "$1" | cut -d' ' -f3)"; then
            # Add it to the alias
            complete -F "$cc" "$2"
            return 0
        fi
    fi
    echo "bash-completion '$1' for '$2' not found."
}

_load_comp_hack mplayer mplad
_load_comp_hack apt-get z
                |       |
                |       +----- Alias, script or function
                +------------- Real function

Einige Programme verwenden eine allgemeinere Vervollständigung _longopt, bei der die Quelldatei nicht gefunden wird. Normalerweise ist es auch nicht erforderlich, eine Quelle zu finden, daher könnte eine einfachere Variante sein:

_load_comp_hack()
{
    local cc=
    if cc=$(complete -p "$1" | cut -d' ' -f3); then
            complete -F "$cc" "$2"
    fi
}

Ein Problem hierbei, IIRC, ist, dass einige Abschlussskripte erst bei der ersten Ausführung geladen werden, wie in :
prog tabtab. Alternativ können Sie es auch hinzufügen, elsewenn die Beschaffung von Dateien fehlschlägt.

Runium
quelle
Danke für den Vorschlag. Für das eigentliche Programm scheint keine eigene Fertigstellung definiert zu sein. complete -p mggibt kein Ergebnis. Und doch bekomme ich die Tab-Vervollständigung, wenn ich das echte Programm benutze ...?
Ben Crowell
@ BenCrowell: Vervollständigungen wie in Programmoptionen, keine Dateien?
Runium
@ BenCrowell: Aktualisierte Antwort. Ist es jetzt richtig?
Runium
Großartig, complete -f -o default eeist eine Lösung. +1, Antwort akzeptiert. Weitere Tests zeigen auch, dass das ursprüngliche Problem nur auftrat, wenn mehrere mögliche Abschlüsse ziemlich lang waren. Unter diesen Bedingungen war mg vollständig, ee jedoch nicht. Danach complete -f -o default eearbeitet ee bei langen Abschlüssen genauso wie mg.
Ben Crowell
0

Ihr Problem ist: Bash-Vervollständigung versteht keine Aliase. Wenn Sie also einen Alias ​​schreiben, wird dieser einfach als unbekannter Befehl angesehen und nicht automatisch vervollständigt. Sie können entweder auf die Standardvervollständigung des Dateinamens zurückgreifen, wenn Sie dies wünschen. Sie können auch ein Programm installieren , das Aliase vor der automatischen Vervollständigung erweitert und Ihre Aliase als Alias-Befehle vervollständigt.

Cyker
quelle