Bash-Autovervollständigung mit dem Befehl vim

13

In Bash funktioniert die automatische Vervollständigung von Pfaden seit kurzem nicht mehr, wenn vimBefehle ausgegeben werden, deren Pfad tiefer als zwei Verzeichnisse ist (bei anderen Befehlen wie lsund funktioniert sie weiterhin wie erwartet cd).

Wenn ich zum Beispiel tippe ls .config/btsync/btund dann die Tabulatortaste drücke, wird dies auf erweitert ls .config/btsync/btsync.conf.

Wenn ich tippe vim .config/btund dann die Tabulatortaste drücke, wird es zu erweitert vim .config/btsync/.

Wenn ich jedoch tippe vim .config/btsync/btund dann die Tabulatortaste drücke, passiert nichts (ich würde erwarten, dass es vim .config/btsync/btsync.confwie im lsobigen Beispiel erweitert wird).

Ich bekomme das gleiche Problem, wenn ich als mein eigener Benutzer und als su ausgeführt werde.

Ich habe diesen Beitrag gelesen, in dem ein Problem mit älteren Versionen der Bash-Vervollständigung erwähnt wurde, aber ich verwende 2.1-5.

UPDATE: Nach einigen zusätzlichen Tests habe ich festgestellt, dass das Hauptproblem darin besteht, dass Bash nur Verzeichnisnamen vervollständigt, keine Dateinamen.

UPDATE: Es stellte sich heraus, dass dies bash-completiondie Hauptursache war. Siehe meinen zweiten Kommentar zur akzeptierten Antwort.

Anregungen zur möglichen Ursache dieses Verhaltens werden gerne entgegengenommen!

Der Schurkenwolf
quelle
Veröffentlichen Sie Ihre .bashrc!
Gilles 'SO- hör auf böse zu sein'
Link zu meinem .bashrcgeposteten, wie gewünscht.
TheRogueWolf
Links zu .bashrc, .aliases und .functions wurden entfernt, da sie für das Problem nicht relevant sind, nachdem die Ursache ermittelt wurde.
TheRogueWolf
gleiches Problem unter Debian 9, einige Installationen, aber nicht alle: $
Philippe Gachoud

Antworten:

10

Ich habe weitere Nachforschungen für Sie angestellt, und ich habe Folgendes gefunden: Der Schlüssel zur automatischen Vervollständigung ist der bashBefehl complete. Sie können die Regeln für vimFolgendes ausdrucken :

complete -p vim

Ebenso können Sie diese spezifischen Regeln entfernen mit:

complete -r vim

Mit diesem Befehl werden die Standardeinstellungen wiederhergestellt - die üblichen Pfade und Dateinamen werden ohne zusätzliche Logik vervollständigt. Das ist wahrscheinlich was Sie wollen.

Weitere Informationen finden Sie unter help completeoder man bashim Abschnitt zum completeBefehl (es ist eine integrierte Bash, daher ist sie in der Bash-Manpage dokumentiert).

Ein letzter Punkt - die oben genannten Änderungen betreffen nur die aktuelle bashSitzung, wenn Sie die vim Regeln entfernen wollen nach jedem Login die setzen complete -r vimauf Ihre ~/.bashrc.

Ich hoffe, das hilft :)

MLu
quelle
Das hat es geschafft. Vielen, vielen Dank. Der complete -p vimBefehl wurde zurückgegeben complete -F _filedir_xspec vimund vom complete -r vimBefehl entfernt, wodurch das Problem behoben wurde. Ich werde den completeBefehl und die vom Schalter -p zurückgegebenen Informationen lesen . Ein wenig verwundert, warum sich dieses Verhalten so geändert hat, wird das auch untersuchen.
TheRogueWolf
3
Es scheint, als ob die Bash-Vervollständigung der Schuldige war. Die _filedir_xspecFunktion /usr/share/bash-completion/bash_completionschließt nur Verzeichnisse ab. Ich habe deinstalliert bash-completion, die complete -r vimLeitung von meinem entfernt .bashrcund neu gestartet und vimverhält mich nun wie erwartet.
TheRogueWolf
3

Standardmäßig vervollständigt Bash automatisch nur Pfad- und Dateinamen. Der Mechanismus ist jedoch erweiterbar und es kann Bash beigebracht werden, unterschiedliche Autovervollständigungen für unterschiedliche Programme durchzuführen. Beispielsweise gitkann es die Unterbefehlsnamen (Klonen, Festschreiben) und Revisionen anstelle von nur Pfadnamen automatisch vervollständigen. Manchmal ist es praktisch, manchmal ziemlich ärgerlich - zum Beispiel, wenn gzip -des abgelehnt wird, Dateinamen zu vervollständigen, die das nicht haben.gz Erweiterung .

Die Bash-Vervollständigung ist normalerweise in konfiguriert /etc/bash_completion.d- Sie werden dort wahrscheinlich eine Datei finden, die aufgerufen wird vim. Dies ist die Datei, die die Regeln für die automatische Vervollständigung der Befehlszeile enthält vim.

Jetzt haben Sie zwei Möglichkeiten:

  1. Korrigieren Sie die Datei entweder so, dass die Pfade automatisch vervollständigt werden, wie Benutzer es wahrscheinlich sowieso erwarten.
  2. Entfernen Sie die Datei, um die Sonderregeln zu deaktivieren vimund führen Sie nur die automatische Vervollständigung des Standardpfads durch.

Und natürlich einen Fehlerbericht einreichen, der das Problem umreißt, damit es in zukünftigen Versionen behoben wird :)

MLu
quelle
Vielen Dank für die tolle Erklärung :) Ich habe mich umgesehen /etc/bash_completion.dund es ist nur eine hgDatei vorhanden (für Mercurial). Sehr eigenartig.
TheRogueWolf
1
Dann muss es woanders sein. Versuchen Sie, /usr/share/bash-completion/alle Dateien von vimpackage oder from bashoder bash-completionpackages aufzulisten (nicht sicher, wie sie unter ArchLinux aufgerufen werden). Es wird irgendwo da sein.
MLu
1
Das Auflisten von Dateien aus den bash-completionPaketshows /usr/share/bash-completion/completionsenthält Regeln für viele Programme, jedoch nicht für alle vim. Bei der Auflistung der mit dem vimPaket installierten Dateien werden keine vervollständigungsbezogenen Dateien angezeigt, und bei der Suche im gesamten System werden find / -name vimauch keine vervollständigungsbezogenen Dateien angezeigt.
TheRogueWolf
2

Vielleicht könnten Sie die Bash-Vervollständigung neu installieren: apt-get install --reinstall bash-completion

Und schauen Sie sich die Datei /etc/bash.bashrc an: nano /etc/bash.bashrc

Und vergewissern Sie sich, dass die folgende Zeile unkommentiert ist:

if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi

Starten Sie dann Ihre Terminalsitzung neu

Djidiouf
quelle
Ich habe versucht bash-completion, das vimVerhalten zu entfernen , es zu testen und dann erneut zu installieren bash-completionund zu testen, aber unter beiden Umständen trat immer noch das gleiche Problem auf. Die von Ihnen aufgelisteten Zeilen sind in nicht vorhanden /etc/bash.bashrc. Diese Zeile ist jedoch[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
TheRogueWolf