Repository: rsteube/carapace
Pull request #806 (2023-07-12 23:13:02)

action: added Shift


Patch:
diff --git a/action.go b/action.go
index 77f3c51..c186c13 100644
--- a/action.go
+++ b/action.go
@@ -141,6 +141,21 @@ func (a Action) Retain(values []string) Action {
 	})
 }
 
+// Shift shifts positional arguments left `n` times.
+func (a Action) Shift(n int) Action {
+	return ActionCallback(func(c Context) Action {
+		switch {
+		case n < 0:
+			return ActionMessage("invalid argument [ActionShift]: %v", n)
+		case len(c.Args) < n:
+			c.Args = []string{}
+		default:
+			c.Args = c.Args[n:]
+		}
+		return a.Invoke(c).ToA()
+	})
+}
+
 // Style sets the style.
 //
 //	ActionValues("yes").Style(style.Green)
diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md
index efc1bbf..f60bb9e 100644
--- a/docs/src/SUMMARY.md
+++ b/docs/src/SUMMARY.md
@@ -16,6 +16,7 @@
     - [NoSpace](./carapace/action/noSpace.md)
     - [Prefix](./carapace/action/prefix.md)
     - [Retain](./carapace/action/retain.md)
+    - [Shift](./carapace/action/shift.md)
     - [Style](./carapace/action/style.md)
     - [StyleF](./carapace/action/styleF.md)
     - [StyleR](./carapace/action/styleR.md)
diff --git a/docs/src/carapace/action/shift.cast b/docs/src/carapace/action/shift.cast
new file mode 100644
index 0000000..4980b71
--- /dev/null
+++ b/docs/src/carapace/action/shift.cast
@@ -0,0 +1,106 @@
+{"version": 2, "width": 108, "height": 24, "timestamp": 1689232589, "env": {"SHELL": "elvish", "TERM": "tmux-256color"}}
+[0.073849, "o", "\u001b[?7h\u001b[7m⏎\u001b[m                                                                                                           \r \r\u001b[?7l\u001b[?2004h"]
+[0.076149, "o", "\u001b[?25l\r???>                                                                                                   ???> \r\u001b[5C\u001b[?25h\u001b[?25l\r\u001b[5C\u001b[K\r\u001b[5C\u001b[?25h"]
+[0.090237, "o", "\u001b[?25l\r\u001b[K\r\n\u001b[0;1;36mcarapace/example/cmd\u001b[0;m on \u001b[0;1;35m shift\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \r\u001b[6C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[0.777247, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[0.777328, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.777431, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.790895, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.790961, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[0.992519, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[7C\u001b[0;31mx\u001b[0;m\r\u001b[8C\u001b[?25h"]
+[1.141093, "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"]
+[1.141168, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[1.232835, "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.32041, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[10C\u001b[0;31mp\u001b[0;m\r\u001b[11C\u001b[?25h"]
+[1.320509, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[11C\u001b[?25h"]
+[1.498416, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[11C\u001b[0;31ml\u001b[0;m\r\u001b[12C\u001b[?25h"]
+[1.498531, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.498865, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.499291, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.499369, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[12C\u001b[?25h"]
+[1.555098, "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.555197, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[13C\u001b[?25h"]
+[1.647735, "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.773624, "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.841251, "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.990722, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[16Cdifier \r\u001b[23C\u001b[?25h"]
+[2.566033, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[23Co\r\u001b[24C\u001b[?25h"]
+[2.648817, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[24Cn\r\u001b[25C\u001b[?25h"]
+[2.649138, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[25C\u001b[?25h"]
+[2.764723, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[25Ce\r\u001b[26C\u001b[?25h"]
+[2.764801, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[26C\u001b[?25h"]
+[2.892906, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[26C \r\u001b[27C\u001b[?25h"]
+[2.892996, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[27C\u001b[?25h"]
+[3.134581, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27C-\r\u001b[28C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[28C\u001b[?25h"]
+[3.269801, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[28C-\r\u001b[29C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[29C\u001b[?25h"]
+[3.428423, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[29Cs\r\u001b[30C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[30C\u001b[?25h"]
+[3.528408, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30Ch\r\u001b[31C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[31C\u001b[?25h"]
+[3.718185, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31Cift \r\u001b[35C\u001b[?25h"]
+[4.120474, "o", "\u001b[?25l\u001b[2A\r\u001b[0;31merror: \u001b[0;m[]string{}\u001b[K\r\n\u001b[0;2musage: \u001b[0;mShift()\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/example/cmd\u001b[0;m on \u001b[0;1;35m shift\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m modifier one --shift \r\u001b[35C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[35C\u001b[?25h"]
+[5.45391, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
+[6.05458, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[K\r\u001b[33C\u001b[?25h"]
+[6.093498, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[K\r\u001b[32C\u001b[?25h"]
+[6.134308, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31C\u001b[K\r\u001b[31C\u001b[?25h"]
+[6.174947, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30C\u001b[K\r\u001b[30C\u001b[?25h"]
+[6.213963, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[29C\u001b[K\r\u001b[29C\u001b[?25h"]
+[6.253728, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[28C\u001b[K\r\u001b[28C\u001b[?25h"]
+[6.29415, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27C\u001b[K\r\u001b[27C\u001b[?25h"]
+[6.635889, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[27Ct\r\u001b[28C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[28C\u001b[?25h"]
+[6.803573, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[28Cw\r\u001b[29C\u001b[?25h"]
+[6.803656, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[29C\u001b[?25h"]
+[6.97938, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[29Co\r\u001b[30C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[30C\u001b[?25h"]
+[7.155877, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[30C \r\u001b[31C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[31C\u001b[?25h"]
+[7.282341, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31C-\r\u001b[32C\u001b[?25h"]
+[7.283294, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[7.28453, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[7.285461, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[7.285675, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[7.487818, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C-\r\u001b[33C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[33C\u001b[?25h"]
+[7.60221, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33Cs\r\u001b[34C\u001b[?25h"]
+[7.602553, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[34C\u001b[?25h"]
+[7.722502, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34Ch\r\u001b[35C\u001b[?25h"]
+[7.722589, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[35C\u001b[?25h"]
+[7.819015, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35Cift \r\u001b[39C\u001b[?25h"]
+[8.246241, "o", "\u001b[?25l\u001b[2A\r\u001b[0;31merror: \u001b[0;m[]string{\"two\"}\u001b[K\r\n\u001b[0;2musage: \u001b[0;mShift()\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/example/cmd\u001b[0;m on \u001b[0;1;35m shift\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m modifier one two --shift \r\u001b[39C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[9.086837, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C\u001b[K\r\u001b[38C\u001b[?25h"]
+[9.687482, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C\u001b[K\r\u001b[37C\u001b[?25h"]
+[9.727362, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C\u001b[K\r\u001b[36C\u001b[?25h"]
+[9.767074, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35C\u001b[K\r\u001b[35C\u001b[?25h"]
+[9.807257, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34C\u001b[K\r\u001b[34C\u001b[?25h"]
+[9.846949, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33C\u001b[K\r\u001b[33C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[33C\u001b[?25h"]
+[9.887733, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32C\u001b[K\r\u001b[32C\u001b[?25h"]
+[10.258772, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31C\u001b[K\r\u001b[31C\u001b[?25h"]
+[10.479038, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[31Ct\r\u001b[32C\u001b[?25h"]
+[10.47911, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[32C\u001b[?25h"]
+[10.654316, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[32Ch\r\u001b[33C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[33C\u001b[?25h"]
+[10.841629, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[33Cr\r\u001b[34C\u001b[?25h"]
+[10.842011, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[34C\u001b[?25h"]
+[10.940763, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[34Ce\r\u001b[35C\u001b[?25h"]
+[10.940838, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[35C\u001b[?25h"]
+[11.143518, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[35Ce\r\u001b[36C\u001b[?25h"]
+[11.143622, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[36C\u001b[?25h"]
+[11.354996, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[36C \r\u001b[37C\u001b[?25h"]
+[11.355095, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[37C\u001b[?25h"]
+[11.455287, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[37C-\r\u001b[38C\u001b[?25h"]
+[11.455387, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[38C\u001b[?25h"]
+[11.618949, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[38C-\r\u001b[39C\u001b[?25h"]
+[11.619535, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[39C\u001b[?25h"]
+[11.709018, "o", "\u001b[?25l\u001b[2A\r"]
+[11.709121, "o", "\r\n\r\n\u001b[39Cs\r\u001b[40C\u001b[?25h"]
+[11.709532, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[40C\u001b[?25h"]
+[11.792216, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[40Ch\r\u001b[41C\u001b[?25h"]
+[11.903833, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[41Cift \r\u001b[45C\u001b[?25h"]
+[12.216856, "o", "\u001b[?25l\u001b[2A\r\u001b[0;31merror: \u001b[0;m[]string{\"two\", \"three\"}\u001b[K\r\n\u001b[0;2musage: \u001b[0;mShift()\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/example/cmd\u001b[0;m on \u001b[0;1;35m shift\u001b[0;m \u001b[0;1;31m[$!?]\u001b[0;m via \u001b[0;1;36m🐹 v1.20.5 \r\n\u001b[0;1;37mesh\u001b[0;m \u001b[0;1;32m❯\u001b[0;m \u001b[0;32mexample\u001b[0;m modifier one two three --shift \r\u001b[45C\u001b[?25h\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[45C\u001b[?25h"]
+[13.407006, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[K\r\u001b[6C\u001b[?25h"]
+[13.407118, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.407792, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.426575, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.426743, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[6C\u001b[?25h"]
+[13.652997, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[6C\u001b[0;31me\u001b[0;m\r\u001b[7C\u001b[?25h"]
+[13.653091, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[7C\u001b[?25h"]
+[13.816142, "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"]
+[13.937076, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\u001b[8C\u001b[0;31mi\u001b[0;m\r\u001b[9C\u001b[?25h"]
+[13.937441, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\u001b[9C\u001b[?25h"]
+[14.03151, "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.142911, "o", "\u001b[?25l\u001b[2A\r\r\n\r\n\r\n\r\u001b[?25h"]
+[14.143149, "o", "\u001b[?7h\u001b[?2004l\r"]
diff --git a/docs/src/carapace/action/shift.md b/docs/src/carapace/action/shift.md
new file mode 100644
index 0000000..42dd8c3
--- /dev/null
+++ b/docs/src/carapace/action/shift.md
@@ -0,0 +1,13 @@
+# Shift
+
+[`Shift`] shifts positional arguments left `n` times.
+
+```go
+carapace.ActionCallback(func(c carapace.Context) carapace.Action {
+	return carapace.ActionMessage("%#v", c.Args)
+}).Shift(1)
+```
+
+![](./shift.cast)
+
+[`Shift`]: https://pkg.go.dev/github.com/rsteube/carapace#Action.Shift
diff --git a/example/cmd/modifier.go b/example/cmd/modifier.go
index fb24673..13039b7 100644
--- a/example/cmd/modifier.go
+++ b/example/cmd/modifier.go
@@ -32,6 +32,7 @@ func init() {
 	modifierCmd.Flags().String("nospace", "", "NoSpace()")
 	modifierCmd.Flags().String("prefix", "", "Prefix()")
 	modifierCmd.Flags().String("retain", "", "Retain()")
+	modifierCmd.Flags().String("shift", "", "Shift()")
 	modifierCmd.Flags().String("style", "", "Style()")
 	modifierCmd.Flags().String("stylef", "", "StyleF()")
 	modifierCmd.Flags().String("styler", "", "StyleR()")
@@ -135,6 +136,9 @@ func init() {
 			"3", "three",
 			"4", "four",
 		).Retain([]string{"2", "4"}),
+		"shift": carapace.ActionCallback(func(c carapace.Context) carapace.Action {
+			return carapace.ActionMessage("%#v", c.Args)
+		}).Shift(1),
 		"style": carapace.ActionValues(
 			"one",
 			"two",
diff --git a/pkg/style/keyword.go b/pkg/style/keyword.go
index 8195f32..97f9446 100644
--- a/pkg/style/keyword.go
+++ b/pkg/style/keyword.go
@@ -28,11 +28,6 @@ var keywords = map[string]*string{
 	"public":  &Carapace.KeywordPositive,
 	"private": &Carapace.KeywordNegative,
 
-	"asc":        &Carapace.KeywordPositive,
-	"ascending":  &Carapace.KeywordPositive,
-	"desc":       &Carapace.KeywordNegative,
-	"descending": &Carapace.KeywordNegative,
-
 	"open":   &Carapace.KeywordPositive,
 	"opened": &Carapace.KeywordPositive,
 	"close":  &Carapace.KeywordNegative,


Test patch:
diff --git a/example/cmd/modifier_test.go b/example/cmd/modifier_test.go
index 7539969..7075dd4 100644
--- a/example/cmd/modifier_test.go
+++ b/example/cmd/modifier_test.go
@@ -41,6 +41,16 @@ func TestRetain(t *testing.T) {
 	})
 }
 
+func TestShift(t *testing.T) {
+	sandbox.Package(t, "github.com/rsteube/carapace/example")(func(s *sandbox.Sandbox) {
+		s.Run("modifier", "one", "--shift", "").
+			Expect(carapace.ActionMessage(`[]string{}`).Usage("Shift()"))
+
+		s.Run("modifier", "one", "two", "three", "--shift", "").
+			Expect(carapace.ActionMessage(`[]string{"two", "three"}`).Usage("Shift()"))
+	})
+}
+
 func TestTimeout(t *testing.T) {
 	sandbox.Package(t, "github.com/rsteube/carapace/example")(func(s *sandbox.Sandbox) {
 		s.Run("modifier", "--timeout", "1s:").