Ich arbeite mit einer großen Anzahl von Dateien, die ich in einem Verzeichnis aufbewahre. Jedes Mal, wenn ich in dieses Verzeichnis gehe und versehentlich Tabzweimal drücke , dauert es zu lange (möglicherweise länger als eine Minute), um Dateien anzuzeigen, die dem Muster entsprechen, und ich ärgere mich ziemlich über dieses Verhalten.
Zum Beispiel ist meine Verzeichnisstruktur:
my-project/
├── docs/
├── data/ <---- contains around 200k files.
└── analyser/
Da ich die Fertigstellung immer noch liebe, gibt es trotzdem die Möglichkeit, diese Funktion nur im data/
Verzeichnis zu deaktivieren ? Möchten Sie eine Zeitüberschreitung von 5 Sekunden festlegen oder ein Skript, das die Fertigstellung automatisch abschaltet, wenn Sie sich in einem bestimmten Verzeichnis befinden?
bash
autocomplete
neizod
quelle
quelle
Antworten:
Das ist nicht perfekt, aber die Bash-Vervollständigung ist eine ziemlich knifflige Sache ...
Der einfachste Weg ist auf Befehlsbasis. Er ist etwas flexibler als
FIGNORE
Sie es tun können:Dies weist die automatische Vervollständigung an, dass die Vervollständigung für
vi
Dateien gilt, und das Entfernen von Mustern, die mit dem-X
Filter übereinstimmen . Der Nachteil ist, dass das Muster nicht normalisiert ist../data
und die Variationen nicht übereinstimmen.Das nächstbeste ist möglicherweise eine benutzerdefinierte
PROMPT_COMMAND
Funktion:Dadurch wird die Vervollständigung (vollständig) deaktiviert, wenn Sie sich im Verzeichnis befinden. Sie wird jedoch für jeden Pfad deaktiviert, nicht nur für Dateien in diesem Verzeichnis.
Es wäre allgemeiner sinnvoll, dies für definierte Pfade selektiv zu deaktivieren, aber ich glaube, der einzige Weg ist die Verwendung einer Standard-Vervollständigungsfunktion (bash-4.1 und höher mit
complete -D
) und viel Herumspielen.Dies sollte für Sie funktionieren, kann jedoch unbeabsichtigte Nebenwirkungen haben (z. B. Änderungen an der erwarteten Fertigstellung in einigen Fällen):
Dies funktioniert zur Vervollständigung
vi
, andere Befehle können nach Bedarf hinzugefügt werden. Die Fertigstellung der Dateien in den angegebenen Verzeichnissen sollte unabhängig von Pfad oder Arbeitsverzeichnis beendet sein.Ich glaube, dass der allgemeine Ansatz darin
complete -D
besteht, Vervollständigungsfunktionen für jeden Befehl dynamisch hinzuzufügen, wenn er angetroffen wird. Möglicherweise müssen Sie auch hinzufügencomplete -E
(Vervollständigung des Befehlsnamens, wenn der Eingabepuffer leer ist).Update Hier ist eine Hybridversion der
PROMPT_COMMAND
und Vervollständigungsfunktion Lösungen, es ist ein wenig einfacher zu verstehen und zu hacken, denke ich:Diese Eingabeaufforderungsfunktion legt die
nocomplete
Variable fest, wenn Sie eines der konfigurierten Verzeichnisse eingeben. Das geänderte Vervollständigungsverhalten tritt nur ein, wenn diese Variable nicht leer ist und wenn Sie versuchen, die Vervollständigung aus einer leeren Zeichenfolge vorzunehmen, wodurch die Vervollständigung von Teilnamen ermöglicht wird (entfernen Sie die-z "$cur"
Bedingung, um die Vervollständigung insgesamt zu verhindern). Kommentieren Sie die beidenprintf
Zeilen für den stillen Betrieb aus.Andere Optionen umfassen eine verzeichnisbezogene
.noautocomplete
Flag-Datei, die Sie nach Bedarftouch
in einem Verzeichnis ablegen können. und Erraten der Verzeichnisgröße mit GNUstat
. Sie können eine oder alle dieser drei Optionen verwenden.(Die
stat
Methode ist nur eine Vermutung , die gemeldete Verzeichnisgröße wächst mit dem Inhalt, es ist eine "High Water Mark", die normalerweise nicht verkleinert wird, wenn Dateien ohne administrativen Eingriff gelöscht werden. Sie ist billiger als die Ermittlung des tatsächlichen Inhalts einer potenziell großen Datei Das genaue Verhalten und das Inkrementieren pro Datei hängen vom zugrunde liegenden Dateisystem ab. Ich finde es zumindest auf Linux Ext2 / 3/4-Systemen ein zuverlässiger Indikator.)Bash fügt ein zusätzliches Leerzeichen hinzu, auch wenn ein leerer Abschluss zurückgegeben wird (dies tritt nur auf, wenn der Abschluss am Ende einer Zeile erfolgt). Sie können
-o nospace
dencomplete
Befehl erweitern, um dies zu verhindern.Ein verbleibender Haken ist, dass, wenn Sie den Cursor an den Anfang eines Tokens bewegen und auf die Registerkarte klicken, die Standardvervollständigung erneut aktiviert wird. Betrachten Sie es als ein Feature ;-)
(Oder Sie könnten herumfummeln,
${COMP_LINE:$COMP_POINT-1:1}
wenn Sie Überplanung mögen, aber ich finde, dass bash selbst die Beendigungsvariablen nicht zuverlässig festlegt, wenn Sie mitten in einem Befehl eine Sicherung durchführen und versuchen, die Beendigung durchzuführen .)quelle
Wenn Ihr
data
Verzeichnis z. B. Dateien mit einem bestimmten Suffix enthält,.out
können Sie Ihrebash
VariableFIGNORE
auf setzen,".out"
und diese werden ignoriert. Obwohl es auch möglich ist, Verzeichnisnamen zu verwenden, hilft dies bei aktuellen Arbeitsverzeichnisnamen nicht.Beispiel:
Erstellen Sie Tausende von 100-KB-Testdateien auf einem physischen Host mit RAID 1-Festplatten:
Setze die
bash
Variable:$ FIGNORE=".json"
Erstellen Sie die Testdatei:
$ touch test.out
Test bei 5.000 Dateien:
Es tritt keine Verzögerung zwischen dem vi und dem single
tab
beforetest.out
auf.Test bei 50.000 Dateien:
Einzelne Registerkarte erstellt einen Bruchteil einer Sekunde Verzögerung, bevor
test.out
angezeigt wird.Test bei 200.000 Dateien:
Verzögerung von 1 Sekunde zwischen dem vi und Einzel
tab
vortest.out
erscheint.Verweise:
Hervorragend von der Man-Bash
quelle
$ vi <tab><tab>
sowieso viel Zeit. : \.json
Dateien und eine einzelne Textdatei mit dem Namenfoo.txt
. Beim EinschaltenFIGNORE='.json'
tippe ich$ vi <tab>
und muss noch eine halbe Minute warten, damit es mich komplett macht$ vi foo.txt
. --- reales Szenario Ich werde keine Dateien in diesem Verzeichnis bearbeiten oder mischen, aber wenn ich sie einschalteFIGNORE
und (versehentlich) die Tabulatortaste drücke, friert meine Tastatur für eine lange Zeit ein, ohne einen Hinweis auf etwasDisplay all 188275 possibilities? (y or n)
, das es mir sagt dass ich meine tastatur wieder haben kann.Schätze, das ist, was du willst (Code von @ mr.spuratic ausgeliehen)
Beachten Sie, dass Sie dadurch nicht daran gehindert werden, die Tabulatortaste mit vollem Pfad zu drücken (z. B.
vim /directory/contains/lots/files<tab><tab>
quelle
pushd
/popd
. Da dies nur ein reguläres Array verwendet, kein assoziatives Array, funktioniert es auch in Bash 3.x.