Ich wollte seit JAHREN eine Lösung dafür finden.
Ich bin in vim sooo viel produktiver bei der Manipulation von Dateien als Bash aus diesem Grund.
Wenn ich habe
file_12390983421
file_12391983421
file_12340983421
file_12390986421
In bash und Typ file_1-> tab wird offensichtlich Folgendes aufgelistet:
file_12390983421 file_12391983421 file_12340983421 file_12390986421
Und es ist schrecklich langweilig und schmerzhaft, damit zu arbeiten.
Dieselbe Sequenz in vim durchläuft die Dateien nacheinander.
Bitte jemand sagt mir, wie man das in Bash macht, oder wenn es eine andere Shell gibt, die das kann, werde ich morgen wechseln.
bind TAB:menu-complete
ein.bashrc
.vi
Bearbeitungsmodus sein (set -o vi
)Antworten:
Standardmäßig
TAB
ist an dencomplete
Befehl readline gebunden . Ihr gewünschtes Verhalten wäremenu-complete
stattdessen. Sie können Ihre Readlines-Einstellungen durch Bearbeiten ändern~/.inputrc
. Fügen Sie zum erneuten BindenTAB
diese Zeile hinzu:Weitere Details finden Sie im
READLINE
Abschnitt inman bash
.quelle
menu-complete-backward
, und zumindest auf meinem Terminal scheint Shift-Tab die\e[Z
Escape-Sequenz zu senden . Dies gibt Ihnen diesen .inputrc Eintrag:"\e[Z": menu-complete-backward
Tab:complete "\e[Z":menu-complete
meine einsetzte.inputrc
. Auf diese WeiseTab
hat das ursprüngliche Verhalten undShift
+Tab
können Sie Vorschläge durchlaufen. Edit: Es soll danach einen Zeilenumbruch gebenTab:complete
. Ich kann das hier in den Kommentaren nicht richtig stylen.Für bash> = 4 könnten Ihnen diese Einstellungen gefallen. Sie können sie direkt in der Befehlszeile ausprobieren und in Ihre
.bashrc
Datei einfügen, wenn Sie sie mögen.# If there are multiple matches for completion, Tab should cycle through them bind 'TAB':menu-complete # Display a list of the matching files bind "set show-all-if-ambiguous on" # Perform partial completion on the first Tab press, # only start cycling full results on the second Tab press bind "set menu-complete-display-prefix on"
Dieses Setup ähnelt dem von Vim
set wildmode=longest:full:list,full
Ich habe diese Einstellungen aus dieser Frage auf der Unix- und Linux-Site gezogen.
Übrigens, da Sie hier sind, ist hier ein weiteres schönes Paar Bindungen:
# Cycle through history based on characters already typed on the line bind '"\e[A":history-search-backward' bind '"\e[B":history-search-forward'
Wenn Sie also eingeben
ssh<Up>
, werden die vorherigen Zeilen durchlaufen, in denen Sie ausgeführt habenssh
Wenn Ihnen das, was Sie haben, nicht gefällt, können Sie die Linie mit löschen Ctrl-K Ctrl-U
Ich habe diese Einstellungen aus dieser Frage auf AskUbuntu gezogen.
quelle
bash --version
. Mein Mac hat nur Bash-Version 3, was leider bedeutet, dass die letzten beiden Bindungen keine Auswirkung haben.bash
(derzeit 5.0.2) unter macOS unter stackoverflow.com/a/55011144/117471Auf
# cycle forward Control-k: menu-complete # cycle backward Control-j: menu-complete-backward
Sie können auch das Hinzufügen in Betracht ziehen
# display one column with matches set completion-display-width 1
Auf diese Weise behalten Sie die aktuelle Tab-Funktionalität bei und lassen bash die Möglichkeiten in einer Spalte anzeigen. Also statt
du würdest bekommen
PS Sie können die aktuelle
readline
Bibliothek auf dieser Website der GNU Readline Library abrufen .quelle
Dank @sth habe ich gefunden, was für mich am besten funktioniert:
Um die normale Vervollständigung der Bash-Tabs beizubehalten, und verwenden Sie dann ctl-f, um bei Bedarf mit menu-complete durchzugehen
Fügen Sie dies in Ihre .inputrc-Datei ein:
"\C-f": menu-complete
quelle
Nach meiner Erfahrung hat die in etws Antwort angegebene Lösung für mich nie vollständig funktioniert. TL; DR : Fügen Sie
set -o vi
Ihrem hinzu~/.bashrc
.Wenn ich menu-complete in Verbindung mit vi-Tastenkombinationen verwende, muss ich sicherstellen, dass meine
~/.bashrc
:set -o vi
Es war noch nie genug für mich
~/.inputrc
:TAB: menu-complete set editing-mode vi set keymap vi
Ich vermute, dass das irgendwie
set editing-mode
undset keymap
dieTAB: ...
Einstellung verstopft , aber ich habe die Dokumentation nicht gründlich durchgesehen, um herauszufinden, warum dies der Fall ist.quelle
set...
Teil geht rein~/.bashrc
, der zweiteTAB:...
Teil geht rein~/.inputrc
. Sie würden bekommen,TAB command not found
wenn Sie diesen Teil in setzen~/.bashrc
.