Ich habe ein Bash-Tab-Vervollständigungsskript für Apaches Hadoop. Normalerweise verwende ich zsh als meine tägliche Shell. Es neigt dazu, ziemlich bashartig zu sein, wenn ich es brauche, aber es sieht so aus, als ob sich die Tab-Vervollständigungssysteme zwischen ihnen radikal unterscheiden. Gibt es eine einfache Möglichkeit, die vorhandenen Definitionen für die Vervollständigung von Bash-Tabs in zsh zu "konvertieren"? Ich möchte nicht viel Zeit in diese Sache investieren, aber wenn es einfach ist, würde ich einen moderaten Aufwand sparen.
quelle
/etc/zsh/zshrc
. Überprüfen Sie auch die folgenden Dateien in umgekehrter Reihenfolge (aufgeführt in der Reihenfolge , wie sie während des zsh Start bezogen werden):/etc/zsh/zshenv
,$ZDOTDIR/.zshenv
,/etc/zsh/zprofile
und$ZDOTDIR/.zprofile
(wahrscheinlich~/.zprofile
) zu sehen , ob dieRCS
Variable nicht gesetzt ist. Wenn dies der Fall ist, wird verhindert, dass die nachfolgenden Dateien nach der Datei, in der sie nicht festgelegt wurden, bezogen werden. Überprüfen Sie abschließend die Shell für den Benutzer/etc/passwd
und stellen Sie sicher, dass sie vorhanden istzsh
und dass sie kein-f
Argument enthält.quelle
complete:13: command not found: compdef
Fehler.if is-bash
Überprüfung._get_comp_words_by_ref
die nicht durch definiert sindbashcompinit
. Die meisten Vervollständigungen verwenden diese Funktion jedoch nicht.Ich
zsh 5.0.2 (x86_64-apple-darwin13.0)
führe zsh ohne ~ / .zshrc aus und die obige Sequenz hat in einer frisch erzeugten zsh-Shell funktioniert.Danke an git-vervollständigung.bash Skript für den Hinweis: D.
Lesen Sie weiter für weitere Details zu den obigen 3 Zeilen:
Bash hat eingebaute automatische Vervollständigung Unterstützung genial , aber der Bash - Skripte zum automatischen Vervollständigung funktioniert nicht direkt zsh als zsh Umgebung nicht die wesentliche bash zum automatischen Vervollständigung Hilfsfunktionen wie
compgen
,complete
. Dies geschieht, um die zsh-Sitzung schnell zu halten.In diesen Tagen ZSH mit entsprechendem Abschluss - Skripte wie ausgeliefert wird
compinit
undbashcompinit
welche die erforderlichen Funktionen zur Unterstützung Bash - Skripte zum automatischen Vervollständigung.autoload <func_name>
: Beachten Sie, dass das automatische Laden in zsh und nicht in bash definiert ist.autoload
Sucht nach einer Datei mit dem Namen in den vomfpath
Befehl zurückgegebenen Verzeichnispfaden und markiert eine Funktion, die beim ersten Aufruf geladen werden soll.Zum Beispiel auf meinem System
echo $fpath
zurückgegeben/usr/share/zsh/site-functions
und/usr/share/zsh/5.0.5/functions
und beidecompinit
undbashcompinit
sind verfügbar bei/usr/share/zsh/5.0.5/functions
.Auch für die meisten Menschen nur sein kann ist
autoload -U +X bashcompinit && bashcompinit
erforderlich, weil einige andere Skript wie git oder die automatische Vervollständigung ihrer eigenen~/.zshrc
kann tunautoload -U +X compinit && compinit
, aber es ist sicher nur sie beide laufen.quelle
-U
und+X
wofür?+X foo
, dass das gleiche automatische Laden wie beim Aufrufen ausgeführtfoo
wird, ohne es jedoch sofort auszuführen. Diesautoload +X foo && foo
scheint also völlig überflüssig zu sein. Können Sie erklären, warum Sie dieses Muster gewählt haben?autoload -U +X bashcompinit && bashcompinit
ist, dass (aufgrund der&&
)bashcompinit
IFF ausgeführt wird, wenn das Modul tatsächlich gefunden wird. Normal gibtautoload foo
immer true zurück. Später, wenn Sie ausführen versuchenfoo
, dann schließlich zsh sagen Sie „Funktion Definitionsdatei nicht gefunden“. Mit erhaltenautoload +X
Sie den Fehler sofort.autoload +X
Lädt die Funktion, ohne sie auszuführen - was mehr ist alsautoload
ohne+X
. Ohne lädt+X
Autoload die Funktion nicht einmal ; Der Name verweist lediglich auf eine Funktion, die später geladen werden soll. Das eigentliche Laden wird erst versucht, wenn die Funktion zum ersten Mal aufgerufen wird. Wenn Sie feststellen möchten, ob die genannte Funktion erfolgreich geladen wurde, müssen Sie+X
den Ladeschritt sofort ausführen.Zur
zsh
Verwendung:compdef
compadd
Mein Beispiel:
Quelle: Mein Code https://github.com/reduardo7/bashx
quelle
Ich verwende Antigen als Oh-My-Zsh-Plugin-Manager. Ich hatte ein paar Bash-Vervollständigungsskripte von Kollegen geschrieben, die ich mit einem einfachen in Zsh laden wollte
source /path/to/completion
.Ich hatte einige Probleme, weil es so aussieht, als ob Antigen oder OMZ (schwer zu sagen) sich nur darum kümmern, Abschlussskripte von ihren Plugins zu laden. Ich habe das endlich durch Autoloading
bashcompinit
undcompinit
danach umgangenantigen apply
. Nur das automatische Ladenbashcompinit
war nicht genug.Antigen erstellt seine
.zcompdump
Datei, bei$ANTIGEN_COMPDUMP
der für mich war~/.antigen/.zcompdump
Durch das erneute Aufrufen von compinit und bashcompinit wird ein zweiter .zcompdump bei erstellt
$HOME/.zcompdump
Das scheint alles zu klappen, denn ich kann die von eingerichteten Vervollständigungen verwenden
/path/to/bash_completion
. Ich habe beide .zcompdump-Dateien einige Male gelöscht, um sicherzustellen, dass sie neu generiert werden und anscheinend funktionieren.Ich musste die .zcompdump-Dateien einige Male nach einem Neustart des Computers speichern, da beim Versuch, die Registerkarte zu vervollständigen, Fehler aufgetreten sind. Ich bin mir jedoch nicht sicher, ob dies auf diese Einrichtung oder auf etwas anderes zurückzuführen ist.
rm ~/.zcompdump && rm $ANTIGEN_COMPDUMP
und eine neue Shell behebt das für mich.Zum Zeitpunkt des Schreibens verwendete Versionen:
quelle