Definieren Sie eine Hilfsfunktion für die Tab-Vervollständigung, die in mehreren Vervollständigungsdateien verwendet werden soll (zsh).

Definieren Sie eine Hilfsfunktion für die Tab-Vervollständigung, die in mehreren Vervollständigungsdateien verwendet werden soll (zsh).

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_thingAbefindet sich in einer Datei _do_thingAmit einem #compdef do_thingAHeader und die Vervollständigung für do_thingBbefindet sich in _do_thingBmit #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_thingenthalten alle Dateien irgendwann etwas in der Art

...
_arguments \
...
  '-c[common option]:common option:_helper_function' \
...

Ich möchte vermeiden, dass _helper_functionin allen _do_thingDateien 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_functionwenn es bereits definiert ist mit

(( $+functions[_helper_function] )) ||
_helper_function() {
  ...
}

die ich in jede der _do_thingDateien einfügen könnte. Aber ich würde es vorziehen, sie _helper_functionin eine separate _helper_functionDatei 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_functionFunktion. 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_functionirgendwo hinein fpathund dann hinein zu platzieren..zshrc

autoload -U _helper_function

Wenn der Benutzer es dann anpassen möchte, muss er lediglich eine neue _helper_functionDatei fpathso 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
% 

verwandte Informationen