..png)
Ich schreibe Zsh-Vervollständigungsfunktionen für einige Befehle aus demselben Toolkit.
Die Befehle sind so unterschiedlich, dass ich unterschiedliche Vervollständigungen für sie in unterschiedliche Dateien schreiben möchte. (d. h. die Vervollständigung für do_thingA
befindet sich in einer Datei _do_thingA
mit einem #compdef do_thingA
Header und die Vervollständigung für do_thingB
befindet sich in _do_thingB
mit #compdef do_thingB
).
So unterschiedlich sie auch sind, haben die Befehle alle ein gemeinsames Argument. Bei all den Dingen, die sich zwischen den Befehlen unterscheiden, _do_thing
enthalten alle Dateien irgendwann etwas in der Art
...
_arguments \
...
'-c[common option]:common option:_helper_function' \
...
Ich möchte vermeiden, dass _helper_function
in allen _do_thing
Dateien dasselbe definiert ist. Und darüber hinaus möchte ich den Benutzern ermöglichen, ihre eigenen (besser personalisierten _helper_function
) Definitionen bereitzustellen.
Wie lässt sich dies am besten erreichen?
Dinge, die berücksichtigt werden müssen:
Definition Wache
Ich weiß bereits, dass ich mich selbst davon abhalten kann, das zu überschreiben, _helper_function
wenn es bereits definiert ist mit
(( $+functions[_helper_function] )) ||
_helper_function() {
...
}
die ich in jede der _do_thing
Dateien einfügen könnte. Aber ich würde es vorziehen, sie _helper_function
in eine separate _helper_function
Datei auszulagern.
Funktionskörper in separate Datei einfügen
Wenn ich eine Datei erstelle _helper_function
(und sie irgendwo im habe fpath
), wird ihr Inhalt zum Funktionskörper einer _helper_function
Funktion. In diesem Szenario weiß ich nicht, wie ich den Definitionsschutz um den _helper_function()
Header setzen soll (da ich ihn nicht mehr selbst schreibe).
Antwort1
Eine Methode wäre, _helper_function
irgendwo hinein fpath
und dann hinein zu platzieren..zshrc
autoload -U _helper_function
Wenn der Benutzer es dann anpassen möchte, muss er lediglich eine neue _helper_function
Datei fpath
so einfügen, dass seine Version vor Ihrer gefunden wird, z. B. in firstfuncdir
:
% cd
% mkdir firstfuncdir
% fpath=(~/firstfuncdir $fpath)
% print -l $fpath
/Users/jhqdoe/firstfuncdir
/Users/jhqdoe/.zsh/functions/darwin
/Users/jhqdoe/.zsh/functions
/usr/local/share/zsh/site-functions
/opt/local/share/zsh/site-functions
/opt/local/share/zsh/5.5.1/functions
%