Repository: rsteube/carapace
Pull request #795 (2023-07-04 07:51:28)

doc: updated action documentation


Patch:
diff --git a/action.go b/action.go
index 53c4c84..d9b4630 100644
--- a/action.go
+++ b/action.go
@@ -151,7 +151,7 @@ func (a Action) Tag(tag string) Action {
 //	ActionValues("192.168.1.1", "127.0.0.1").TagF(func(value string) string {
 //		return "interfaces"
 //	})
-func (a Action) TagF(f func(value string) string) Action {
+func (a Action) TagF(f func(s string) string) Action {
 	return ActionCallback(func(c Context) Action {
 		invoked := a.Invoke(c)
 		for index, v := range invoked.rawValues {
diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md
index 37cdb66..1272e5f 100644
--- a/docs/src/SUMMARY.md
+++ b/docs/src/SUMMARY.md
@@ -6,29 +6,23 @@
     - [PositionalCompletion](./carapace/gen/positionalCompletion.md)
     - [FlagCompletion](./carapace/gen/flagCompletion.md) 
     - [DashCompletion](./carapace/gen/dashCompletion.md)
-  - [DefaultActions](./carapace/defaultActions.md)
-    - [ActionValues](./carapace/defaultActions/actionValues.md)
-    - [ActionValuesDescribed](./carapace/defaultActions/actionValuesDescribed.md)
-    - [ActionStyledValues](./carapace/defaultActions/actionStyledValues.md)
-    - [ActionStyledValuesDescribed](./carapace/defaultActions/actionStyledValuesDescribed.md)
-    - [ActionFiles](./carapace/defaultActions/actionFiles.md)
-    - [ActionDirectories](./carapace/defaultActions/actionDirectories.md)
-    - [ActionExecutables](./carapace/defaultActions/actionExecutables.md)
-    - [ActionMessage](./carapace/defaultActions/actionMessage.md)
-    - [ActionCallback](./carapace/defaultActions/actionCallback.md)
-    - [ActionMultiParts](./carapace/defaultActions/actionMultiParts.md)
-    - [ActionExecCommand](./carapace/defaultActions/actionExecCommand.md)
-    - [ActionExecute](./carapace/defaultActions/actionExecute.md)
-    - [ActionImport](./carapace/defaultActions/actionImport.md)
   - [Action](./carapace/action.md)
-    - [Custom](./carapace/action/custom.md)
-    - [Chdir](./carapace/action/chDir.md)
+    - [Cache](./carapace/action/cache.md)
+    - [Chdir](./carapace/action/chdir.md)
     - [Invoke](./carapace/action/invoke.md)
+    - [List](./carapace/action/list.md)
+    - [MultiParts](./carapace/action/multiParts.md)
     - [NoSpace](./carapace/action/noSpace.md)
-    - [Suppress](./carapace/action/suppress.md)
+    - [Prefix](./carapace/action/prefix.md)
     - [Style](./carapace/action/style.md)
+    - [StyleF](./carapace/action/styleF.md)
+    - [StyleR](./carapace/action/styleR.md)
+    - [Suffix](./carapace/action/suffix.md)
+    - [Suppress](./carapace/action/suppress.md)
     - [Tag](./carapace/action/tag.md)
+    - [TagF](./carapace/action/tagF.md)
     - [Timeout](./carapace/action/timeout.md)
+    - [UniqueList](./carapace/action/uniqueList.md)
     - [Usage](./carapace/action/usage.md)
   - [InvokedAction](./carapace/invokedAction.md)
     - [Filter](./carapace/invokedAction/filter.md)
@@ -37,9 +31,25 @@
     - [Suffix](./carapace/invokedAction/suffix.md)
     - [ToA](./carapace/invokedAction/toA.md)
     - [ToMultiPartsA](./carapace/invokedAction/toMultiPartsA.md)
+  - [DefaultActions](./carapace/defaultActions.md)
+    - [ActionValues](./carapace/defaultActions/actionValues.md)
+    - [ActionValuesDescribed](./carapace/defaultActions/actionValuesDescribed.md)
+    - [ActionStyledValues](./carapace/defaultActions/actionStyledValues.md)
+    - [ActionStyledValuesDescribed](./carapace/defaultActions/actionStyledValuesDescribed.md)
+    - [ActionFiles](./carapace/defaultActions/actionFiles.md)
+    - [ActionDirectories](./carapace/defaultActions/actionDirectories.md)
+    - [ActionExecutables](./carapace/defaultActions/actionExecutables.md)
+    - [ActionMessage](./carapace/defaultActions/actionMessage.md)
+    - [ActionCallback](./carapace/defaultActions/actionCallback.md)
+    - [ActionMultiParts](./carapace/defaultActions/actionMultiParts.md)
+    - [ActionExecCommand](./carapace/defaultActions/actionExecCommand.md)
+    - [ActionExecute](./carapace/defaultActions/actionExecute.md)
+    - [ActionImport](./carapace/defaultActions/actionImport.md)
+  - [CustomActions](./carapace/customActions.md)
+  - [Context](./carapace/context.md)
   - [Batch](./carapace/batch.md)
-  - [Cache](./carapace/cache.md)
   - [Export](./carapace/export.md)
+  - [Group](./carapace/group.md)
   - [Standalone](./carapace/standalone.md)
     - [caraparse](./carapace/standalone/caraparse.md)
     - [pflag](./carapace/standalone/pflag.md)
diff --git a/docs/src/carapace/action/cache-key.cast b/docs/src/carapace/action/cache-key.cast
new file mode 100644
index 0000000..44f3511
--- /dev/null
+++ b/docs/src/carapace/action/cache-key.cast
@@ -0,0 +1,168 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688512430, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.063668, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.064262, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.077479, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.07761, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[1.083614, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[1.083923, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.084251, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.102835, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.271215, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[1.557746, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[1.750025, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[1.750151, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[1.856803, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h"]
+[1.8571, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.857895, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.858192, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.859084, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.859273, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.937524, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[2.084582, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[2.084702, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[2.167025, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[2.313667, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[2.381708, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[2.481632, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[2.872305, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[3.029311, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[3.17432, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cc\r\u001b[26C\u001b[?25h"]
+[3.233592, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Ca\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[3.44697, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cche\r\u001b[30C\u001b[?25h"]
+[3.751462, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--cache \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--cache\u001b[0;2;7m (Cache())\u001b[0;m  \u001b[0;34m--cache-key\u001b[0;2m (Cache())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.149735, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4m-key \r\n\r\n\u001b[0;m\u001b[K\u001b[0;34m--cache\u001b[0;2m (Cache())\u001b[0;m  \u001b[0;7;34m--cache-key\u001b[0;2;7m (Cache())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.622999, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--cache-key \r\n\u001b[J\u001b[A\r\u001b[35C\u001b[?25h"]
+[4.623098, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[35C\u001b[?25h"]
+[4.900834, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[0;4mone/\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone\u001b[0;m  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.444547, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[35C\u001b[Kone/\r\n\u001b[J\u001b[A\r\u001b[39C\u001b[?25h"]
+[5.444645, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[5.683527, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C01:13:55 \r\u001b[48C\u001b[?25h"]
+[6.154996, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[6.756166, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[46C\u001b[?25h"]
+[6.795844, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[6.796269, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[45C\u001b[?25h"]
+[6.797089, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[45C\u001b[?25h"]
+[6.797224, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[45C\u001b[?25h"]
+[6.835691, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[6.875224, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[6.915338, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[7.03566, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C13:55 \r\u001b[48C\u001b[?25h"]
+[7.344797, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[7.945402, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[7.984774, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[8.024454, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[8.064965, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[8.104615, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[8.144433, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h"]
+[8.184677, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[40C\u001b[?25h"]
+[8.224507, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[8.2646, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[8.406855, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[8.602478, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[8.74979, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[8.860539, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35Ct\r\u001b[36C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[9.091108, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36Cwo/\r\u001b[39C\u001b[?25h"]
+[9.583651, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C01:13:59 \r\u001b[48C\u001b[?25h"]
+[10.160272, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[10.761328, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[10.800816, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[10.841049, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[10.880899, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[10.920837, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[10.960757, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h"]
+[11.000635, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
+[11.040338, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[11.080382, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[11.256122, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[11.739176, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[12.136079, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[12.33794, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35Co\r\u001b[36C\u001b[?25h"]
+[12.33804, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[12.610772, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36Cne/\r\u001b[39C\u001b[?25h"]
+[12.885119, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C01:13:55 \r\u001b[48C\u001b[?25h"]
+[13.347653, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[13.948679, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[13.987974, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[14.02794, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[14.068093, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[14.10747, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[14.14744, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h"]
+[14.187144, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
+[14.22749, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[14.267261, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[14.307835, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[14.347585, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[14.766212, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36Cne/\r\u001b[39C\u001b[?25h"]
+[15.113081, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C01:13:55 \r\u001b[48C\u001b[?25h"]
+[15.878706, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[16.480198, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[16.519767, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[16.559926, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[16.600055, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[16.639054, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[16.679903, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[41C\u001b[?25h"]
+[16.719438, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
+[16.805166, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C1:14:06 \r\u001b[48C\u001b[?25h"]
+[17.405175, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[18.00553, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[18.045739, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[18.085457, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[18.125707, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[18.16528, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[18.205184, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h"]
+[18.245282, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
+[18.285469, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[18.325141, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[18.472727, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[18.672541, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[18.819988, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[18.857989, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35Ct\r\u001b[36C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[19.173694, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36Cwo/\r\u001b[39C\u001b[?25h"]
+[19.521158, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C01:13:59 \r\u001b[48C\u001b[?25h"]
+[20.21624, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[20.817469, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[20.856894, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[20.896863, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[20.937133, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[20.97653, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[21.016633, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h"]
+[21.077078, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C:14:11 \r\u001b[48C\u001b[?25h"]
+[22.326626, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[22.927215, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[22.967476, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[23.007047, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[23.047037, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[23.087107, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[23.136275, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C14:11 \r\u001b[48C\u001b[?25h"]
+[23.438058, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[24.039071, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[24.078516, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[24.118644, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[24.158722, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[43C\u001b[K\r\u001b[43C\u001b[?25h"]
+[24.198191, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[42C\u001b[K\r\u001b[42C\u001b[?25h"]
+[24.238572, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41C\u001b[K\r\u001b[41C\u001b[?25h"]
+[24.278321, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40C\u001b[K\r\u001b[40C\u001b[?25h"]
+[24.318056, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[24.358239, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[24.398461, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[24.568409, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[24.735902, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[24.947221, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35Co\r\u001b[36C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[25.064721, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36Cne/\r\u001b[39C\u001b[?25h"]
+[25.06495, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[25.06564, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[25.06577, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[25.367388, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C01:14:06 \r\u001b[48C\u001b[?25h"]
+[26.729416, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[26.729536, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[26.729981, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[26.748501, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[26.748657, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[27.09323, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[27.286194, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[27.286277, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[27.491864, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[27.567421, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[27.567492, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[27.705051, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h"]
+[27.705158, "o", "\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/cache.cast b/docs/src/carapace/action/cache.cast
new file mode 100644
index 0000000..dc2ed4d
--- /dev/null
+++ b/docs/src/carapace/action/cache.cast
@@ -0,0 +1,82 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688551063, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.055144, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.055701, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.056095, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.064965, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.065006, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[1.015554, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.015982, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.027178, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.027313, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[1.247908, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[1.39673, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[1.527173, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[1.615056, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.729731, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.84526, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[1.845792, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.846099, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.847011, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.847779, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.94159, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h"]
+[2.55314, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14C\u001b[0;4maction \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34maction\u001b[0;2;7m (action example)                                                \r\n\u001b[0;34malias\u001b[0;2m (action example)                                                 \r\n\u001b[0;mcompletion\u001b[0;2m (Generate the autocompletion script for the specified shell)\r\n\u001b[0;34mflag\u001b[0;2m (flag example)                                                    \r\n\u001b[0;mhelp\u001b[0;2m (Help about any command)                                          \r\n\u001b[0;35minjection\u001b[0;2m (just trying to break things)                                \r\n\u001b[0;33mmodifier\u001b[0;2m (modifier example)                                            \r\n\u001b[0;mmultiparts\u001b[0;2m (multiparts example)                                        \r\n\u001b[0;mspecial                                                                \u001b[9A\r\u001b[22C\u001b[?25h"]
+[2.851885, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[22Cm\r\n\r\n\r\n\r\n\r\n\r\n\u001b[K\u001b[0;33mmodifier\u001b[0;2m (modifier example)                                            \r\n\u001b[0;m\u001b[Kmultiparts\u001b[0;2m (multiparts example)                                        \u001b[0;m\r\n\u001b[J\u001b[A\u001b[7A\r\u001b[23C\u001b[?25h"]
+[2.853703, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[7A\r\u001b[23C\u001b[?25h"]
+[2.901053, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[14C\u001b[K\u001b[0;4mmodifier \r\n\u001b[23C\u001b[0;mo\r\n\u001b[K\u001b[0;7;33mmodifier\u001b[0;2;7m (modifier example)\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[24C\u001b[?25h"]
+[3.539541, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[14C\u001b[Kmodifier \r\n\u001b[J\u001b[A\r\u001b[23C\u001b[?25h"]
+[3.53962, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[23C\u001b[?25h"]
+[3.820682, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[3.820772, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[3.978722, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[4.105482, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--batch \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--batch\u001b[0;2;7m (Batch())                                 \u001b[0;m  \u001b[0;34m--persistentFlag2\u001b[0;2m (Help message for persistentFlag2)\r\n\u001b[0;34m--cache\u001b[0;2m (Cache())                                 \u001b[0;m  \u001b[0;34m--timeout\u001b[0;2m (Timeout())                               \r\n\u001b[0;34m--cache-key\u001b[0;2m (Cache())                             \u001b[0;m  \u001b[0;34m--tomultiparts\u001b[0;2m (ToMultiPartsA())                    \r\n\u001b[0;m--help\u001b[0;2m (help for modifier)                        \u001b[0;m  \u001b[0;34m--usage\u001b[0;2m (Usage())                                   \r\n\u001b[0;33m--persistentFlag\u001b[0;2m (Help message for persistentFlag)\u001b[0;m\u001b[5A\r\u001b[22C\u001b[?25h"]
+[4.625278, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[22Cc\r\n\u001b[17C\u001b[K  \u001b[0;34m--cache\u001b[0;2m (Cache())\u001b[0;m  \u001b[0;34m--cache-key\u001b[0;2m (Cache())\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[23C\u001b[?25h"]
+[4.625395, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[23C\u001b[?25h"]
+[4.692309, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[25C\u001b[K\u001b[0;4mcache \r\n\u001b[23C\u001b[0;ma\r\n\u001b[2C\u001b[K\u001b[0;7;34mcache\u001b[0;2;7m (Cache())\u001b[0;m  \u001b[0;34m--cache-key\u001b[0;2m (Cache())\u001b[0;m\u001b[1A\r\u001b[24C\u001b[?25h"]
+[4.692635, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[5.264578, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--cache \r\n\u001b[J\u001b[A\r\u001b[31C\u001b[?25h"]
+[5.265815, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[31C\u001b[?25h"]
+[5.638732, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31C11:57:49 \r\u001b[40C\u001b[?25h"]
+[6.36486, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[6.365533, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[6.365885, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[6.366533, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[6.366708, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[6.965124, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[7.004251, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[7.04417, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[7.08354, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[35C\u001b[?25h"]
+[7.236944, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C7:49 \r\u001b[40C\u001b[?25h"]
+[7.74129, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[8.341727, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[8.381197, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[8.421591, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[8.421689, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[8.461716, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[8.50113, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
+[8.525937, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34C57:49 \r\u001b[40C\u001b[?25h"]
+[8.841861, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[9.441847, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[9.48161, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[9.52198, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[9.583079, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C:49 \r\u001b[40C\u001b[?25h"]
+[9.998092, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C\u001b[K\r\u001b[39C\u001b[?25h"]
+[10.597708, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[10.637848, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[10.677524, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[10.717427, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[10.743662, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C7:54 \r\u001b[40C\u001b[?25h"]
+[13.380821, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[40C\u001b[?25h"]
+[13.442623, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[13.442693, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.443907, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.462229, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.462434, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.462523, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.4628, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.462828, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.462893, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.914993, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[14.107927, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[14.238013, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[14.338606, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[14.483371, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/cache.md b/docs/src/carapace/action/cache.md
new file mode 100644
index 0000000..534522e
--- /dev/null
+++ b/docs/src/carapace/action/cache.md
@@ -0,0 +1,60 @@
+# Cache
+
+[`Cache`] caches an [Action] for a given duration.
+
+```go
+return carapace.ActionValues(
+	time.Now().Format("15:04:05"),
+).Cache(5 * time.Second)
+```
+
+![](./cache.cast)
+
+> Caches are implicitly assigned a unique key using [`runtime.Caller`] which can change between releases.
+
+
+## Key
+
+Additional keys like [`cache.String`] can be passed as well.
+
+```go
+carapace.ActionMultiParts("/", func(c carapace.Context) carapace.Action {
+	switch len(c.Parts) {
+	case 0:
+		return carapace.ActionValues("one", "two").Suffix("/")
+	case 1:
+		return carapace.ActionValues(
+			time.Now().Format("15:04:05"),
+		).Cache(10*time.Second, cache.String(c.Parts[0]))
+	default:
+		return carapace.ActionValues()
+	}
+}),
+```
+
+![](./cache-key.cast)
+
+
+## Location
+
+Cache is written as `json` to [`os.UserCacheDir`] using the [Export] format.
+
+```handlebars
+{{cacheDir}}/carapace/{{binary}}/{{callerChecksum}}/{{cacheChecksum}}
+```
+
+| ID             | x                                | example                                    |
+| ----           | ---                              | ---                                        |
+| cacheDir       | os.UserCacheDir                  | `~/.cache/`                                |
+| binary         | binary name                      | `carapace`                                 |
+| callerChecksum | sha1sum using [`runtime.Caller`] | `89be88b670885d3d7855c7169ad7cfd2816a6c37` |
+| cacheChecksum  | sh1sum of given [`CacheKeys`]    | `041858daaaa8b084122d4604a3223315c39edc3e` |
+
+[Action]:../action.md
+[`Cache`]:https://pkg.go.dev/github.com/rsteube/carapace#Action.Cache
+[`cache.String`]:https://pkg.go.dev/github.com/rsteube/carapace/pkg/cache#String
+[`CacheKeys`]:https://pkg.go.dev/github.com/rsteube/carapace/pkg/cache#CacheKey
+[callback actions]:./defaultActions/actionCallback.md
+[Export]:../export.md
+[`os.UserCacheDir`]:https://pkg.go.dev/os#UserCacheDir
+[`runtime.Caller`]:https://pkg.go.dev/runtime#Caller
\ No newline at end of file
diff --git a/docs/src/carapace/action/chdir.cast b/docs/src/carapace/action/chdir.cast
new file mode 100644
index 0000000..9a92b4b
--- /dev/null
+++ b/docs/src/carapace/action/chdir.cast
@@ -0,0 +1,78 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688556429, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.06519, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.065975, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.07839, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.078608, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.531712, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.531844, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.532237, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.54742, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.697299, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.836097, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.904647, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.987161, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h"]
+[0.987815, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[0.989694, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[0.990114, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.154889, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.347402, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[1.347495, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.723117, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.861777, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Ca\r\u001b[15C\u001b[?25h"]
+[1.861868, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.958127, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Cc\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[2.144094, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Ction \r\u001b[21C\u001b[?25h"]
+[2.600491, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[21C-\r\u001b[22C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[22C\u001b[?25h"]
+[2.743417, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[22C-\r\u001b[23C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[23C\u001b[?25h"]
+[2.990015, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23Cf\r\u001b[24C\u001b[?25h"]
+[2.990114, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[3.176989, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24Ciles\r\u001b[28C\u001b[?25h"]
+[3.610347, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[21C\u001b[K\u001b[0;4m--files \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--files\u001b[0;2;7m (ActionFiles())                                  \r\n\u001b[0;34m--files-filtered\u001b[0;2m (ActionFiles(\".md\", \"go.mod\", \"go.sum\"))\u001b[0;m\u001b[2A\r\u001b[22C\u001b[?25h"]
+[4.147993, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[21C\u001b[K--files \r\n\u001b[J\u001b[A\r\u001b[29C\u001b[?25h"]
+[4.285916, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[29C\u001b[0;4mDockerfile \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;38;2;255;184;108mDockerfile      \u001b[0;m  \u001b[0;38;2;255;184;108mcommand.go            \u001b[0;m  \u001b[0;38;2;189;147;249mdocs/             \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction.go     \r\nLICENSE.txt     \u001b[0;m  \u001b[0;38;2;255;184;108mcompat.go             \u001b[0;m  \u001b[0;38;2;189;147;249mexample-nonposix/ \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction_test.go\r\nREADME.md       \u001b[0;m  \u001b[0;38;2;255;184;108mcompat_test.go        \u001b[0;m  \u001b[0;38;2;189;147;249mexample/          \u001b[0;m  \u001b[0;38;2;255;184;108mlog.go               \r\naction.go       \u001b[0;m  \u001b[0;38;2;255;184;108mcomplete.go           \u001b[0;m  \u001b[0;38;2;255;184;108mgo.mod            \u001b[0;m  \u001b[0;38;2;189;147;249mpkg/                 \r\n\u001b[0;38;2;255;184;108maction_test.go  \u001b[0;m  \u001b[0;38;2;255;184;108mcontext.go            \u001b[0;m  \u001b[0;38;2;255;184;108mgo.sum            \u001b[0;m  \u001b[0;38;2;255;184;108mstorage.go           \r\nbatch.go        \u001b[0;m  \u001b[0;38;2;255;184;108mcontext_test.go       \u001b[0;m  \u001b[0;38;2;255"]
+[4.286156, "o", ";184;108mgo.work           \u001b[0;m  \u001b[0;38;2;255;184;108mstorage_test.go      \r\nbatch_test.go   \u001b[0;m  \u001b[0;38;2;255;184;108mdefaultActions.go     \u001b[0;m  \u001b[0;38;2;255;184;108mgo.work.sum       \u001b[0;m  \u001b[0;38;2;189;147;249mthird_party/         \r\n\u001b[0;38;2;255;184;108mcarapace.go     \u001b[0;m  \u001b[0;38;2;255;184;108mdefaultActions_test.go\u001b[0;m  \u001b[0;38;2;189;147;249minternal/         \u001b[0;m  \u001b[0;38;2;255;184;108mtraverse.go          \r\ncarapace_test.go\u001b[0;m  \u001b[0;38;2;255;184;108mdocker-compose.yml    \u001b[0;m  \u001b[0;38;2;255;184;108minternalActions.go\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[7.10001, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[29C\u001b[K\r\n\u001b[J\u001b[A\r\u001b[29C\u001b[?25h"]
+[7.690199, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[28C\u001b[K\r\u001b[28C\u001b[?25h"]
+[8.291365, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27C\u001b[K\r\u001b[27C\u001b[?25h"]
+[8.330548, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26C\u001b[K\r\u001b[26C\u001b[?25h"]
+[8.370665, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25C\u001b[K\r\u001b[25C\u001b[?25h"]
+[8.410891, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C\u001b[K\r\u001b[24C\u001b[?25h"]
+[8.450801, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\r\u001b[23C\u001b[?25h"]
+[8.490208, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[22C\u001b[K\r\u001b[22C\u001b[?25h"]
+[8.530079, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[21C\u001b[K\r\u001b[21C\u001b[?25h"]
+[8.570656, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[20C\u001b[K\r\u001b[20C\u001b[?25h"]
+[8.610243, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[19C\u001b[K\r\u001b[19C\u001b[?25h"]
+[8.650122, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[18C\u001b[K\r\u001b[18C\u001b[?25h"]
+[8.690271, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[17C\u001b[K\r\u001b[17C\u001b[?25h"]
+[8.833358, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16C\u001b[K\r\u001b[16C\u001b[?25h"]
+[9.024433, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15C\u001b[K\r\u001b[15C\u001b[?25h"]
+[9.296775, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14C\u001b[K\r\u001b[14C\u001b[?25h"]
+[9.55473, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[9.631552, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[9.806768, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[10.178591, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[10.33168, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[10.465203, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--batch \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--batch\u001b[0;2;7m (Batch())         \u001b[0;m  \u001b[0;33m--persistentFlag\u001b[0;2m (Help message for persistentFlag)  \r\n\u001b[0;34m--cache\u001b[0;2m (Cache())         \u001b[0;m  \u001b[0;34m--persistentFlag2\u001b[0;2m (Help message for persistentFlag2)\r\n\u001b[0;34m--cache-key\u001b[0;2m (Cache())     \u001b[0;m  \u001b[0;34m--timeout\u001b[0;2m (Timeout())                               \r\n\u001b[0;34m--chdir\u001b[0;2m (Chdir())         \u001b[0;m  \u001b[0;34m--tomultiparts\u001b[0;2m (ToMultiPartsA())                    \r\n\u001b[0;m--help\u001b[0;2m (help for modifier)\u001b[0;m  \u001b[0;34m--usage\u001b[0;2m (Usage())                                   \u001b[0;m\u001b[5A\r\u001b[22C\u001b[?25h"]
+[10.756785, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[22Cc\r\n\u001b[17C\u001b[K  \u001b[0;34m--cache\u001b[0;2m (Cache())\u001b[0;m  \u001b[0;34m--cache-key\u001b[0;2m (Cache())\u001b[0;m  \u001b[0;34m--chdir\u001b[0;2m (Chdir())\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[23C\u001b[?25h"]
+[10.756895, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[23C\u001b[?25h"]
+[10.829069, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[23Ch\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[10.829495, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[10.940922, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[25C\u001b[K\u001b[0;4mchdir \r\n\u001b[24C\u001b[0;md\r\n\u001b[2C\u001b[K\u001b[0;7;34mchdir\u001b[0;2;7m (Chdir())\u001b[0;m\u001b[1A\r\u001b[25C\u001b[?25h"]
+[10.941306, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[10.944574, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[10.944875, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[10.94502, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[11.567961, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--chdir \r\n\u001b[J\u001b[A\r\u001b[31C\u001b[?25h"]
+[11.902791, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31C\u001b[0;4mgopls-diff-stats-1150157846 \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;38;2;255;184;108mgopls-diff-stats-1150157846                                                       \r\n\u001b[0;38;2;58;60;78mswayrd.log                                                                        \r\nsworkstyle.lock                                                                   \r\nsworkstyle.log                                                                    \r\n\u001b[0;38;2;189;147;249msystemd-private-64309ab7b15844efa6c8fedfd1cced56-bluetooth.service-47X0F9/        \r\nsystemd-private-64309ab7b15844efa6c8fedfd1cced56-colord.service-BPEPta/           \r\nsystemd-private-64309ab7b15844efa6c8fedfd1cced56-systemd-logind.service-kSgcJ0/   \r\nsystemd-private-64309ab7b15844efa6c8fedfd1cced56-systemd-timesyncd.service-PiSD3C/\r\nsystemd-private-64309ab7b15844efa6c8fedfd1cced56-upower.service-z6SR1S/           \r\n\u001b[0;38;2;255;184;108mtmp6wla24c3-ascii.cast                                                            \r\ntmpu"]
+[11.90286, "o", "evh4yio-ascii.cast                                                            \r\n\u001b[0;38;2;189;147;249mtmux-1000/                                                                        \u001b[0;m\u001b[12A\r\u001b[22C\u001b[?25h"]
+[15.796352, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[31C\u001b[K\r\n\u001b[J\u001b[A\r\u001b[31C\u001b[?25h"]
+[16.67714, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[16.677644, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[16.693095, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[16.693291, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[16.915194, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[17.075677, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[17.180619, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[17.261798, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[17.349781, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h"]
+[17.350244, "o", "\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/chDir.md b/docs/src/carapace/action/chdir.md
similarity index 58%
rename from docs/src/carapace/action/chDir.md
rename to docs/src/carapace/action/chdir.md
index 82332a7..26a686f 100644
--- a/docs/src/carapace/action/chDir.md
+++ b/docs/src/carapace/action/chdir.md
@@ -1,13 +1,15 @@
 # Chdir
 
-[`Chdir`] changes the current working directory to the named directory during invocation.
+[`Chdir`] changes the working directory.
 
 ```go
-// completes files for path relative to current wd
+// completes files for path relative to current working directory
 carapace.ActionFiles()
 
 // complete files for path relative to `/tmp`
 carapace.ActionFiles().Chdir("/tmp")
 ```
 
+![](./chdir.cast)
+
 [`Chdir`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Chdir
diff --git a/docs/src/carapace/action/invoke.cast b/docs/src/carapace/action/invoke.cast
new file mode 100644
index 0000000..d29fe4c
--- /dev/null
+++ b/docs/src/carapace/action/invoke.cast
@@ -0,0 +1,61 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688571242, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.063564, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.064329, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.07832, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.521041, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.521922, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.537109, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.5374, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.727501, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[0.905415, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[0.905537, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[1.047803, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[1.134472, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h"]
+[1.321006, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.379712, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.486006, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.591729, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h"]
+[1.592956, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.593479, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.594485, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.594769, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.679269, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.800056, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cd\r\u001b[17C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[17C\u001b[?25h"]
+[2.032099, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[17Cifier \r\u001b[23C\u001b[?25h"]
+[2.500106, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.500198, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[2.633216, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h"]
+[2.633763, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.845559, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Ci\r\u001b[26C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.928208, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Cn\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[3.109977, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cvoke \r\u001b[32C\u001b[?25h"]
+[3.565115, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32Cfile://\r\u001b[39C\u001b[?25h"]
+[4.60574, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4mfile://Dockerfile \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;38;2;255;184;108mDockerfile      \u001b[0;m  \u001b[0;38;2;255;184;108mcommand.go            \u001b[0;m  \u001b[0;38;2;189;147;249mdocs/             \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction.go     \r\nLICENSE.txt     \u001b[0;m  \u001b[0;38;2;255;184;108mcompat.go             \u001b[0;m  \u001b[0;38;2;189;147;249mexample-nonposix/ \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction_test.go\r\nREADME.md       \u001b[0;m  \u001b[0;38;2;255;184;108mcompat_test.go        \u001b[0;m  \u001b[0;38;2;189;147;249mexample/          \u001b[0;m  \u001b[0;38;2;255;184;108mlog.go               \r\naction.go       \u001b[0;m  \u001b[0;38;2;255;184;108mcomplete.go           \u001b[0;m  \u001b[0;38;2;255;184;108mgo.mod            \u001b[0;m  \u001b[0;38;2;189;147;249mpkg/                 \r\n\u001b[0;38;2;255;184;108maction_test.go  \u001b[0;m  \u001b[0;38;2;255;184;108mcontext.go            \u001b[0;m  \u001b[0;38;2;255;184;108mgo.sum            \u001b[0;m  \u001b[0;38;2;255;184;108mstorage.go           \r\nbatch.go        \u001b[0;m  \u001b[0;38;2;255;184;108mcontext_test.go       \u001b[0;m  \u001b["]
+[4.605793, "o", "0;38;2;255;184;108mgo.work           \u001b[0;m  \u001b[0;38;2;255;184;108mstorage_test.go      \r\nbatch_test.go   \u001b[0;m  \u001b[0;38;2;255;184;108mdefaultActions.go     \u001b[0;m  \u001b[0;38;2;255;184;108mgo.work.sum       \u001b[0;m  \u001b[0;38;2;189;147;249mthird_party/         \r\n\u001b[0;38;2;255;184;108mcarapace.go     \u001b[0;m  \u001b[0;38;2;255;184;108mdefaultActions_test.go\u001b[0;m  \u001b[0;38;2;189;147;249minternal/         \u001b[0;m  \u001b[0;38;2;255;184;108mtraverse.go          \r\ncarapace_test.go\u001b[0;m  \u001b[0;38;2;255;184;108mdocker-compose.yml    \u001b[0;m  \u001b[0;38;2;255;184;108minternalActions.go\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[4.607709, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[9A\r\u001b[22C\u001b[?25h"]
+[4.608773, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[9A\r\u001b[22C\u001b[?25h"]
+[5.930215, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4mLICENSE.txt \r\n\r\n\u001b[0;m\u001b[K\u001b[0;38;2;255;184;108mDockerfile      \u001b[0;m  \u001b[0;38;2;255;184;108mcommand.go            \u001b[0;m  \u001b[0;38;2;189;147;249mdocs/             \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction.go     \r\n\u001b[0;m\u001b[K\u001b[0;7;38;2;255;184;108mLICENSE.txt     \u001b[0;m  \u001b[0;38;2;255;184;108mcompat.go             \u001b[0;m  \u001b[0;38;2;189;147;249mexample-nonposix/ \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction_test.go\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[6.543921, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4mcompat.go \r\n\r\n\r\n\u001b[0;m\u001b[K\u001b[0;38;2;255;184;108mLICENSE.txt     \u001b[0;m  \u001b[0;7;38;2;255;184;108mcompat.go             \u001b[0;m  \u001b[0;38;2;189;147;249mexample-nonposix/ \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction_test.go\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[6.996046, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4mexample-nonposix/\r\n\r\n\r\n\u001b[18C\u001b[0;m\u001b[K\u001b[0;38;2;255;184;108mcompat.go             \u001b[0;m  \u001b[0;7;38;2;189;147;249mexample-nonposix/ \u001b[0;m  \u001b[0;38;2;255;184;108minvokedAction_test.go\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[7.161825, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4minvokedAction_test.go \r\n\r\n\r\n\u001b[42C\u001b[0;m\u001b[K\u001b[0;38;2;189;147;249mexample-nonposix/ \u001b[0;m  \u001b[0;7;38;2;255;184;108minvokedAction_test.go\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[7.497609, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4mlog.go \r\n\r\n\r\n\u001b[62C\u001b[0;m\u001b[K\u001b[0;38;2;255;184;108minvokedAction_test.go\r\n\u001b[62C\u001b[0;m\u001b[K\u001b[0;7;38;2;255;184;108mlog.go               \r\n\r\n\r\n\r\n\r\n\r\n\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[8.143253, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4mexample/\r\n\r\n\r\n\r\n\u001b[42C\u001b[0;m\u001b[K\u001b[0;7;38;2;189;147;249mexample/          \u001b[0;m  \u001b[0;38;2;255;184;108mlog.go               \r\n\r\n\r\n\r\n\r\n\r\n\u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[8.14442, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[9A\r\u001b[22C\u001b[?25h"]
+[8.621752, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[Kfile://example/\r\n\u001b[J\u001b[A\r\u001b[47C\u001b[?25h"]
+[8.621862, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[47C\u001b[?25h"]
+[8.900343, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4mfile://example/README.md \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;38;2;255;184;108mREADME.md\u001b[0;m  \u001b[0;38;2;189;147;249m_test/\u001b[0;m  \u001b[0;38;2;189;147;249mcmd/\u001b[0;m  \u001b[0;38;2;255;184;108mmain.go\u001b[0;m  \u001b[0;38;2;255;184;108mmain_test.go\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.900961, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.901231, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[9.525103, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[47C\u001b[K\u001b[0;4m_test/\r\n\r\n\u001b[0;m\u001b[K\u001b[0;38;2;255;184;108mREADME.md\u001b[0;m  \u001b[0;7;38;2;189;147;249m_test/\u001b[0;m  \u001b[0;38;2;189;147;249mcmd/\u001b[0;m  \u001b[0;38;2;255;184;108mmain.go\u001b[0;m  \u001b[0;38;2;255;184;108mmain_test.go\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[9.679615, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[47C\u001b[K\u001b[0;4mcmd/\r\n\r\n\u001b[11C\u001b[0;m\u001b[K\u001b[0;38;2;189;147;249m_test/\u001b[0;m  \u001b[0;7;38;2;189;147;249mcmd/\u001b[0;m  \u001b[0;38;2;255;184;108mmain.go\u001b[0;m  \u001b[0;38;2;255;184;108mmain_test.go\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[9.979522, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[Kfile://example/cmd/\r\n\u001b[J\u001b[A\r\u001b[51C\u001b[?25h"]
+[9.979628, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[51C\u001b[?25h"]
+[11.396771, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[11.397337, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[11.419293, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[11.904508, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[12.139059, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[12.432149, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[12.432254, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[12.56813, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[13.050465, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/invoke.md b/docs/src/carapace/action/invoke.md
index b4f7e62..03099e9 100644
--- a/docs/src/carapace/action/invoke.md
+++ b/docs/src/carapace/action/invoke.md
@@ -1,7 +1,20 @@
 # Invoke
 
-[`Invoke`] explicitly executes the [callback] of an action if it exists.
+[`Invoke`] explicitly executes the [callback] of an [Action].
 
+```go
+carapace.ActionCallback(func(c carapace.Context) carapace.Action {
+	if !strings.HasPrefix(c.Value, "file://") {
+		return carapace.ActionValues("file://").NoSpace()
+	}
+
+	c.Value = strings.TrimPrefix(c.Value, "file://")
+	return carapace.ActionFiles().Invoke(c).Prefix("file://").ToA()
+})
+```
+
+![](./invoke.cast)
 
 [callback]:../defaultActions/actionCallback.md
 [`Invoke`]:https://pkg.go.dev/github.com/rsteube/carapace#Action.Invoke
+[Action]:../action.md
diff --git a/docs/src/carapace/action/list.cast b/docs/src/carapace/action/list.cast
new file mode 100644
index 0000000..e8b5f5e
--- /dev/null
+++ b/docs/src/carapace/action/list.cast
@@ -0,0 +1,62 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688557016, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.064721, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.065298, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.077878, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.078027, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.533676, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.53401, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.534431, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.544789, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.544949, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.691474, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.817453, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.902506, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.904233, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.904686, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.980639, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.125575, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.235027, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[1.235118, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.296214, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.448224, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h"]
+[1.448685, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.539819, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.653389, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[1.945425, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.082985, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.272906, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cl\r\u001b[26C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.330099, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Ci\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[2.478325, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cst \r\u001b[30C\u001b[?25h"]
+[2.829838, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30C\u001b[0;4mone\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone\u001b[0;m  three  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[3.288802, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[Kone\r\n\u001b[J\u001b[A\r\u001b[33C\u001b[?25h"]
+[3.288889, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[33C\u001b[?25h"]
+[3.554977, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C,\r\u001b[34C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[34C\u001b[?25h"]
+[3.638572, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4;33m'one,one'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone\u001b[0;m  three  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.288727, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[35C\u001b[K\u001b[0;4;33mthree'\r\n\r\n\u001b[0;m\u001b[Kone  \u001b[0;7mthree\u001b[0;m  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.441994, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;4;33mwo'\r\n\r\n\u001b[5C\u001b[0;m\u001b[Kthree  \u001b[0;7mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.442061, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.619646, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;33m'one,two'\u001b[0;m\r\n\u001b[J\u001b[A\r\u001b[39C\u001b[?25h"]
+[4.619754, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[4.861546, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C,\r\u001b[40C\u001b[?25h"]
+[4.861652, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[40C\u001b[?25h"]
+[5.074552, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4;33m'one,two,one'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone\u001b[0;m  three  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.532977, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[39C\u001b[K\u001b[0;4;33mthree'\r\n\r\n\u001b[0;m\u001b[Kone  \u001b[0;7mthree\u001b[0;m  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.758712, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;33m'one,two,three'\u001b[0;m\r\n\u001b[J\u001b[A\r\u001b[45C\u001b[?25h"]
+[5.758786, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[45C\u001b[?25h"]
+[5.999916, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C,\r\u001b[46C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[46C\u001b[?25h"]
+[6.094228, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4;33m'one,two,three,one'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone\u001b[0;m  three  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.652401, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;33m'one,two,three,one'\u001b[0;m\r\n\u001b[J\u001b[A\r\u001b[49C\u001b[?25h"]
+[6.652505, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[49C\u001b[?25h"]
+[7.603332, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[7.603432, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[7.603474, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[7.605317, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[7.621572, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[7.621822, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.121182, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[8.121263, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[8.305314, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[8.508256, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[8.508333, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[8.533533, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[8.723084, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/list.md b/docs/src/carapace/action/list.md
new file mode 100644
index 0000000..903c1d8
--- /dev/null
+++ b/docs/src/carapace/action/list.md
@@ -0,0 +1,15 @@
+# List
+
+[`List`] creates a list with given divider.
+
+```go
+carapace.ActionValues(
+    "one",
+    "two", 
+    "three"
+).List(",")
+```
+
+![](./list.cast)
+
+[`List`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.List
diff --git a/docs/src/carapace/action/multiParts.md b/docs/src/carapace/action/multiParts.md
new file mode 100644
index 0000000..4c636aa
--- /dev/null
+++ b/docs/src/carapace/action/multiParts.md
@@ -0,0 +1,15 @@
+# MultiParts
+
+[`MultiParts`] completes values splitted by given delimiter(s) separately.
+
+```go
+carapace.ActionValues(
+	"dir/subdir1/fileA.txt",
+	"dir/subdir1/fileB.txt",
+	"dir/subdir2/fileC.txt",
+).MultiParts("/")
+```
+
+![](./multiparts.cast)
+
+[`MultiParts`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Multiparts
diff --git a/docs/src/carapace/action/multiparts.cast b/docs/src/carapace/action/multiparts.cast
new file mode 100644
index 0000000..dae611f
--- /dev/null
+++ b/docs/src/carapace/action/multiparts.cast
@@ -0,0 +1,74 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688565564, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.062049, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.06244, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.074965, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.075058, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.337917, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.338047, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.338535, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.349805, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.349842, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.510653, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[0.510905, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.6179, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.715795, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[0.744384, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h"]
+[0.881582, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h"]
+[0.88186, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[0.95493, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.037789, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h"]
+[1.038074, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.305806, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h"]
+[1.347961, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.517265, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[1.782963, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[1.906101, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.067429, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cm\r\u001b[26C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.289189, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Cu\r\u001b[27C\u001b[?25h"]
+[2.289273, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[2.438833, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cltiparts \r\u001b[36C\u001b[?25h"]
+[2.781355, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36Cdir/\r\u001b[40C\u001b[?25h"]
+[3.219423, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40Csubdir\r\u001b[46C\u001b[?25h"]
+[3.727546, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;4mdir/subdir1/\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7msubdir1/\u001b[0;m  subdir2/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.318745, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[Kdir/subdir1/\r\n\u001b[J\u001b[A\r\u001b[48C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[48C\u001b[?25h"]
+[4.566859, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[48Cfile\r\u001b[52C\u001b[?25h"]
+[5.012176, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;4mdir/subdir1/fileA.txt \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mfileA.txt\u001b[0;m  fileB.txt\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.575214, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[52C\u001b[K\u001b[0;4mB.txt \r\n\r\n\u001b[0;m\u001b[KfileA.txt  \u001b[0;7mfileB.txt\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.126535, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[Kdir/subdir1/fileB.txt \r\n\u001b[J\u001b[A\r\u001b[58C\u001b[?25h"]
+[6.126626, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[58C\u001b[?25h"]
+[6.371237, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[57C\u001b[K\r\u001b[57C\u001b[?25h"]
+[6.972584, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[56C\u001b[K\r\u001b[56C\u001b[?25h"]
+[7.012496, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[55C\u001b[K\r\u001b[55C\u001b[?25h"]
+[7.052738, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[54C\u001b[K\r\u001b[54C\u001b[?25h"]
+[7.054495, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[54C\u001b[?25h"]
+[7.054793, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[54C\u001b[?25h"]
+[7.055083, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[54C\u001b[?25h"]
+[7.055631, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[54C\u001b[?25h"]
+[7.055872, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[54C\u001b[?25h"]
+[7.092268, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[53C\u001b[K\r\u001b[53C\u001b[?25h"]
+[7.132073, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[52C\u001b[K\r\u001b[52C\u001b[?25h"]
+[7.172489, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[51C\u001b[K\r\u001b[51C\u001b[?25h"]
+[7.212591, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[50C\u001b[K\r\u001b[50C\u001b[?25h"]
+[7.25273, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[49C\u001b[K\r\u001b[49C\u001b[?25h"]
+[7.292324, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[48C\u001b[K\r\u001b[48C\u001b[?25h"]
+[7.332239, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[47C\u001b[K\r\u001b[47C\u001b[?25h"]
+[7.372292, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[46C\u001b[K\r\u001b[46C\u001b[?25h"]
+[7.412148, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C\u001b[K\r\u001b[45C\u001b[?25h"]
+[7.452186, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44C\u001b[K\r\u001b[44C\u001b[?25h"]
+[7.515071, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[44Cir\r\u001b[46C\u001b[?25h"]
+[7.917584, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;4mdir/subdir1/\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7msubdir1/\u001b[0;m  subdir2/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.499718, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[46C\u001b[K\u001b[0;4m2/\r\n\r\n\u001b[0;m\u001b[Ksubdir1/  \u001b[0;7msubdir2/\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.974389, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[Kdir/subdir2/\r\n\u001b[J\u001b[A\r\u001b[48C\u001b[?25h"]
+[8.974495, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[48C\u001b[?25h"]
+[9.306282, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[48CfileC.txt \r\u001b[58C\u001b[?25h"]
+[10.739354, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[10.740433, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[10.758667, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[10.758806, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[11.462913, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[11.785595, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[12.006644, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[12.146294, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[12.146359, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[12.260252, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h"]
+[12.260522, "o", "\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/noSpace.md b/docs/src/carapace/action/noSpace.md
index e942a98..2690468 100644
--- a/docs/src/carapace/action/noSpace.md
+++ b/docs/src/carapace/action/noSpace.md
@@ -1,1 +1,15 @@
 # NoSpace
+
+[`NoSpace`] disables space suffix for given character(s).
+
+```go
+carapace.ActionValues(
+	"one,",
+	"two/",
+	"three",
+).NoSpace(',', '/')
+```
+
+![](./nospace.cast)
+
+[`NoSpace`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.NoSpace
diff --git a/docs/src/carapace/action/nospace.cast b/docs/src/carapace/action/nospace.cast
new file mode 100644
index 0000000..6d77ca7
--- /dev/null
+++ b/docs/src/carapace/action/nospace.cast
@@ -0,0 +1,59 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688565847, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.065292, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.065969, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.079004, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.079174, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.77873, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.778831, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.779179, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.792905, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.793049, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.948994, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[1.048908, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[1.198171, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[1.226787, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.359539, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h"]
+[1.455036, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[1.455132, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.537737, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.650472, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h"]
+[1.737749, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.843306, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[2.142738, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[2.273551, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.424128, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cn\r\u001b[26C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.467972, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Co\r\u001b[27C\u001b[?25h"]
+[2.595409, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cspace \r\u001b[33C\u001b[?25h"]
+[3.086686, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[0;4;33m'one,'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone,\u001b[0;m  three  two/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.04082, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[33C\u001b[K\u001b[0;33m'one,'\u001b[0;m\r\n\u001b[J\u001b[A\r\u001b[39C\u001b[?25h"]
+[4.041263, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[4.32839, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[4.487997, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[4.624571, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[4.770347, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[4.923547, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
+[5.074671, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[K\r\u001b[33C\u001b[?25h"]
+[5.191086, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[0;4;33m'one,'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone,\u001b[0;m  three  two/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.602913, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[33C\u001b[K\u001b[0;4mthree \r\n\r\n\u001b[0;m\u001b[Kone,  \u001b[0;7mthree\u001b[0;m  two/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.786539, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[34C\u001b[K\u001b[0;4mwo/\r\n\r\n\u001b[6C\u001b[0;m\u001b[Kthree  \u001b[0;7mtwo/\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.007323, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[33C\u001b[Ktwo/\r\n\u001b[J\u001b[A\r\u001b[37C\u001b[?25h"]
+[6.007408, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[37C\u001b[?25h"]
+[6.782796, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[6.908277, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[7.070786, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
+[7.23457, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[K\r\u001b[33C\u001b[?25h"]
+[7.44585, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[0;4;33m'one,'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone,\u001b[0;m  three  two/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[7.708526, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[33C\u001b[K\u001b[0;4mthree \r\n\r\n\u001b[0;m\u001b[Kone,  \u001b[0;7mthree\u001b[0;m  two/\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.080026, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[33C\u001b[Kthree \r\n\u001b[J\u001b[A\r\u001b[39C\u001b[?25h"]
+[8.080426, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[8.081958, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[8.082022, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[9.375628, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[9.376198, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.395194, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.395234, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.629254, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[9.792719, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[9.931545, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[10.022376, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[10.138556, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/prefix.cast b/docs/src/carapace/action/prefix.cast
new file mode 100644
index 0000000..3501ac1
--- /dev/null
+++ b/docs/src/carapace/action/prefix.cast
@@ -0,0 +1,47 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688566269, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.056957, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.057709, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.072111, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.072299, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.496779, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.496896, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.497261, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.509038, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.50919, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.654767, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.740991, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.904113, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.957707, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.074537, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.170095, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.242821, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.358988, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.437099, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h"]
+[1.437567, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.439896, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.440129, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.555507, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[2.104454, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.245374, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h"]
+[2.24588, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.774179, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cp\r\u001b[26C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.88486, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Cr\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[3.130998, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cefix \r\u001b[32C\u001b[?25h"]
+[3.667567, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32Cwater\r\u001b[37C\u001b[?25h"]
+[4.434503, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4mwaterdrop \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mdrop\u001b[0;m  fall  melon\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.272316, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[37C\u001b[K\u001b[0;4mfall \r\n\r\n\u001b[0;m\u001b[Kdrop  \u001b[0;7mfall\u001b[0;m  melon\u001b[1A\r\u001b[22C\u001b[?25h"]
+[7.77969, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[37C\u001b[K\u001b[0;4mmelon \r\n\r\n\u001b[6C\u001b[0;m\u001b[Kfall  \u001b[0;7mmelon\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[9.892044, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[Kwatermelon \r\n\u001b[J\u001b[A\r\u001b[43C\u001b[?25h"]
+[10.498365, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[10.499661, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[10.517766, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[10.51791, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[11.063615, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[11.063696, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[11.227834, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[11.404788, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[11.404864, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[11.490781, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[11.491038, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[11.606204, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h"]
+[11.606283, "o", "\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/prefix.md b/docs/src/carapace/action/prefix.md
new file mode 100644
index 0000000..9e847a5
--- /dev/null
+++ b/docs/src/carapace/action/prefix.md
@@ -0,0 +1,15 @@
+# Prefix
+
+[`Prefix`] adds a prefix to the inserted values.
+
+```go
+carapace.ActionValues(
+	"melon",
+	"drop",
+	"fall",
+).Prefix("water")
+```
+
+![](./prefix.cast)
+
+[`Prefix`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Prefix
diff --git a/docs/src/carapace/action/style.cast b/docs/src/carapace/action/style.cast
new file mode 100644
index 0000000..a4e8e25
--- /dev/null
+++ b/docs/src/carapace/action/style.cast
@@ -0,0 +1,49 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688566569, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.067624, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.067985, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.081234, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.081386, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.274941, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.275227, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.275404, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.291009, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.29119, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.291265, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.449396, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.536562, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.671021, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.704805, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[0.816268, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[0.942071, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[0.94307, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[0.943468, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[0.945393, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[0.945562, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.019357, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.263134, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h"]
+[1.263231, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.336145, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.466732, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[1.845396, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[1.845476, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[1.968292, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.175918, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cs\r\u001b[26C\u001b[?25h"]
+[2.176019, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.314042, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Ct\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[2.492222, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cyle \r\u001b[31C\u001b[?25h"]
+[2.91633, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31C\u001b[0;4mone \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;32mone\u001b[0;m  \u001b[0;32mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.159711, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[31C\u001b[K\u001b[0;4mtwo \r\n\r\n\u001b[0;m\u001b[K\u001b[0;32mone\u001b[0;m  \u001b[0;7;32mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.091758, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[6C\u001b[K\r\n\u001b[J\u001b[A\r\u001b[6C\u001b[?25h"]
+[5.092107, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[5.093134, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[5.115236, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[5.115427, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[5.447008, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[5.447442, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[5.63229, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[5.632374, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[5.787308, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[5.787393, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[5.908287, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[5.908484, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[6.029938, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/style.md b/docs/src/carapace/action/style.md
index 6594bbe..fe86f31 100644
--- a/docs/src/carapace/action/style.md
+++ b/docs/src/carapace/action/style.md
@@ -4,10 +4,11 @@
 
 ```go
 carapace.ActionValues(
-  "first",
-  "second",
+    "one",
+    "two",
 ).Style(style.Green)
 ```
 
+![](./style.cast)
 
 [`Style`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Style
diff --git a/docs/src/carapace/action/styleF.cast b/docs/src/carapace/action/styleF.cast
new file mode 100644
index 0000000..9799fd5
--- /dev/null
+++ b/docs/src/carapace/action/styleF.cast
@@ -0,0 +1,46 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688567624, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.07284, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.073401, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.073492, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.087968, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.08801, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.457237, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.458107, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.469586, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.469617, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.653849, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.755604, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.884642, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.9339, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.087079, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.203509, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.279814, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.425669, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.522322, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.662102, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[1.662351, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[23C\u001b[?25h"]
+[1.662998, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[23C\u001b[?25h"]
+[2.123535, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.559065, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.714947, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cs\r\u001b[26C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.883943, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Ct\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[3.023543, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cyle\r\u001b[30C\u001b[?25h"]
+[3.426169, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--style \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--style\u001b[0;2;7m (Style())\u001b[0;m  \u001b[0;34m--stylef\u001b[0;2m (StyleF())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[3.864822, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4mf \r\n\r\n\u001b[0;m\u001b[K\u001b[0;34m--style\u001b[0;2m (Style())\u001b[0;m  \u001b[0;7;34m--stylef\u001b[0;2;7m (StyleF())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.184406, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--stylef \r\n\u001b[J\u001b[A\r\u001b[32C\u001b[?25h"]
+[4.184535, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[4.486286, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[0;4mone \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;32mone\u001b[0;m  three  \u001b[0;31mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.778072, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4mthree \r\n\r\n\u001b[0;m\u001b[K\u001b[0;32mone\u001b[0;m  \u001b[0;7mthree\u001b[0;m  \u001b[0;31mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.666672, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[33C\u001b[K\u001b[0;4mwo \r\n\r\n\u001b[5C\u001b[0;m\u001b[Kthree  \u001b[0;7;31mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[9.109284, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[6C\u001b[K\r\n\u001b[J\u001b[A\r\u001b[6C\u001b[?25h"]
+[9.109668, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.110831, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.130743, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.13086, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.389143, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[9.581281, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[9.581544, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[9.703787, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[9.810539, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[9.810635, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[9.907008, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/styleF.md b/docs/src/carapace/action/styleF.md
new file mode 100644
index 0000000..909a515
--- /dev/null
+++ b/docs/src/carapace/action/styleF.md
@@ -0,0 +1,24 @@
+# StyleF
+
+[`StyleF`] sets the [style](https://pkg.go.dev/github.com/rsteube/carapace/pkg/style) for all values using a function.
+
+```go
+carapace.ActionValues(
+	"one",
+	"two",
+	"three",
+).StyleF(func(s string, sc style.Context) string {
+	switch s {
+	case "one":
+		return style.Green
+	case "two":
+		return style.Red
+	default:
+		return style.Default
+	}
+})
+```
+
+![](./styleF.cast)
+
+[`StyleF`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.StyleF
diff --git a/docs/src/carapace/action/styleR.cast b/docs/src/carapace/action/styleR.cast
new file mode 100644
index 0000000..ca5aeb2
--- /dev/null
+++ b/docs/src/carapace/action/styleR.cast
@@ -0,0 +1,55 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688568315, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.0739, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.074503, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.084959, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.085111, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.303546, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.303906, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.318299, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.318442, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.478426, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.646918, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.838965, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.919626, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.097416, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h"]
+[1.097964, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.099046, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.101372, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.136831, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.252254, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.400124, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14C\u001b[0;4maction \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34maction\u001b[0;2;7m (action example)                                                \r\n\u001b[0;34malias\u001b[0;2m (action example)                                                 \r\n\u001b[0;mcompletion\u001b[0;2m (Generate the autocompletion script for the specified shell)\r\n\u001b[0;34mflag\u001b[0;2m (flag example)                                                    \r\n\u001b[0;mhelp\u001b[0;2m (Help about any command)                                          \r\n\u001b[0;35minjection\u001b[0;2m (just trying to break things)                                \r\n\u001b[0;33mmodifier\u001b[0;2m (modifier example)                                            \r\n\u001b[0;mmultiparts\u001b[0;2m (multiparts example)                                        \r\n\u001b[0;mspecial                                                                \u001b[9A\r\u001b[22C\u001b[?25h"]
+[1.815425, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[22Cm\r\n\r\n\r\n\r\n\r\n\r\n\u001b[K\u001b[0;33mmodifier\u001b[0;2m (modifier example)                                            \r\n\u001b[0;m\u001b[Kmultiparts\u001b[0;2m (multiparts example)                                        \u001b[0;m\r\n\u001b[J\u001b[A\u001b[7A\r\u001b[23C\u001b[?25h"]
+[1.815956, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[7A\r\u001b[23C\u001b[?25h"]
+[1.872539, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[14C\u001b[K\u001b[0;4mmodifier \r\n\u001b[23C\u001b[0;mo\r\n\u001b[K\u001b[0;7;33mmodifier\u001b[0;2;7m (modifier example)\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[24C\u001b[?25h"]
+[1.872687, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[1.929431, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[24Cd\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[1.929905, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[2.322485, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[14C\u001b[Kmodifier \r\n\u001b[J\u001b[A\r\u001b[23C\u001b[?25h"]
+[2.667186, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.667288, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[2.819269, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h"]
+[3.008954, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cs\r\u001b[26C\u001b[?25h"]
+[3.009048, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[3.164895, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Ct\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[3.281319, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Cy\r\u001b[28C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[28C\u001b[?25h"]
+[3.414032, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[28Cle\r\u001b[30C\u001b[?25h"]
+[3.691517, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--style \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--style\u001b[0;2;7m (Style())\u001b[0;m  \u001b[0;34m--stylef\u001b[0;2m (StyleF())\u001b[0;m  \u001b[0;34m--styler\u001b[0;2m (StyleR())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.410754, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4mf \r\n\r\n\u001b[0;m\u001b[K\u001b[0;34m--style\u001b[0;2m (Style())\u001b[0;m  \u001b[0;7;34m--stylef\u001b[0;2;7m (StyleF())\u001b[0;m  \u001b[0;34m--styler\u001b[0;2m (StyleR())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.742745, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[30C\u001b[K\u001b[0;4mr \r\n\r\n\u001b[19C\u001b[0;m\u001b[K\u001b[0;34m--stylef\u001b[0;2m (StyleF())\u001b[0;m  \u001b[0;7;34m--styler\u001b[0;2;7m (StyleR())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.744435, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[4.744847, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.101116, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--styler \r\n\u001b[J\u001b[A\r\u001b[32C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[5.438548, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[0;4mone \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;33mone\u001b[0;m  \u001b[0;33mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.768209, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4mtwo \r\n\r\n\u001b[0;m\u001b[K\u001b[0;33mone\u001b[0;m  \u001b[0;7;33mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.099875, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[6C\u001b[K\r\n\u001b[J\u001b[A\r\u001b[6C\u001b[?25h"]
+[8.099968, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.100414, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.122806, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.122857, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.443546, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[8.444019, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[8.639347, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[8.815239, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[8.815337, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[8.919505, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[9.043508, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/styleR.md b/docs/src/carapace/action/styleR.md
new file mode 100644
index 0000000..5bf9d1e
--- /dev/null
+++ b/docs/src/carapace/action/styleR.md
@@ -0,0 +1,19 @@
+# StyleR
+
+[`StyleR`] sets the [style](https://pkg.go.dev/github.com/rsteube/carapace/pkg/style) for all values using a reference.
+
+```go
+carapace.ActionValues(
+	"one",
+	"two",
+).StyleR(&style.Carapace.KeywordAmbiguous)
+```
+
+![](./styleR.cast)
+
+> Using a reference avoids having to wrap the [Action] in an [ActionCallback] as style configurations are not yet loaded
+> when registering the completion.
+
+[Action]:../action.md
+[ActionCallback]:../defaultActions/actionCallback.md
+[`StyleR`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.StyleR
diff --git a/docs/src/carapace/action/suffix.cast b/docs/src/carapace/action/suffix.cast
new file mode 100644
index 0000000..2c38ad6
--- /dev/null
+++ b/docs/src/carapace/action/suffix.cast
@@ -0,0 +1,47 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688569042, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.071707, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.072272, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.086372, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.086503, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.270503, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.270651, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.271867, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.28522, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.463125, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[0.463579, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.58188, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[0.672904, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[0.773536, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[0.908147, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[0.980896, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.06745, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h"]
+[1.182476, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.266042, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.379744, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[1.713223, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[1.713324, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[1.871988, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h"]
+[2.526725, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--batch \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--batch\u001b[0;2;7m (Batch())                                 \u001b[0;m  \u001b[0;34m--persistentFlag2\u001b[0;2m (Help message for persistentFlag2)\r\n\u001b[0;34m--cache\u001b[0;2m (Cache())                                 \u001b[0;m  \u001b[0;34m--prefix\u001b[0;2m (Prefix())                                 \r\n\u001b[0;34m--cache-key\u001b[0;2m (Cache())                             \u001b[0;m  \u001b[0;34m--style\u001b[0;2m (Style())                                   \r\n\u001b[0;34m--chdir\u001b[0;2m (Chdir())                                 \u001b[0;m  \u001b[0;34m--stylef\u001b[0;2m (StyleF())                                 \r\n\u001b[0;m--help\u001b[0;2m (help for modifier)                        \u001b[0;m  \u001b[0;34m--styler\u001b[0;2m (StyleR())                                 \r\n\u001b[0;34m--list\u001b[0;2m (List())                                   \u001b[0;m  \u001b[0;34m--suffix\u001b[0;2m (Suffix())                                 \r\n\u001b[0;34m--multiparts\u001b[0;2m (MultiPartsA())                      \u001b[0;m  \u001b[0;34m--timeout\u001b[0;2m (Timeout())                "]
+[2.526809, "o", "               \r\n\u001b[0;34m--nospace\u001b[0;2m (NoSpace())                             \u001b[0;m  \u001b[0;34m--uniquelist\u001b[0;2m (UniqueList())                         \r\n\u001b[0;33m--persistentFlag\u001b[0;2m (Help message for persistentFlag)\u001b[0;m  \u001b[0;34m--usage\u001b[0;2m (Usage())                                   \u001b[0;m\u001b[9A\r\u001b[22C\u001b[?25h"]
+[2.792159, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[25C\u001b[K\u001b[0;4mlist \r\n\u001b[22C\u001b[0;ms\r\n\u001b[2C\u001b[K\u001b[0;7;34mlist\u001b[0;2;7m (List())                                     \u001b[0;m  \u001b[0;34m--stylef\u001b[0;2m (StyleF())        \r\n\u001b[2C\u001b[0;m\u001b[K\u001b[0;34mmultiparts\u001b[0;2m (MultiPartsA())                        \u001b[0;m  \u001b[0;34m--styler\u001b[0;2m (StyleR())        \r\n\u001b[2C\u001b[0;m\u001b[K\u001b[0;34mnospace\u001b[0;2m (NoSpace())                               \u001b[0;m  \u001b[0;34m--suffix\u001b[0;2m (Suffix())        \r\n\u001b[0;m\u001b[K\u001b[0;33m--persistentFlag\u001b[0;2m (Help message for persistentFlag)  \u001b[0;m  \u001b[0;34m--uniquelist\u001b[0;2m (UniqueList())\r\n\u001b[0;m\u001b[K\u001b[0;34m--persistentFlag2\u001b[0;2m (Help message for persistentFlag2)\u001b[0;m  \u001b[0;34m--usage\u001b[0;2m (Usage())          \r\n\u001b[2C\u001b[0;m\u001b[K\u001b[0;34mstyle\u001b[0;2m (Style())                                   \u001b[0;m\r\n\u001b[J\u001b[A\u001b[6A\r\u001b[23C\u001b[?25h"]
+[2.792803, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[6A\r\u001b[23C\u001b[?25h"]
+[2.912457, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[25C\u001b[K\u001b[0;4msuffix \r\n\u001b[23C\u001b[0;mu\r\n\u001b[2C\u001b[K\u001b[0;7;34msuffix\u001b[0;2;7m (Suffix())\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[24C\u001b[?25h\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[3.036022, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[24Cf\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[3.036135, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[3.498155, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--suffix \r\n\u001b[J\u001b[A\r\u001b[32C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[3.776507, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[0;4mapplejuice \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mapple\u001b[0;m  melon  orange\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.020668, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4mmelonjuice \r\n\r\n\u001b[0;m\u001b[Kapple  \u001b[0;7mmelon\u001b[0;m  orange\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.096517, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[K\u001b[0;4morangejuice \r\n\r\n\u001b[7C\u001b[0;m\u001b[Kmelon  \u001b[0;7morange\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[8.119286, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[32C\u001b[Korangejuice \r\n\u001b[J\u001b[A\r\u001b[44C\u001b[?25h"]
+[8.119382, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[44C\u001b[?25h"]
+[8.888762, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.88977, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.91122, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[8.911353, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.362776, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[9.546376, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[9.546479, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[9.696261, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[9.770843, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[9.770935, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[9.884736, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/suffix.md b/docs/src/carapace/action/suffix.md
new file mode 100644
index 0000000..1ca7ef5
--- /dev/null
+++ b/docs/src/carapace/action/suffix.md
@@ -0,0 +1,15 @@
+# Suffix
+
+[`Suffix`] adds a suffix to the inserted values.
+
+```go
+carapace.ActionValues(
+	"apple",
+	"melon",
+	"orange",
+).Suffix("juice")
+```
+
+![](./suffix.cast)
+
+[`Suffix`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Suffix
diff --git a/docs/src/carapace/action/suppress.cast b/docs/src/carapace/action/suppress.cast
new file mode 100644
index 0000000..655d5b7
--- /dev/null
+++ b/docs/src/carapace/action/suppress.cast
@@ -0,0 +1,47 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688570318, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.065305, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.06593, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.078414, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.078487, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.440737, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.441216, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.44136, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.452502, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.628448, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[0.628544, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.76942, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.88823, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[1.014391, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.172585, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.245126, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.343604, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h"]
+[1.344332, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.344388, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.345381, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.345428, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.536967, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14Cm\r\u001b[15C\u001b[?25h"]
+[1.537076, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[15C\u001b[?25h"]
+[1.604634, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[15Co\r\u001b[16C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[16C\u001b[?25h"]
+[1.686987, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cd\r\u001b[17C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[17C\u001b[?25h"]
+[1.90328, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[17Cifier \r\u001b[23C\u001b[?25h"]
+[2.278029, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.278136, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[2.429779, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.60006, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Cs\r\u001b[26C\u001b[?25h"]
+[2.600164, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.78907, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26Cu\r\u001b[27C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[2.901481, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--suffix \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--suffix\u001b[0;2;7m (Suffix())\u001b[0;m  \u001b[0;34m--suppress\u001b[0;2m (Suppress())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[3.448095, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[27C\u001b[K\u001b[0;4mppress \r\n\r\n\u001b[0;m\u001b[K\u001b[0;34m--suffix\u001b[0;2m (Suffix())\u001b[0;m  \u001b[0;7;34m--suppress\u001b[0;2;7m (Suppress())\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[3.627368, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--suppress \r\n\u001b[J\u001b[A\r\u001b[34C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[34C\u001b[?25h"]
+[4.030007, "o", "\u001b[?25l\u001b[2A\r\u001b[0;31merror: \u001b[0;munexpected error\u001b[K\r\n\u001b[0;2musage: \u001b[0;mSuppress()\u001b[K\r\n\u001b[0;31merror:\u001b[0;m no candidates\u001b[K\r\n\u001b[K\r\n\u001b[K\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m modifier --suppress \r\u001b[34C\u001b[?25h"]
+[4.030182, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[34C\u001b[?25h"]
+[6.741504, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[6.742594, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[6.757955, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[6.758158, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[7.03574, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[7.212905, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[7.332155, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[7.332262, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[7.432818, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[7.561058, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/suppress.md b/docs/src/carapace/action/suppress.md
index a275047..cd3e2cd 100644
--- a/docs/src/carapace/action/suppress.md
+++ b/docs/src/carapace/action/suppress.md
@@ -4,11 +4,11 @@
 
 ```go
 carapace.Batch(
-	docker.ActionContainers(),
-	docker.ActionServices().Supress("This node is not a swarm manager"),
-	docker.ActionNetworks(),
-	docker.ActionVolumes(),
-).ToA()
+	carapace.ActionMessage("unexpected error"),
+	carapace.ActionMessage("ignored error"),
+).ToA().Suppress("ignored")
 ```
 
+![](./suppress.cast)
+
 [`Suppress`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Suppress
diff --git a/docs/src/carapace/action/tag.cast b/docs/src/carapace/action/tag.cast
new file mode 100644
index 0000000..9fdab61
--- /dev/null
+++ b/docs/src/carapace/action/tag.cast
@@ -0,0 +1,34 @@
+{"version": 2, "width": 147, "height": 45, "timestamp": 1688572391, "env": {"SHELL": "elvish", "TERM": "foot-extra"}}
+[0.073645, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m                                                                                                                                                  \r \r"]
+[0.083224, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mcarapace\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35mdoc-update\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m]\u001b[0m via \u001b[1;36m🐹 \u001b[0m\u001b[1;36mv1.20.4\u001b[0m\u001b[1;36m \u001b[0m\r\n\u001b[1;37mzsh\u001b[0m \u001b[1;32m❯\u001b[0m \u001b[K\u001b[?2004h"]
+[0.332271, "o", "e"]
+[0.510519, "o", "\bex"]
+[0.646094, "o", "a"]
+[0.715115, "o", "m"]
+[0.82561, "o", "p"]
+[0.971416, "o", "l"]
+[1.049535, "o", "e"]
+[1.122615, "o", " "]
+[1.204238, "o", "m"]
+[1.291872, "o", "o"]
+[1.374639, "o", "d"]
+[1.587562, "o", "ifier "]
+[1.964983, "o", "-"]
+[2.108766, "o", "-"]
+[2.180239, "o", "t"]
+[2.301807, "o", "a"]
+[2.401864, "o", "g"]
+[2.646716, "o", "\u0007\r\r\n\u001b[2;37mCompleting flags\u001b[m\r\n\u001b[0m\u001b[34m--tagf\u001b[0m\u001b[2m  -- TagF()\u001b[0m\r\n\u001b[J\u001b[34m--tag\u001b[0m\u001b[2m   -- Tag()\u001b[0m\u001b[J\u001b[3A\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --tag\u001b[K"]
+[3.233513, "o", "f \r\r\n\u001b[2;37mCompleting flags\u001b[m\u001b[K\u001b[K\r\n\u001b[7m--tagf  -- TagF()\u001b[0m\u001b[K\u001b[K\r\n\u001b[J\u001b[34m--tag\u001b[0m\u001b[2m   -- Tag()\u001b[0m\u001b[K\u001b[J\u001b[3A\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --tagf\u001b[K\u001b[1C"]
+[3.442105, "o", "\r\r\n\u001b[1B\u001b[7m--tagf  -- TagF()\u001b[0m\u001b[K\r\u001b[7m--tagf  -- TagF()\u001b[0m\u001b[K\r\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --tagf\u001b[K\u001b[1C\b\b \r\r\n"]
+[3.442238, "o", "\u001b[1B\u001b[0m\u001b[34m--tagf\u001b[0m\u001b[2m  -- TagF()\u001b[0m\u001b[K\r\u001b[1B\u001b[7m--tag   -- Tag()\u001b[0m\u001b[K\r\u001b[3A\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --tag\u001b[K\u001b[1C"]
+[3.607164, "o", "\r\r\n\u001b[J\u001b[A\u001b[29C"]
+[3.735403, "o", "1"]
+[4.236011, "o", "\u0007\r\r\n\u001b[J\u001b[2mTag()\u001b[m\r\n\u001b[2;37mCompleting interfaces\u001b[m\r\n\u001b[J\u001b[0m\u001b[m127.0.0.1\u001b[0m    \u001b[J\u001b[m192.168.1.1\u001b[0m\u001b[J\u001b[3A\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --tag 1\u001b[K"]
+[7.419, "o", "\u001b[?2004l\r\r\n\u001b[J\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m                                                                                                                                                  \r \r"]
+[7.444901, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mcarapace\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35mdoc-update\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m]\u001b[0m via \u001b[1;36m🐹 \u001b[0m\u001b[1;36mv1.20.4\u001b[0m\u001b[1;36m \u001b[0m\r\n\u001b[1;37mzsh\u001b[0m \u001b[1;31m❯\u001b[0m \u001b[K\u001b[?2004h"]
+[7.664883, "o", "e"]
+[7.845495, "o", "\bex"]
+[7.927002, "o", "i"]
+[8.057374, "o", "t"]
+[8.119642, "o", "\u001b[?2004l\r\r\n"]
diff --git a/docs/src/carapace/action/tag.md b/docs/src/carapace/action/tag.md
index 2cd72a0..a9a1b9f 100644
--- a/docs/src/carapace/action/tag.md
+++ b/docs/src/carapace/action/tag.md
@@ -1,69 +1,14 @@
 # Tag
 
-[`Tag`] sets the `tag` for all values. This enables additional grouping and filtering.
+[`Tag`] sets the tag for all values.
 
 ```go
-ActionValues(
-  "192.168.1.1",
-  "127.0.0.1",
+carapace.ActionValues(
+    "192.168.1.1",
+    "127.0.0.1",
 ).Tag("interfaces")
 ```
 
-## Command Groups
+![](./tag.cast)
 
-[Command Groups] are implicitly used as `tag` for commands.
-
-```go
-func init() {
-	carapace.Gen(rootCmd).Standalone()
-
-	rootCmd.AddGroup(
-		&cobra.Group{ID: "main", Title: "Main Commands"},
-		&cobra.Group{ID: "other", Title: "Other Commands"},
-	)
-	rootCmd.AddCommand(
-		&cobra.Command{Use: "sub1", GroupID: "main", Run: func(cmd *cobra.Command, args []string) {}},
-		&cobra.Command{Use: "sub2", GroupID: "main", Run: func(cmd *cobra.Command, args []string) {}},
-		&cobra.Command{Use: "sub3", GroupID: "other", Run: func(cmd *cobra.Command, args []string) {}},
-		&cobra.Command{Use: "sub4", GroupID: "other", Run: func(cmd *cobra.Command, args []string) {}},
-		&cobra.Command{Use: "sub5", Run: func(cmd *cobra.Command, args []string) {}},
-	)
-}
-```
-
-```json
-{
-  "Version": "v0.26.5",
-  "Nospace": "",
-  "RawValues": [
-    {
-      "Value": "sub1",
-      "Display": "sub1",
-      "Tag": "main commands"
-    },
-    {
-      "Value": "sub2",
-      "Display": "sub2",
-      "Tag": "main commands"
-    },
-    {
-      "Value": "sub3",
-      "Display": "sub3",
-      "Tag": "other commands"
-    },
-    {
-      "Value": "sub4",
-      "Display": "sub4",
-      "Tag": "other commands"
-    },
-    {
-      "Value": "sub5",
-      "Display": "sub5",
-      "Tag": "additional commands"
-    }
-  ]
-}
-```
-
-[Command Groups]:https://github.com/spf13/cobra/blob/main/user_guide.md#grouping-commands-in-help
 [`Tag`]:https://pkg.go.dev/github.com/rsteube/carapace#Action.Tag
diff --git a/docs/src/carapace/action/tagF.cast b/docs/src/carapace/action/tagF.cast
new file mode 100644
index 0000000..d0eae1d
--- /dev/null
+++ b/docs/src/carapace/action/tagF.cast
@@ -0,0 +1,27 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688572090, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.081932, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m                                                                                                           \r \r"]
+[0.096056, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mcarapace\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35mdoc-update\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m?\u001b[0m\u001b[1;31m]\u001b[0m via \u001b[1;36m🐹 \u001b[0m\u001b[1;36mv1.20.4\u001b[0m\u001b[1;36m \u001b[0m\r\n\u001b[1;37mzsh\u001b[0m \u001b[1;32m❯\u001b[0m \u001b[K\u001b[?2004h"]
+[0.540074, "o", "e"]
+[1.117892, "o", "\bex"]
+[1.308807, "o", "a"]
+[1.485092, "o", "m"]
+[1.581718, "o", "p"]
+[1.748724, "o", "l"]
+[1.82398, "o", "e"]
+[1.89349, "o", " "]
+[2.003733, "o", "m"]
+[2.091327, "o", "o"]
+[2.194113, "o", "difier "]
+[2.509262, "o", "-"]
+[2.66427, "o", "-"]
+[2.818519, "o", "t"]
+[2.92466, "o", "a"]
+[3.119672, "o", "gf "]
+[3.596726, "o", "\u0007\r\r\n\u001b[2mTagF()\u001b[m\r\n\u001b[2;37mCompleting documents\u001b[m\r\n\u001b[0m\u001b[38;2;255;184;108mfour.md\u001b[0m    \u001b[38;2;255;184;108mthree.txt\u001b[0m\r\n\u001b[2;37mCompleting images\u001b[m\r\n\u001b[J\u001b[0m\u001b[38;2;255;121;198mone.png\u001b[0m    \u001b[J\u001b[38;2;255;121;198mtwo.gif\u001b[0m  \u001b[J\u001b[5A\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --tagf\u001b[K\u001b[1C"]
+[8.920709, "o", "\u001b[?2004l\r\r\n\u001b[J\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m                                                                                                           \r \r"]
+[8.941661, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mcarapace\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35mdoc-update\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m?\u001b[0m\u001b[1;31m]\u001b[0m via \u001b[1;36m🐹 \u001b[0m\u001b[1;36mv1.20.4\u001b[0m\u001b[1;36m \u001b[0m\r\n\u001b[1;37mzsh\u001b[0m \u001b[1;31m❯\u001b[0m \u001b[K\u001b[?2004h"]
+[9.305029, "o", "e"]
+[9.499425, "o", "\bex"]
+[9.632019, "o", "i"]
+[9.723111, "o", "t"]
+[9.831621, "o", "\u001b[?2004l\r\r\n"]
diff --git a/docs/src/carapace/action/tagF.md b/docs/src/carapace/action/tagF.md
new file mode 100644
index 0000000..3e15e46
--- /dev/null
+++ b/docs/src/carapace/action/tagF.md
@@ -0,0 +1,25 @@
+# TagF
+
+[`TagF`] sets the tag using a function.
+
+```go
+carapace.ActionValues(
+	"one.png",
+	"two.gif",
+	"three.txt",
+	"four.md",
+).StyleF(style.ForPathExt).TagF(func(s string) string {
+	switch filepath.Ext(s) {
+	case ".png", ".gif":
+		return "images"
+	case ".txt", ".md":
+		return "documents"
+	default:
+		return ""
+	}
+})
+```
+
+![](./tagF.cast)
+
+[`TagF`]:https://pkg.go.dev/github.com/rsteube/carapace#Action.TagF
diff --git a/docs/src/carapace/action/uniqueList.md b/docs/src/carapace/action/uniqueList.md
new file mode 100644
index 0000000..c517287
--- /dev/null
+++ b/docs/src/carapace/action/uniqueList.md
@@ -0,0 +1,15 @@
+# UniqueList
+
+[`UniqueList`] creates a unique list with given divider.
+
+```go
+carapace.ActionValues(
+    "one",
+    "two",
+    "three"
+).UniqueList(",")
+```
+
+![](./uniquelist.cast)
+
+[`UniqueList`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.List
diff --git a/docs/src/carapace/action/uniquelist.cast b/docs/src/carapace/action/uniquelist.cast
new file mode 100644
index 0000000..cb6cb19
--- /dev/null
+++ b/docs/src/carapace/action/uniquelist.cast
@@ -0,0 +1,70 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688557293, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.064594, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.065052, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h"]
+[0.065286, "o", "\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.077782, "o", "\u001b[?25l\r\r\u001b[5C\u001b[?25h\u001b[?25l\r\r\u001b[5C\u001b[?25h"]
+[0.077834, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h"]
+[0.387894, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.389216, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.405244, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.405483, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.568608, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[0.7054, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexa\u001b[0;m\r\u001b[9C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[0.997447, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;31mexam\u001b[0;m\r\u001b[10C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[1.035648, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h"]
+[1.035726, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.192923, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.274108, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexample\u001b[0;m\r\u001b[13C\u001b[?25h"]
+[1.27424, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.343782, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[13C \r\u001b[14C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[14C\u001b[?25h"]
+[1.67923, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[14C\u001b[0;4maction \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34maction\u001b[0;2;7m (action example)                                                \r\n\u001b[0;34malias\u001b[0;2m (action example)                                                 \r\n\u001b[0;mcompletion\u001b[0;2m (Generate the autocompletion script for the specified shell)\r\n\u001b[0;34mflag\u001b[0;2m (flag example)                                                    \r\n\u001b[0;mhelp\u001b[0;2m (Help about any command)                                          \r\n\u001b[0;35minjection\u001b[0;2m (just trying to break things)                                \r\n\u001b[0;33mmodifier\u001b[0;2m (modifier example)                                            \r\n\u001b[0;mmultiparts\u001b[0;2m (multiparts example)                                        \r\n\u001b[0;mspecial                                                                \u001b[9A\r\u001b[22C\u001b[?25h"]
+[2.034392, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[22Cm\r\n\r\n\r\n\r\n\r\n\r\n\u001b[K\u001b[0;33mmodifier\u001b[0;2m (modifier example)                                            \r\n\u001b[0;m\u001b[Kmultiparts\u001b[0;2m (multiparts example)                                        \u001b[0;m\r\n\u001b[J\u001b[A\u001b[7A\r\u001b[23C\u001b[?25h"]
+[2.035074, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u001b[7A\r\u001b[23C\u001b[?25h"]
+[2.091674, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[14C\u001b[K\u001b[0;4mmodifier \r\n\u001b[23C\u001b[0;mo\r\n\u001b[K\u001b[0;7;33mmodifier\u001b[0;2;7m (modifier example)\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[24C\u001b[?25h"]
+[2.091808, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[2.193044, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[24Cd\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[2.19315, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[2.695778, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[14C\u001b[Kmodifier \r\n\u001b[J\u001b[A\r\u001b[23C\u001b[?25h"]
+[2.69588, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[23C\u001b[?25h"]
+[2.696255, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[23C\u001b[?25h"]
+[2.873317, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C-\r\u001b[24C\u001b[?25h"]
+[2.873416, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[24C\u001b[?25h"]
+[3.066319, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24C-\r\u001b[25C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[3.225089, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23C\u001b[K\u001b[0;4m--batch \r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7;34m--batch\u001b[0;2;7m (Batch())         \u001b[0;m  \u001b[0;33m--persistentFlag\u001b[0;2m (Help message for persistentFlag)  \r\n\u001b[0;34m--cache\u001b[0;2m (Cache())         \u001b[0;m  \u001b[0;34m--persistentFlag2\u001b[0;2m (Help message for persistentFlag2)\r\n\u001b[0;34m--cache-key\u001b[0;2m (Cache())     \u001b[0;m  \u001b[0;34m--timeout\u001b[0;2m (Timeout())                               \r\n\u001b[0;34m--chdir\u001b[0;2m (Chdir())         \u001b[0;m  \u001b[0;34m--tomultiparts\u001b[0;2m (ToMultiPartsA())                    \r\n\u001b[0;m--help\u001b[0;2m (help for modifier)\u001b[0;m  \u001b[0;34m--uniquelist\u001b[0;2m (UniqueList())                         \r\n\u001b[0;34m--list\u001b[0;2m (List())           \u001b[0;m  \u001b[0;34m--usage\u001b[0;2m (Usage())                                   \u001b[0;m\u001b[6A\r\u001b[22C\u001b[?25h"]
+[3.611023, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[25C\u001b[K\u001b[0;4mtimeout \r\n\u001b[22C\u001b[0;mu\r\n\u001b[2C\u001b[K\u001b[0;7;34mtimeout\u001b[0;2;7m (Timeout())           \u001b[0;m  \u001b[0;34m--uniquelist\u001b[0;2m (UniqueList())\r\n\u001b[2C\u001b[0;m\u001b[K\u001b[0;34mtomultiparts\u001b[0;2m (ToMultiPartsA())\u001b[0;m  \u001b[0;34m--usage\u001b[0;2m (Usage())          \u001b[0;m\r\n\u001b[J\u001b[A\u001b[2A\r\u001b[23C\u001b[?25h"]
+[3.611455, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\r\n\u001b[2A\r\u001b[23C\u001b[?25h"]
+[3.807046, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[25C\u001b[K\u001b[0;4muniquelist \r\n\u001b[23C\u001b[0;mn\r\n\u001b[2C\u001b[K\u001b[0;7;34muniquelist\u001b[0;2;7m (UniqueList())\u001b[0;m\r\n\u001b[J\u001b[A\u001b[1A\r\u001b[24C\u001b[?25h"]
+[3.807554, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[24C\u001b[?25h"]
+[3.879991, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\u001b[24Ci\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[3.880384, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\r\n\r\n\u001b[1A\r\u001b[25C\u001b[?25h"]
+[4.299951, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[23C\u001b[K--uniquelist \r\n\u001b[J\u001b[A\r\u001b[36C\u001b[?25h"]
+[4.300311, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[4.681843, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[0;4mone\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mone\u001b[0;m  three  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[5.253847, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[Kone\r\n\u001b[J\u001b[A\r\u001b[39C\u001b[?25h"]
+[5.253941, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[5.542689, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[39C,\r\u001b[40C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[40C\u001b[?25h"]
+[5.73467, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;4;33m'one,three'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mthree\u001b[0;m  two\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.222786, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[42C\u001b[K\u001b[0;4;33mwo'\r\n\r\n\u001b[0;m\u001b[Kthree  \u001b[0;7mtwo\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[6.605342, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;33m'one,two'\u001b[0;m\r\n\u001b[J\u001b[A\r\u001b[45C\u001b[?25h"]
+[6.605445, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[45C\u001b[?25h"]
+[6.864578, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[45C,\r\u001b[46C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[46C\u001b[?25h"]
+[7.003667, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;4;33m'one,two,three'\r\n\u001b[0;1;37;45m COMPLETING argument \u001b[0;m \r\n\u001b[0;7mthree\u001b[0;m\u001b[1A\r\u001b[22C\u001b[?25h"]
+[7.883939, "o", "\u001b[?25l\u001b[3A\r\r\n\r\n\u001b[36C\u001b[K\u001b[0;33m'one,two,three'\u001b[0;m\r\n\u001b[J\u001b[A\r\u001b[51C\u001b[?25h"]
+[7.884044, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[51C\u001b[?25h"]
+[8.365962, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[51C,\r\u001b[52C\u001b[?25h"]
+[8.366313, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[52C\u001b[?25h"]
+[8.543873, "o", "\u001b[?25l\u001b[2A\r\u001b[0;2musage: \u001b[0;mUniqueList()\u001b[K\r\n\u001b[0;31merror:\u001b[0;m no candidates\u001b[K\r\n\u001b[K\r\n\u001b[K\u001b[0;1;36mcarapace\u001b[0;m on \u001b[0;1;35m doc-update\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.4 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m modifier --uniquelist \u001b[0;33m'one,two,three'\u001b[0;m,\r\u001b[52C\u001b[?25h"]
+[8.544115, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[52C\u001b[?25h"]
+[9.542003, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[9.542105, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.542686, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.560405, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.560539, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[9.87675, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[10.062684, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[10.062782, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[8C\u001b[?25h"]
+[10.226306, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[10.226414, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[10.297202, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\u001b[0;32mexit\u001b[0;m\r\u001b[10C\u001b[?25h"]
+[10.297599, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[10C\u001b[?25h"]
+[10.536788, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/usage.cast b/docs/src/carapace/action/usage.cast
new file mode 100644
index 0000000..2c0e374
--- /dev/null
+++ b/docs/src/carapace/action/usage.cast
@@ -0,0 +1,48 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1688570725, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.077639, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m                                                                                                           \r \r"]
+[0.0935, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mcarapace\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35mdoc-update\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m?\u001b[0m\u001b[1;31m]\u001b[0m via \u001b[1;36m🐹 \u001b[0m\u001b[1;36mv1.20.4\u001b[0m\u001b[1;36m \u001b[0m\r\n\u001b[1;37mzsh\u001b[0m \u001b[1;32m❯\u001b[0m \u001b[K\u001b[?2004h"]
+[1.10568, "o", "e"]
+[1.259408, "o", "\bex"]
+[1.436954, "o", "a"]
+[1.528555, "o", "m"]
+[1.775181, "o", "p"]
+[2.018019, "o", "l"]
+[2.137242, "o", "e"]
+[2.248635, "o", " "]
+[2.447993, "o", "m"]
+[2.534367, "o", "o"]
+[2.632755, "o", "d"]
+[2.842902, "o", "ifier "]
+[3.167879, "o", "-"]
+[3.33015, "o", "-"]
+[3.864969, "o", "u"]
+[3.926364, "o", "s"]
+[4.156021, "o", "age "]
+[4.60786, "o", "\u0007\r\r\n\u001b[2mUsage()\u001b[m\r\n\u001b[J\u001b[0m\u001b[mexplicit\u001b[0m  \u001b[J\u001b[mimplicit\u001b[0m\u001b[J\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage\u001b[K\u001b[1C"]
+[5.059838, "o", "explicit:\r\r\n\u001b[2mUsage()\u001b[m\u001b[K\u001b[K\r\n\u001b[J\u001b[7mexplicit\u001b[0m  \u001b[J\u001b[mimplicit\u001b[0m\u001b[J\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage explicit:\u001b[K"]
+[5.50293, "o", "\r\r\n\u001b[1B\u001b[7mexplicit\u001b[0m  \r\u001b[7mexplicit\u001b[0m  \r\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage explicit:\u001b[K\u001b[9Dim\u001b[7C"]
+[5.503272, "o", "\r\r\n\u001b[1B\u001b[10C\u001b[7mimplicit\u001b[0m\r\u001b[mexplicit\u001b[0m  \r\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage implicit:\u001b[K"]
+[5.856037, "o", "\r\r\n\u001b[J\u001bM\u001b[40C"]
+[6.080966, "o", "\u0007\r\r\n\u001b[J\u001b[J\u001b[2mUsage()\u001b[m\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage implicit:\u001b[K"]
+[6.59112, "o", "\b \b"]
+[6.753252, "o", "\b \b"]
+[7.353479, "o", "\b \b"]
+[7.393543, "o", "\b \b"]
+[7.433772, "o", "\b \b"]
+[7.473486, "o", "\b \b"]
+[7.513593, "o", "\b \b"]
+[7.623915, "o", "\b \b"]
+[7.804521, "o", "\b \b"]
+[8.052794, "o", "\u0007\r\r\n\u001b[J\u001b[2mUsage()\u001b[m\r\n\u001b[J\u001b[0m\u001b[mexplicit\u001b[0m  \u001b[J\u001b[mimplicit\u001b[0m\u001b[J\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage\u001b[K\u001b[1C"]
+[8.696808, "o", "explicit:\r\r\n\u001b[2mUsage()\u001b[m\u001b[K\u001b[K\r\n\u001b[J\u001b[7mexplicit\u001b[0m  \u001b[J\u001b[mimplicit\u001b[0m\u001b[J\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage explicit:\u001b[K"]
+[8.927694, "o", "\r\r\n\u001b[1B\u001b[7mexplicit\u001b[0m  \r\u001b[7mexplicit\u001b[0m  \r\u001bM\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6Cexample modifier --usage explicit:\u001b[K\r\r\n\u001b[J\u001bM\u001b[40C"]
+[9.33537, "o", "\u0007\r\r\n\u001b[J\u001b[J\u001b[2mexplicit usage\u001b[m\u001bM\u001b[0m\u001b[27m\u001b[24m\r\u001b[6C"]
+[9.335425, "o", "example modifier --usage explicit:\u001b[K"]
+[11.986459, "o", "\u001b[?2004l\r\r\n\u001b[J"]
+[11.986557, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m                                                                                                           \r \r"]
+[12.013627, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\r\n\u001b[1;36mcarapace\u001b[0m on \u001b[1;35m \u001b[0m\u001b[1;35mdoc-update\u001b[0m \u001b[1;31m[\u001b[0m\u001b[1;31m$\u001b[0m\u001b[1;31m!\u001b[0m\u001b[1;31m?\u001b[0m\u001b[1;31m]\u001b[0m via \u001b[1;36m🐹 \u001b[0m\u001b[1;36mv1.20.4\u001b[0m\u001b[1;36m \u001b[0m\r\n\u001b[1;37mzsh\u001b[0m \u001b[1;31m❯\u001b[0m \u001b[K\u001b[?2004h"]
+[12.473597, "o", "e"]
+[12.642813, "o", "\bex"]
+[12.79662, "o", "i"]
+[12.87228, "o", "t"]
+[13.000643, "o", "\u001b[?2004l\r\r\n"]
diff --git a/docs/src/carapace/action/usage.md b/docs/src/carapace/action/usage.md
index 8a318cd..007e88f 100644
--- a/docs/src/carapace/action/usage.md
+++ b/docs/src/carapace/action/usage.md
@@ -2,20 +2,25 @@
 
 [`Usage`] sets the `usage` message.
 
-> `usage` is implicitly set by default with [`Flag.Usage`] for flag and [`Command.Use`] for positional arguments.
-
 ```go
-carapace.ActionValues().Usage("explicit usage")
+carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action {
+	switch len(c.Parts) {
+	case 0:
+		return carapace.ActionValues("explicit", "implicit").Suffix(":")
+	case 1:
+		if c.Parts[0] == "explicit" {
+			return carapace.ActionValues().Usage("explicit usage")
+		}
+		return carapace.ActionValues()
+
+	default:
+		return carapace.ActionValues()
+	}
+})
 ````
+![](./usage.cast)
 
-```json
-{
-  "Version": "unknown",
-  "Usage": "explicit usage",
-  "Nospace": "",
-  "RawValues": []
-}
-```
+> It is implicitly set by default to [`Flag.Usage`] for flag and [`Command.Use`] for positional arguments.
 
 [`Usage`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Usage
 [`Command.Use`]:https://pkg.go.dev/github.com/spf13/cobra#Command
diff --git a/docs/src/carapace/cache.md b/docs/src/carapace/cache.md
deleted file mode 100644
index b8168ee..0000000
--- a/docs/src/carapace/cache.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# Cache
-
-[`Cache`] provides a simple way to cache [callback actions].
-For this an [InvokedAction] is persisted as `json` to [`os.UserCacheDir`] (see [Export]):
-
-```handlebars
-{{cacheDir}}/carapace/{{username}}/{{binary}}/{{callerChecksum}}/{{cacheChecksum}}
-```
-
-| ID             | x                                | example                                    |
-| ----           | ---                              | ---                                        |
-| cacheDir       | os.UserCacheDir                  | `~/.cache/`                                |
-| username       | current user                     | `root`                                     |
-| binary         | binary name                      | `carapace`                                 |
-| callerChecksum | sha1sum using [`runtime.Caller`] | `89be88b670885d3d7855c7169ad7cfd2816a6c37` |
-| cacheChecksum  | sh1sum of given [`CacheKeys`]    | `041858daaaa8b084122d4604a3223315c39edc3e` |
-
-[`Cache`]:https://pkg.go.dev/github.com/rsteube/carapace#Action.Cache
-[`CacheKeys`]:https://pkg.go.dev/github.com/rsteube/carapace/pkg/cache#CacheKey
-[callback actions]:./defaultActions/actionCallback.md
-[Export]:./export.md
-[InvokedAction]:./invokedAction.md
-[`os.UserCacheDir`]:https://pkg.go.dev/os#UserCacheDir
-[`runtime.Caller`]:https://pkg.go.dev/runtime#Caller
-
-
-
diff --git a/docs/src/carapace/context.md b/docs/src/carapace/context.md
new file mode 100644
index 0000000..c403038
--- /dev/null
+++ b/docs/src/carapace/context.md
@@ -0,0 +1,1 @@
+# Context
diff --git a/docs/src/carapace/action/custom.md b/docs/src/carapace/customActions.md
similarity index 85%
rename from docs/src/carapace/action/custom.md
rename to docs/src/carapace/customActions.md
index b91a083..77d44fd 100644
--- a/docs/src/carapace/action/custom.md
+++ b/docs/src/carapace/customActions.md
@@ -1,4 +1,4 @@
-# Custom
+# CustomActions
 
 Custom Actions can be created by using a function that returns `carapace.Action`. A range of these can be found at [carapace-bin](https://pkg.go.dev/github.com/rsteube/carapace-bin/pkg/actions).
 
@@ -21,5 +21,5 @@ func ActionExample(opts ExampleOpts) carapace.Action {
 }
 ```
 
-> Unless static values are returned the code should be wrapped in a [callback](../defaultActions/actionCallback.md) or the code would be executed at program start (and slow it down considerably).
+> Unless static values are returned the code should be wrapped in a [callback](defaultActions/actionCallback.md) or the code would be executed at program start (and slow it down considerably).
 > It is also mandatory when accessing the commands flag values as the callback function is invoked after these are parsed.
diff --git a/docs/src/carapace/export.md b/docs/src/carapace/export.md
index 3a4f049..4ea15f8 100644
--- a/docs/src/carapace/export.md
+++ b/docs/src/carapace/export.md
@@ -67,6 +67,6 @@ example _carapace export example m<TAB>
 
 
 [ActionImport]:./defaultActions/actionImport.md
-[Cache]:./cache.md
+[Cache]:./action/cache.md
 [`Export`]:https://pkg.go.dev/github.com/rsteube/carapace/internal/export#Export
 [InvokedAction]:./invokedAction.md
diff --git a/docs/src/carapace/group.md b/docs/src/carapace/group.md
new file mode 100644
index 0000000..7be4691
--- /dev/null
+++ b/docs/src/carapace/group.md
@@ -0,0 +1,57 @@
+# Group
+
+[Command Groups] are implicitly used as `tag` for commands.
+
+```go
+func init() {
+	carapace.Gen(rootCmd).Standalone()
+
+	rootCmd.AddGroup(
+		&cobra.Group{ID: "main", Title: "Main Commands"},
+		&cobra.Group{ID: "other", Title: "Other Commands"},
+	)
+	rootCmd.AddCommand(
+		&cobra.Command{Use: "sub1", GroupID: "main", Run: func(cmd *cobra.Command, args []string) {}},
+		&cobra.Command{Use: "sub2", GroupID: "main", Run: func(cmd *cobra.Command, args []string) {}},
+		&cobra.Command{Use: "sub3", GroupID: "other", Run: func(cmd *cobra.Command, args []string) {}},
+		&cobra.Command{Use: "sub4", GroupID: "other", Run: func(cmd *cobra.Command, args []string) {}},
+		&cobra.Command{Use: "sub5", Run: func(cmd *cobra.Command, args []string) {}},
+	)
+}
+```
+
+```json
+{
+  "Version": "v0.26.5",
+  "Nospace": "",
+  "RawValues": [
+    {
+      "Value": "sub1",
+      "Display": "sub1",
+      "Tag": "main commands"
+    },
+    {
+      "Value": "sub2",
+      "Display": "sub2",
+      "Tag": "main commands"
+    },
+    {
+      "Value": "sub3",
+      "Display": "sub3",
+      "Tag": "other commands"
+    },
+    {
+      "Value": "sub4",
+      "Display": "sub4",
+      "Tag": "other commands"
+    },
+    {
+      "Value": "sub5",
+      "Display": "sub5",
+      "Tag": "additional commands"
+    }
+  ]
+}
+```
+
+[Command Groups]:https://github.com/spf13/cobra/blob/main/user_guide.md#grouping-commands-in-help
diff --git a/example/cmd/modifier.go b/example/cmd/modifier.go
index 809379f..547be49 100644
--- a/example/cmd/modifier.go
+++ b/example/cmd/modifier.go
@@ -1,9 +1,14 @@
 package cmd
 
 import (
+	"os"
+	"path/filepath"
+	"strings"
 	"time"
 
 	"github.com/rsteube/carapace"
+	"github.com/rsteube/carapace/pkg/cache"
+	"github.com/rsteube/carapace/pkg/style"
 	"github.com/spf13/cobra"
 )
 
@@ -16,8 +21,24 @@ var modifierCmd = &cobra.Command{
 
 func init() {
 	modifierCmd.Flags().String("batch", "", "Batch()")
+
+	modifierCmd.Flags().String("cache", "", "Cache()")
+	modifierCmd.Flags().String("cache-key", "", "Cache()")
+	modifierCmd.Flags().String("chdir", "", "Chdir()")
+	modifierCmd.Flags().String("invoke", "", "Invoke()")
+	modifierCmd.Flags().String("list", "", "List()")
+	modifierCmd.Flags().String("multiparts", "", "MultiParts()")
+	modifierCmd.Flags().String("nospace", "", "NoSpace()")
+	modifierCmd.Flags().String("prefix", "", "Prefix()")
+	modifierCmd.Flags().String("style", "", "Style()")
+	modifierCmd.Flags().String("stylef", "", "StyleF()")
+	modifierCmd.Flags().String("styler", "", "StyleR()")
+	modifierCmd.Flags().String("suffix", "", "Suffix()")
+	modifierCmd.Flags().String("suppress", "", "Suppress()")
+	modifierCmd.Flags().String("tag", "", "Tag()")
+	modifierCmd.Flags().String("tagf", "", "TagF()")
 	modifierCmd.Flags().String("timeout", "", "Timeout()")
-	modifierCmd.Flags().String("tomultiparts", "", "ToMultiPartsA()")
+	modifierCmd.Flags().String("uniquelist", "", "UniqueList()")
 	modifierCmd.Flags().String("usage", "", "Usage()")
 
 	rootCmd.AddCommand(modifierCmd)
@@ -37,6 +58,38 @@ func init() {
 				"D", "description of D",
 			),
 		).ToA(),
+		"cache": carapace.ActionCallback(func(c carapace.Context) carapace.Action {
+			return carapace.ActionValues(
+				time.Now().Format("15:04:05"),
+			).Cache(5 * time.Second)
+		}),
+		"cache-key": carapace.ActionMultiParts("/", func(c carapace.Context) carapace.Action {
+			switch len(c.Parts) {
+			case 0:
+				return carapace.ActionValues("one", "two").Suffix("/")
+			case 1:
+				return carapace.ActionValues(
+					time.Now().Format("15:04:05"),
+				).Cache(10*time.Second, cache.String(c.Parts[0]))
+			default:
+				return carapace.ActionValues()
+			}
+		}),
+		"chdir": carapace.ActionFiles().Chdir(os.TempDir()),
+		"list":  carapace.ActionValues("one", "two", "three").List(","),
+		"invoke": carapace.ActionCallback(func(c carapace.Context) carapace.Action {
+			if !strings.HasPrefix(c.Value, "file://") {
+				return carapace.ActionValues("file://").NoSpace()
+			}
+
+			c.Value = strings.TrimPrefix(c.Value, "file://")
+			return carapace.ActionFiles().Invoke(c).Prefix("file://").ToA()
+		}),
+		"nospace": carapace.ActionValues(
+			"one,",
+			"two/",
+			"three",
+		).NoSpace(',', '/'),
 		"timeout": carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action {
 			switch len(c.Parts) {
 			case 0:
@@ -58,17 +111,81 @@ func init() {
 				return carapace.ActionValues()
 			}
 		}),
-		"tomultiparts": carapace.ActionCallback(func(c carapace.Context) carapace.Action {
-			return carapace.ActionValuesDescribed(
-				"1=1==1/1", "one",
-				"1=1==1/2", "two",
-				"1=1==2/1", "three",
-				"1=1==2/2", "four",
-				"1=2==1/1", "five",
-				"2=1==1/1", "six",
-			).Invoke(c).ToMultiPartsA("==", "=", "/")
+		"multiparts": carapace.ActionValues(
+			"dir/subdir1/fileA.txt",
+			"dir/subdir1/fileB.txt",
+			"dir/subdir2/fileC.txt",
+		).MultiParts("/"),
+		"prefix": carapace.ActionValues(
+			"melon",
+			"drop",
+			"fall",
+		).Prefix("water"),
+		"style": carapace.ActionValues(
+			"one",
+			"two",
+		).Style(style.Green),
+		"stylef": carapace.ActionValues(
+			"one",
+			"two",
+			"three",
+		).StyleF(func(s string, sc style.Context) string {
+			switch s {
+			case "one":
+				return style.Green
+			case "two":
+				return style.Red
+			default:
+				return style.Default
+			}
+		}),
+		"styler": carapace.ActionValues(
+			"one",
+			"two",
+		).StyleR(&style.Carapace.KeywordAmbiguous),
+		"suffix": carapace.ActionValues(
+			"apple",
+			"melon",
+			"orange",
+		).Suffix("juice"),
+		"suppress": carapace.Batch(
+			carapace.ActionMessage("unexpected error"),
+			carapace.ActionMessage("ignored error"),
+		).ToA().Suppress("ignored"),
+		"tag": carapace.ActionValues(
+			"192.168.1.1",
+			"127.0.0.1",
+		).Tag("interfaces"),
+		"tagf": carapace.ActionValues(
+			"one.png",
+			"two.gif",
+			"three.txt",
+			"four.md",
+		).StyleF(style.ForPathExt).TagF(func(s string) string {
+			switch filepath.Ext(s) {
+			case ".png", ".gif":
+				return "images"
+			case ".txt", ".md":
+				return "documents"
+			default:
+				return ""
+			}
+		}),
+		"uniquelist": carapace.ActionValues("one", "two", "three").UniqueList(","),
+		"usage": carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action {
+			switch len(c.Parts) {
+			case 0:
+				return carapace.ActionValues("explicit", "implicit").Suffix(":")
+			case 1:
+				if c.Parts[0] == "explicit" {
+					return carapace.ActionValues().Usage("explicit usage")
+				}
+				return carapace.ActionValues()
+
+			default:
+				return carapace.ActionValues()
+			}
 		}),
-		"usage": carapace.ActionValues().Usage("explicit flag usage"),
 	})
 
 	carapace.Gen(modifierCmd).PositionalCompletion(


Test patch:
diff --git a/example/cmd/modifier_test.go b/example/cmd/modifier_test.go
index 81787f2..d462273 100644
--- a/example/cmd/modifier_test.go
+++ b/example/cmd/modifier_test.go
@@ -38,8 +38,15 @@ func TestTimeout(t *testing.T) {
 func TestUsage(t *testing.T) {
 	sandbox.Package(t, "github.com/rsteube/carapace/example")(func(s *sandbox.Sandbox) {
 		s.Run("modifier", "--usage", "").
+			Expect(carapace.ActionValues("explicit", "implicit").
+				Suffix(":").
+				NoSpace(':').
+				Usage("Usage()"))
+
+		s.Run("modifier", "--usage", "explicit:").
 			Expect(carapace.ActionValues().
-				Usage("explicit flag usage"))
+				NoSpace(':').
+				Usage("explicit usage"))
 	})
 }
 
@@ -59,31 +66,29 @@ func TestChdir(t *testing.T) {
 	})
 }
 
-func TestToMultiPartsA(t *testing.T) {
+func TestMultiParts(t *testing.T) {
 	sandbox.Package(t, "github.com/rsteube/carapace/example")(func(s *sandbox.Sandbox) {
-		s.Run("modifier", "--tomultiparts", "").
-			Expect(carapace.ActionValues("1=", "2=").
-				NoSpace('/', '=').
-				Usage("ToMultiPartsA()"))
+		s.Run("modifier", "--multiparts", "").
+			Expect(carapace.ActionValues("dir/").
+				NoSpace('/').
+				Usage("MultiParts()"))
 
-		s.Run("modifier", "--tomultiparts", "1=").
-			Expect(carapace.ActionValues("1==", "2==").
-				Prefix("1=").
-				NoSpace('/', '=').
-				Usage("ToMultiPartsA()"))
+		s.Run("modifier", "--multiparts", "dir/").
+			Expect(carapace.ActionValues("subdir1/", "subdir2/").
+				Prefix("dir/").
+				NoSpace('/').
+				Usage("MultiParts()"))
 
-		s.Run("modifier", "--tomultiparts", "1=1==").
-			Expect(carapace.ActionValues("1/", "2/").
-				Prefix("1=1==").
-				NoSpace('/', '=').
-				Usage("ToMultiPartsA()"))
+		s.Run("modifier", "--multiparts", "dir/subdir1/").
+			Expect(carapace.ActionValues("fileA.txt", "fileB.txt").
+				Prefix("dir/subdir1/").
+				NoSpace('/').
+				Usage("MultiParts()"))
 
-		s.Run("modifier", "--tomultiparts", "1=1==1/").
-			Expect(carapace.ActionValuesDescribed(
-				"1", "one",
-				"2", "two").
-				Prefix("1=1==1/").
-				NoSpace('/', '=').
-				Usage("ToMultiPartsA()"))
+		s.Run("modifier", "--multiparts", "dir/subdir2/").
+			Expect(carapace.ActionValues("fileC.txt").
+				Prefix("dir/subdir2/").
+				NoSpace('/').
+				Usage("MultiParts()"))
 	})
 }