Wie kann ich die Vervollständigung von Bash-Tabs wie die Vervollständigung von Vim-Tabs verhalten und übereinstimmende Übereinstimmungen durchlaufen?


73

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.



1
Setzen Sie bind TAB:menu-completeein .bashrc.
Claudio

1
<Cn> und <Cp> verwenden standardmäßig das Menü "Vollständig"
D. Ben Knoble

@ D.BenKnoble Cn und Cp tun nichts für mich ...
Pixelearth

1
@ Pixelearth kann es nur im viBearbeitungsmodus sein ( set -o vi)
D. Ben Knoble

Antworten:


87

Standardmäßig TABist an den completeBefehl readline gebunden . Ihr gewünschtes Verhalten wäre menu-completestattdessen. Sie können Ihre Readlines-Einstellungen durch Bearbeiten ändern ~/.inputrc. Fügen Sie zum erneuten Binden TABdiese Zeile hinzu:

TAB: menu-complete

Weitere Details finden Sie im READLINEAbschnitt in man bash.


1
Das funktioniert perfekt. Eine Sache, gibt es eine Möglichkeit, dies rückwärts zu machen? In vim verwende ich Shift + Tab und wenn ich versehentlich zu weit gehe, gehe ich einfach zurück oder wenn ich am Ende der Liste beginnen möchte. Etwas, das ich den ganzen Tag in vim mache ... aber es scheint nicht mit Menü-komplett zu funktionieren.
Pixelearth

8
Menü-Vervollständigung ersetzt automatisch Ihre Eingabe, zeigt jedoch keine Kandidatenliste an. Gibt es eine Möglichkeit, beides zu tun?
Leon

17
@pixelearth: Es gibt auch menu-complete-backward, und zumindest auf meinem Terminal scheint Shift-Tab die \e[ZEscape-Sequenz zu senden . Dies gibt Ihnen diesen .inputrc Eintrag:"\e[Z": menu-complete-backward
etw

2
Es wäre wirklich cool, wenn Sie durch die Möglichkeiten radeln UND die Liste der Möglichkeiten sehen könnten, wie in vim. Es ist mühsam, jeden möglichen Dateinamen in einem Verzeichnis durchzugehen, um herauszufinden, was sich dort befindet, wenn ein Befehl ausgeführt wird.
James M. Lay

6
Ich bin mir nicht sicher, ob das noch relevant ist, aber ich hatte das gleiche Problem wie James M. Lay und löste es, indem ich Tab:complete "\e[Z":menu-complete meine einsetzte .inputrc. Auf diese Weise Tabhat das ursprüngliche Verhalten und Shift+ Tabkönnen Sie Vorschläge durchlaufen. Edit: Es soll danach einen Zeilenumbruch geben Tab:complete. Ich kann das hier in den Kommentaren nicht richtig stylen.
Karpfen

27

Für bash> = 4 könnten Ihnen diese Einstellungen gefallen. Sie können sie direkt in der Befehlszeile ausprobieren und in Ihre .bashrcDatei 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.


2
Wenn Sie Mac OS X verwenden, überprüfen Sie Ihre bash --version. Mein Mac hat nur Bash-Version 3, was leider bedeutet, dass die letzten beiden Bindungen keine Auswirkung haben.
Joeytwiddle

1
Ich habe eine Antwort auf die neueste Versionbash (derzeit 5.0.2) unter macOS unter stackoverflow.com/a/55011144/117471
Bruno Bronosky

1
Diese Konfiguration muss sich in .bashrc befinden (einige andere Antworten erwähnen .inputrc).
Étienne

14

Auf

# 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

file_12340983421 file_12390983421 file_12390986421 file_12391983421

du würdest bekommen

file_12340983421
file_12390983421
file_12390986421
file_12391983421

PS Sie können die aktuelle readlineBibliothek auf dieser Website der GNU Readline Library abrufen .


6

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

0

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 viIhrem 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-modeund set keymapdie TAB: ...Einstellung verstopft , aber ich habe die Dokumentation nicht gründlich durchgesehen, um herauszufinden, warum dies der Fall ist.


Ich erhalte den TAB-Befehl nicht gefunden. Ich habe versucht, den Bearbeitungsmodus und die Keymap auf vi zu setzen, aber immer noch nichts. In meinem inputrc unter macOS
Mladen Petrovic vom

1
@MladenPetrovic - der erste set...Teil geht rein ~/.bashrc, der zweite TAB:...Teil geht rein ~/.inputrc. Sie würden bekommen, TAB command not foundwenn Sie diesen Teil in setzen ~/.bashrc.
Terry Brown
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.