|
| 1 | +# Eigene Vervollständigungen |
| 2 | + |
| 3 | +Eigene Vervollständigungen kombinieren zwei Merkmale von Nushell: |
| 4 | +Eigene Befehle und Vervollständigungen. Mit ihnen können Befehle erzeugt werden, |
| 5 | +die Vervollständigungen für Positions- sowie Markierungs-Argumente enthalten. |
| 6 | +Die eigenen Vervollständigungen funktionieren für eigene Befehle und [bekannt gemachte externe Befehle (via `extern`)](externs.md). |
| 7 | + |
| 8 | +Eigene Vervollständigungen bestehen aus zwei Teilen: |
| 9 | +Dem Befehl, der die Vervollständigung bereitstellt, und die Verknüpfung mit dem Argument des Befehls, der die Vervollständigung bekommt, mit Hilfe von `@`. |
| 10 | + |
| 11 | +## Beispiel eigene Vervollständigung |
| 12 | + |
| 13 | +Hier ein Beispiel: |
| 14 | + |
| 15 | +``` |
| 16 | +> def tiere [] { ["katze", "hund", "aal" ] } |
| 17 | +> def my-command [tier: string@tiere] { print $tier } |
| 18 | +>| my-command |
| 19 | +katze hund aal |
| 20 | +``` |
| 21 | + |
| 22 | +In der ersten Zeile wird ein eigener Befehl erstellt, der eine Liste von drei verschiedenen Tieren zurückgibt. |
| 23 | +Dies sind die Werte, die in der Vervollständigung verwendent werden. Ist dieser Befehl erstellt, kann er für weitere Vervollständigungen von Befehlen und [`extern`](/commands/docs/extern.md) verwendet werden. |
| 24 | + |
| 25 | +In der zweiten Zeile, wird `string@tiere` verwendet. |
| 26 | +Dies sagt Nushell zwei Dinge: |
| 27 | +Die Form des Arguments um den Typ überprüfen zu können, sowie die Vervollständigung, falls der Benutzer diese an der Stelle verwenden möchte. |
| 28 | + |
| 29 | +Auf der dritten Zeile wird der Name des zu vevollständigenden Befehls `my-command` eingegeben gefolgt von der `<tab>` Taste. Dies führt die Vervollständigung aus. Eigene Vervollständigungen funktionieren identisch zu anderen Vervollständigungen. Wird `a` gefolgt von der `<tab>` Taste gedrückt, wird automatisch "aal" ausgegeben. |
| 30 | + |
| 31 | + |
| 32 | +## Module und eigene Vervollständigung |
| 33 | + |
| 34 | +Es empfiehlt sich die eigenen Vervollständigungen von der öffentlichen API zu trennen. Dafür bieten sich Module an. |
| 35 | + |
| 36 | +Hier das Beispiel von oben in einem Modul: |
| 37 | + |
| 38 | +``` |
| 39 | +module commands { |
| 40 | + def tiere [] { |
| 41 | + ["katze", "hund", "aal" ] |
| 42 | + } |
| 43 | +
|
| 44 | + export def my-command [tier: string@tiere] { |
| 45 | + print $tier |
| 46 | + } |
| 47 | +} |
| 48 | +``` |
| 49 | + |
| 50 | +In diesem Modul wird nur der Befehl `my-command`, aber nicht die Vervollständigung `tiere` exportiert. Dies erlaubt es den Befehl auszuführen, sowie die Vervollständigung zu verwenden, ohne auf die eigene Vervollständigung Zugriff zu haben. |
| 51 | +Dies hält die API sauberer und bietet dennoch alle Funktionen an. |
| 52 | + |
| 53 | +Dies ist möglich, weil die Vervollständigungen mit dem Marker `@` zusammen mit dem Befehl eingeschlossen werden. |
| 54 | + |
| 55 | +## Kontextsensitive eigene Vervollständigungen |
| 56 | + |
| 57 | +Es ist möglich den Kontext einer Vervollständigung mit zu geben. Dies ist nützlich, wenn vorangehende Argumente in die Vervollständigung mit einbezogen werden müssen. |
| 58 | + |
| 59 | +Bezogen auf das obige Beispiel sieht dies so aus: |
| 60 | + |
| 61 | +``` |
| 62 | +module commands { |
| 63 | + def tiere [] { |
| 64 | + ["katze", "hund", "aal" ] |
| 65 | + } |
| 66 | +
|
| 67 | + def tier-name [context: string] { |
| 68 | + { |
| 69 | + katze: ["Missy", "Phoebe"] |
| 70 | + hund: ["Lulu", "Enzo"] |
| 71 | + aal: ["Eww", "Slippy"] |
| 72 | + } | get -i ($context | split words | last) |
| 73 | + } |
| 74 | +
|
| 75 | + export def my-command [ |
| 76 | + tier: string@tiere |
| 77 | + name: string@tier-name |
| 78 | + ] { |
| 79 | + print $"Als ($tier) heisse ich ($name)." |
| 80 | + } |
| 81 | +} |
| 82 | +``` |
| 83 | +Der Befehl `tier-name` gibt die entsprechende Liste der Namen zurück. Dies funktioniert, weil der Wert der `$context` Variablen, dem Text entspricht, der bis zu dem Zeitpunkt eingegeben wurde. |
| 84 | + |
| 85 | +``` |
| 86 | +>| my-command |
| 87 | +katze hund aal |
| 88 | +>| my-command hund |
| 89 | +Lulu Enzo |
| 90 | +>my-command hund enzo |
| 91 | +Als hund heisse ich Enzo |
| 92 | +``` |
| 93 | + |
| 94 | +Auf der zweiten Zeile wird, sobald die `<tab>` Taste gedrückt wurde, das Argument `"my-command hund"` dem `tier-namen` Kontext übergeben. |
| 95 | + |
| 96 | +## Eigene Vervollständigungen und [`extern`](/commands/docs/extern.md) |
| 97 | + |
| 98 | +Sehr mächtig ist die Kombination von eigenen Vervollständigungen mit [externen Befehlen](externs.md). Diese funktionieren gleich wie die Vervollständigungen zu eigenen Befehlen: |
| 99 | +Erstellen der Vervollständigung und anbinden an ein Positions- oder Markierungs-Argument des `extern` mit dem `@` Zeichen. |
| 100 | + |
| 101 | +In der Default Konfiguration finden sich ebenfalls Vervollständigungen: |
| 102 | + |
| 103 | +``` |
| 104 | +export extern "git push" [ |
| 105 | + remote?: string@"nu-complete git remotes", # the name of the remote |
| 106 | + refspec?: string@"nu-complete git branches" # the branch / refspec |
| 107 | + ... |
| 108 | +] |
| 109 | +``` |
| 110 | + |
| 111 | +Die Vervollständigung erfüllt hier die gleiche Rolle wie in den Beispielen zuvor. Es werden zwei verschiedene Vervollständigungen verwendet, abhängig von der Position, die bisher eingegeben wurde. |
| 112 | + |
| 113 | +## Eigene Beschreibungen |
| 114 | + |
| 115 | +Alternativ zu einer Liste von Strings, kann eine Vervollständigung auch einen Record aus einem `value` und einer `description` zurückgeben. |
| 116 | + |
| 117 | +``` |
| 118 | +def my_commits [] { |
| 119 | + [ |
| 120 | + { value: "5c2464", description: "Add .gitignore" }, |
| 121 | + { value: "f3a377", description: "Initial commit" } |
| 122 | + ] |
| 123 | +} |
| 124 | +``` |
| 125 | + |
| 126 | +> **Notiz** |
| 127 | +> |
| 128 | +> Mit dem folgenden Schnippsel: |
| 129 | +> |
| 130 | +> ```nu |
| 131 | +> def my-command [commit: string@my_commits] { |
| 132 | +> print $commit |
| 133 | +> } |
| 134 | +> ``` |
| 135 | +> |
| 136 | +> aufgepasst, auch wenn die Vervollständigung folgendes zeigt |
| 137 | +> |
| 138 | +> ```nu |
| 139 | +> >_ my-command <TAB> |
| 140 | +> 5c2464 Add .gitignore |
| 141 | +> f3a377 Initial commit |
| 142 | +> ``` |
| 143 | +> |
| 144 | +> nur die Werte, hier "5c2464" und "f3a377", werden in Befehls Argumenten verwendet! |
| 145 | +
|
| 146 | +## Extere Vervollständigungen |
| 147 | +
|
| 148 | +Externe Vervollständigungen können ebenfalls integriert werden, anstatt derer von Nushell. |
| 149 | +
|
| 150 | +Dafür muss dem Feld `external_completer` in `config.nu` eine [closure](/book/types_of_data.md#closures)) übergeben werden, welche ausgewertet wird, wenn keine Nushell Vervollständigungen gefunden werden. |
| 151 | +
|
| 152 | +```nu |
| 153 | +> $env.config.completions.external = { |
| 154 | +> enable: true |
| 155 | +> max_results: 100 |
| 156 | +> completer: $completer |
| 157 | +> } |
| 158 | +``` |
| 159 | +
|
| 160 | +Die Closure kann konfiguriert werden, einen externen Vervollständiger wie [carapace](https://github.com/rsteube/carapace-bin) zu verwenden. |
| 161 | + |
| 162 | +Wenn die Closure einen nicht lesbaren Wert (z.B. einen leeren String) zurückgibt, fällt Nushell auf die Datei Vervollständigung zurück. |
| 163 | + |
| 164 | +Ein externer Vervollständiger ist eine Funktion, die den aktuellen Befehl als String Liste entgegennimmt, und eine Liste von Records mit `value` und `description` zurückgibt. Wie bei eigenen Nushell Vervollständigungen. |
| 165 | + |
| 166 | +> **Notiz** |
| 167 | +> Diese Closure nimmt den aktuellen Befehl als Liste entgegen. Zum Beispiel, wird `my-command --arg1 <tab>` als Vervollständigung `[my-command --arg1 " "]` erhalten. |
| 168 | +
|
| 169 | +Dieses Beispiel wird die externe Vervollständigung für carapace erstellen: |
| 170 | + |
| 171 | +```nu |
| 172 | +let carapace_completer = {|spans| |
| 173 | + carapace $spans.0 nushell $spans | from json |
| 174 | +} |
| 175 | +``` |
| 176 | + |
| 177 | +[Mehr Beispiele für eigene Vervollständigungen können im Kochbuch gefunden werden](../cookbook/external_completers.md). |
0 commit comments