Die automatische Vervollständigung mit der Tab-Schaltfläche wird unter bestimmten Bedingungen nicht abgeschlossen

496
Gefolge

Wir wissen, dass einige Befehle bei einigen Dateien / Verzeichnissen nicht funktionieren. Als Beispiel können wir den Befehl "cd" nicht für eine Datei verwenden. Wenn wir versuchen, die Tabulatortaste zu drücken, um unsere Zeile zu vervollständigen, zeigt das System uns keine Datei zum Abschluss an.

Ich bin jedoch auf ein interessantes Szenario gestoßen, als ich mit der Autovervollständigungsfunktion einen Dateinamen vervollständige, der mit ".a" endet. Ich kann dieses Szenario wie folgt erklären:

[root@myserver multipath]# ls -1 idlist idlist.a idlist.b multipath.a multipath.sh 

Ich habe diese Dateien in einem Verzeichnis.

  • Wenn ich "vim m" eingebe und dann die Schaltfläche "Tab" drücke, vervollständigt das System diesen Befehl automatisch als "vim multipath.sh".
  • Wenn ich "vim idlist" eingebe und dann die Schaltfläche "Tab" drücke, werden zwei Optionen angezeigt: "idlist" und "idlist.b". Es gibt keine Option "idlist.a".
  • Und schließlich, wenn ich "cat (oder irgendetwas anderes)" verwende, werden mir Dateien angezeigt, die mit ".a" enden (mit allen Optionen). Da gibt es nichts Verwirrendes.

Was ist das Geheimnis von ".a"? Warum vervollständigt das System diese Dateien nicht, wenn wir den Befehl vi / vim verwenden?

3
Können Sie bitte die Ausgabe von ** `vollständiger Dateiname [TAB]` ** anzeigen? Nur um zu sehen, ob bash diese Datei mit der Endung .a erkennt oder nicht. C0deDaedalus vor 6 Jahren 1
Entschuldigung, ich verstehe es nicht. Welchen Befehl verwende ich? ist "vollständiger Dateiname" ein Befehl? Wenn Sie jedoch den Befehl "cat" oder etwas Ähnliches akzeptieren, lautet die Ausgabe: cat idlist [tab] - idlist idlist.a idlist.b -. wenn ich vim: vim idlist [tab] - idlist idlist.b - verwende Gefolge vor 6 Jahren 0
Schreiben Sie einfach ** `vollständige Dateinamen-ID [TAB]` **. Drücken Sie `TAB` ** nicht ** Enter. Was ist auch dein $ SHELL? C0deDaedalus vor 6 Jahren 1
Ich kann nicht den kompletten Dateinamenbefehl verwenden, das habe ich nicht. Es gibt einen Befehl mit dem Namen "complete". Aber wenn ich dies versuche, ist die Ausgabe mit "cat" identisch (idlist idlist.a idlist.b). Das Problem ist nur bei vi / vim, wie ich sehe. und die Shell: echo $ SHELL -> / bin / bash Gefolge vor 6 Jahren 0

1 Antwort auf die Frage

1
Kamil Maciorowski

In meinem Kubuntu gibt es keine /usr/share/bash-completion/completions/vimDatei, sondern die Datei

/usr/share/bash-completion/bash_completion 

enthält diese Zeile:

_install_xspec '*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)' vi vim gvim rvim view rview rgvim rgview gview emacs xemacs sxemacs kate kwrite 

Beachten Sie, es gibt Zeilen für verschiedene Werkzeuge, viele davon.

Wenn ich set -xund dann aktiviere vimtab, sehe ich, dass das Muster mehrmals verwendet wird, schließlich sogar mit einer Großbuchstabenversion wie folgt:

compgen -f -X '!!(*.@(o|so|so.!(conf|*/*)|a|[rs]pm|gif|jp?(e)g|mp3|mp?(e)g|avi|asf|ogg|class)|*.@(O|SO|SO.!(CONF|*/*)|A|[RS]PM|GIF|JP?(E)G|MP3|MP?(E)G|AVI|ASF|OGG|CLASS))' -- 

Ich wurde vorübergehend |aaus der bash_completionDatei entfernt. Neue Instanzen von (und ) Dateien wurden basherkannt .*.a*.A

Ich glaube, dass das Muster Dateien angibt, die man normalerweise nicht als Text bearbeiten möchte. Diese Liste (die offensichtlich von der Groß- und Kleinschreibung unabhängig ist) besagt, dass wir amöglicherweise eine Bibliothek in Unix bezeichnen. Ich vermute, dies ist der Grund, es auszuschließen. Beachten Sie ound sosind andere übliche Erweiterungen für Binärdateien in Unix, sie sind auch im Muster.