Erzwingen Sie die normale Vervollständigung der Registerkarte "Bash", wenn die intelligente Vervollständigung fehlschlägt

10

Seit die Tab-Vervollständigung zur Standardfunktion in Shells geworden ist, bin ich ein sehr zufriedener Benutzer davon. Ich mag sogar Bashs intelligente Vervollständigung (bei der nur nach PDF-Dateien gesucht wird, wenn ich evince foo <TAB> eingebe) - solange es richtig errät.

Es ruiniert einen ansonsten glücklichen Tag, an dem Bash seine intelligente Fertigstellung nutzt, um die Fertigstellung abzulehnen.

Heute wollte ich:

tar xvf centos5.8_x86_1.ova

Also gab ich ein:

tar xvf cent<TAB>

und Bash weigert sich, den Pfad zu vervollständigen, da .ova-Dateien nicht das sind, was Sie normalerweise mit tar verwenden.

Ich weiß, dass ich das Bash-Completion-Paket deinstallieren kann, um die intelligente Vervollständigung zu entfernen. Aber kann ich meinen Kuchen auch essen?

Kann ich bash bitten, zuerst die intelligente Vervollständigung zu verwenden, und wenn dies fehlschlägt, dann die nicht intelligente Vervollständigung zu verwenden?

Ole Tange
quelle
1
<spam> Zsh kann das. </ spam>
Gilles 'SO - hör auf böse zu sein'

Antworten:

9

Folgendes sollte die normale Bash-Vervollständigung aktivieren, nachdem alle 'intelligenten' Vervollständigungen für die Programme tar, vim und emacs fehlgeschlagen sind:

compopt -o bashdefault tar vim emacs

Siehe auch die entsprechende Seite im Online-Bash-Handbuch.

Vorsichtsmaßnahme: Sie erhalten das normale Verhalten für die Art der Vervollständigung (Befehle / Dateinamen / Benutzernamen usw.), die durch die intelligente Vervollständigung des vorliegenden Befehls definiert wird. Beispielsweise vervollständigt die Vervollständigung für serviceDateinamen nicht, selbst wenn Sie aufrufen complete -o bashdefault service.

In diesem und anderen Fällen, in denen die intelligente automatische Vervollständigung fehlschlägt, können Sie jederzeit Alt-/(oder M-/in der Notation des Bash-Handbuchs) drücken , um Dateinamen fast genauso zu vervollständigen , wie TAB funktioniert, wenn die intelligente Vervollständigung deaktiviert ist (fast auf die gleiche Weise in dem Sinne, in dem M-/dies nicht der Fall ist) vollständige Muster wie *.txt). Siehe hier für Tastenfolgen für andere Arten von Fertigstellungen wie Befehl und Benutzername.

Matthieu
quelle
2
Vielen Dank für die Alt- / Erwähnung, ich hatte keine Ahnung, dass da
Michael Speer
1

Die Bash-Vervollständigung ist eine Erweiterung der Bash-Standardvervollständigung und selbst ein Bash-Programm. Wenn Sie also die Funktionsweise des Programms ändern möchten, ändern Sie es einfach. Dies ist freie Software, Sie können es tun. Für den speziellen Fall des tarBefehls lautet die Datei /usr/share/bash-completion/completions/tar. Um tareine Datei mit der Erweiterung automatisch zu vervollständigen ova, fügen Sie sie einfach der Zeile hinzu

local tars='@(@(tar|gem|spkg)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

so heißt es

local tars='@(@(tar|gem|spkg|ova)?(.@(Z|[gx]z|bz?(2)|lzma))|t@([glx]z|bz?(2)))'

Beachten Sie, dass dies der Pfad und der Code ist, die für Debian Wheezy (aktuelle stabile Version) vorhanden sind. Eine andere Distribution oder Version hat möglicherweise einen anderen Code, aber die Idee ist dieselbe. Öffnen Sie den Code und passen Sie ihn an, um das zu tun, was Sie möchten.

Bearbeiten: Mir ist gerade aufgefallen, dass die Frage jedes Mal gestellt wurde, wenn keine Übereinstimmung gefunden wurde, und nicht nur der spezifische Fall des Hinzufügens ovazu tar. Vielleicht kann es für jemanden immer noch nützlich sein, zu wissen, wo er nach der Quelle suchen kann.

Carandraug
quelle
4
Das Ändern von Dateien in / usr, die dem Paketmanager gehören, ist ein guter Weg, um beim Upgrade einen bösen Schock auszulösen. Besser: Überschreiben Sie die Paketkonfiguration.
Chris Down
1
@ ChrisDown und wie würdest du das machen? Ich bin immer noch auf der Suche nach der sauberen .bashrc-Lösung.
Clayton Stanley