@ 261102.1

261102.1 · 99bfd5aa0f66133d7dcfbf18f8044eb765f04649

Add change-info-command and transform variants

- change-info-command, transform-info-command, bg-transform-info-command
- change-info-command disallowed from remote --listen like change-preview

Close #4951

reading declarations

CHANGELOG.md

@@ -1,8 +1,14 @@ CHANGELOG ========= -0.74.6+0.75.0 ------+- Added `{change,transform,bg-transform}-info-command` actions (#4951) (@casperdcl)+  ```sh+  seq 100 | fzf --info-command 'echo "mode: A | $FZF_INFO"' \+                --bind 'ctrl-a:change-info-command:echo "mode: A | $FZF_INFO"' \+                --bind 'ctrl-b:change-info-command:echo "mode: B | $FZF_INFO"'+  ``` - Fixed `--with-shell` on Windows not detecting cmd, PowerShell, and pwsh, which made fzf quote commands and entries for a POSIX shell (#4936) (@vimkim)     - e.g. With `--with-shell "cmd.exe /d /c"`, `--preview '"C:\Program Files\nu\bin\nu.exe" --version'` failed - `transform-nth` and `transform-with-nth` (and their `bg-` variants) no longer split the output at `|`

man/man1/fzf.1

@@ -2056,6 +2056,7 @@ A key or an event can be bound to one or more of the following actions.     \fBchange\-header(...)\fR           (change header to the given string; doesn't affect \fB\-\-header\-lines\fR)     \fBchange\-header\-lines(N)\fR       (change the number of \fB\-\-header\-lines\fR)     \fBchange\-header\-label(...)\fR     (change \fB\-\-header\-label\fR to the given string)+    \fBchange\-info\-command(...)\fR     (change \fB\-\-info\-command\fR option)     \fBchange\-input\-label(...)\fR      (change \fB\-\-input\-label\fR to the given string)     \fBchange\-list\-label(...)\fR       (change \fB\-\-list\-label\fR to the given string)     \fBchange\-multi\fR                 (enable multi-select mode with no limit)@@ -2164,6 +2165,7 @@ A key or an event can be bound to one or more of the following actions.     \fBtransform\-header(...)\fR        (transform header using an external command)     \fBtransform\-header\-lines(...)\fR  (transform the number of \fB\-\-header\-lines\fR using an external command)     \fBtransform\-header\-label(...)\fR  (transform header label using an external command)+    \fBtransform\-info\-command(...)\fR  (transform \fB\-\-info\-command\fR using an external command)     \fBtransform\-input\-label(...)\fR   (transform input label using an external command)     \fBtransform\-list\-label(...)\fR    (transform list label using an external command)     \fBtransform\-nth(...)\fR           (transform nth using an external command; see CHANGE NTH AND WITH\-NTH)

src/actiontype_string.go

@@ -34,168 +34,172 @@ func _() { 	_ = x[actChangeFooter-23] 	_ = x[actChangeHeaderLabel-24] 	_ = x[actChangeFooterLabel-25]-	_ = x[actChangeInputLabel-26]-	_ = x[actChangeListLabel-27]-	_ = x[actChangeMulti-28]-	_ = x[actChangeNth-29]-	_ = x[actChangeWithNth-30]-	_ = x[actChangePointer-31]-	_ = x[actChangePreview-32]-	_ = x[actChangePreviewLabel-33]-	_ = x[actChangePreviewWindow-34]-	_ = x[actChangePrompt-35]-	_ = x[actChangeQuery-36]-	_ = x[actClearScreen-37]-	_ = x[actClearQuery-38]-	_ = x[actClearSelection-39]-	_ = x[actClose-40]-	_ = x[actDeleteChar-41]-	_ = x[actDeleteCharEof-42]-	_ = x[actEndOfLine-43]-	_ = x[actFatal-44]-	_ = x[actForwardChar-45]-	_ = x[actForwardWord-46]-	_ = x[actForwardSubWord-47]-	_ = x[actKillLine-48]-	_ = x[actKillWord-49]-	_ = x[actKillSubWord-50]-	_ = x[actUnixLineDiscard-51]-	_ = x[actUnixWordRubout-52]-	_ = x[actYank-53]-	_ = x[actBackwardKillWord-54]-	_ = x[actBackwardKillSubWord-55]-	_ = x[actSelectAll-56]-	_ = x[actDeselectAll-57]-	_ = x[actToggle-58]-	_ = x[actToggleSearch-59]-	_ = x[actToggleAll-60]-	_ = x[actToggleDown-61]-	_ = x[actToggleUp-62]-	_ = x[actToggleIn-63]-	_ = x[actToggleOut-64]-	_ = x[actToggleTrack-65]-	_ = x[actToggleTrackCurrent-66]-	_ = x[actToggleHeader-67]-	_ = x[actToggleWrap-68]-	_ = x[actToggleWrapWord-69]-	_ = x[actToggleMultiLine-70]-	_ = x[actToggleHscroll-71]-	_ = x[actToggleRaw-72]-	_ = x[actEnableRaw-73]-	_ = x[actDisableRaw-74]-	_ = x[actTrackCurrent-75]-	_ = x[actToggleInput-76]-	_ = x[actHideInput-77]-	_ = x[actShowInput-78]-	_ = x[actUntrackCurrent-79]-	_ = x[actDown-80]-	_ = x[actDownMatch-81]-	_ = x[actUp-82]-	_ = x[actUpMatch-83]-	_ = x[actPageUp-84]-	_ = x[actPageDown-85]-	_ = x[actPosition-86]-	_ = x[actHalfPageUp-87]-	_ = x[actHalfPageDown-88]-	_ = x[actOffsetUp-89]-	_ = x[actOffsetDown-90]-	_ = x[actOffsetMiddle-91]-	_ = x[actJump-92]-	_ = x[actJumpAccept-93]-	_ = x[actPrintQuery-94]-	_ = x[actRefreshPreview-95]-	_ = x[actReplaceQuery-96]-	_ = x[actToggleSort-97]-	_ = x[actShowPreview-98]-	_ = x[actHidePreview-99]-	_ = x[actTogglePreview-100]-	_ = x[actTogglePreviewWrap-101]-	_ = x[actTogglePreviewWrapWord-102]-	_ = x[actTransform-103]-	_ = x[actTransformBorderLabel-104]-	_ = x[actTransformGhost-105]-	_ = x[actTransformHeader-106]-	_ = x[actTransformHeaderLines-107]-	_ = x[actTransformFooter-108]-	_ = x[actTransformHeaderLabel-109]-	_ = x[actTransformFooterLabel-110]-	_ = x[actTransformInputLabel-111]-	_ = x[actTransformListLabel-112]-	_ = x[actTransformNth-113]-	_ = x[actTransformWithNth-114]-	_ = x[actTransformPointer-115]-	_ = x[actTransformPreviewLabel-116]-	_ = x[actTransformPrompt-117]-	_ = x[actTransformQuery-118]-	_ = x[actTransformSearch-119]-	_ = x[actTrigger-120]-	_ = x[actBgTransform-121]-	_ = x[actBgTransformBorderLabel-122]-	_ = x[actBgTransformGhost-123]-	_ = x[actBgTransformHeader-124]-	_ = x[actBgTransformHeaderLines-125]-	_ = x[actBgTransformFooter-126]-	_ = x[actBgTransformHeaderLabel-127]-	_ = x[actBgTransformFooterLabel-128]-	_ = x[actBgTransformInputLabel-129]-	_ = x[actBgTransformListLabel-130]-	_ = x[actBgTransformNth-131]-	_ = x[actBgTransformWithNth-132]-	_ = x[actBgTransformPointer-133]-	_ = x[actBgTransformPreviewLabel-134]-	_ = x[actBgTransformPrompt-135]-	_ = x[actBgTransformQuery-136]-	_ = x[actBgTransformSearch-137]-	_ = x[actBgCancel-138]-	_ = x[actSearch-139]-	_ = x[actPreview-140]-	_ = x[actPreviewTop-141]-	_ = x[actPreviewBottom-142]-	_ = x[actPreviewUp-143]-	_ = x[actPreviewDown-144]-	_ = x[actPreviewPageUp-145]-	_ = x[actPreviewPageDown-146]-	_ = x[actPreviewHalfPageUp-147]-	_ = x[actPreviewHalfPageDown-148]-	_ = x[actPrevHistory-149]-	_ = x[actPrevSelected-150]-	_ = x[actPrint-151]-	_ = x[actPut-152]-	_ = x[actNextHistory-153]-	_ = x[actNextSelected-154]-	_ = x[actExecute-155]-	_ = x[actExecuteSilent-156]-	_ = x[actExecuteMulti-157]-	_ = x[actSigStop-158]-	_ = x[actBest-159]-	_ = x[actFirst-160]-	_ = x[actLast-161]-	_ = x[actReload-162]-	_ = x[actReloadSync-163]-	_ = x[actDisableSearch-164]-	_ = x[actEnableSearch-165]-	_ = x[actSelect-166]-	_ = x[actDeselect-167]-	_ = x[actUnbind-168]-	_ = x[actRebind-169]-	_ = x[actToggleBind-170]-	_ = x[actBecome-171]-	_ = x[actShowHeader-172]-	_ = x[actHideHeader-173]-	_ = x[actBell-174]-	_ = x[actExclude-175]-	_ = x[actExcludeMulti-176]-	_ = x[actAsync-177]-	_ = x[actWait-178]+	_ = x[actChangeInfoCommand-26]+	_ = x[actChangeInputLabel-27]+	_ = x[actChangeListLabel-28]+	_ = x[actChangeMulti-29]+	_ = x[actChangeNth-30]+	_ = x[actChangeWithNth-31]+	_ = x[actChangePointer-32]+	_ = x[actChangePreview-33]+	_ = x[actChangePreviewLabel-34]+	_ = x[actChangePreviewWindow-35]+	_ = x[actChangePrompt-36]+	_ = x[actChangeQuery-37]+	_ = x[actClearScreen-38]+	_ = x[actClearQuery-39]+	_ = x[actClearSelection-40]+	_ = x[actClose-41]+	_ = x[actDeleteChar-42]+	_ = x[actDeleteCharEof-43]+	_ = x[actEndOfLine-44]+	_ = x[actFatal-45]+	_ = x[actForwardChar-46]+	_ = x[actForwardWord-47]+	_ = x[actForwardSubWord-48]+	_ = x[actKillLine-49]+	_ = x[actKillWord-50]+	_ = x[actKillSubWord-51]+	_ = x[actUnixLineDiscard-52]+	_ = x[actUnixWordRubout-53]+	_ = x[actYank-54]+	_ = x[actBackwardKillWord-55]+	_ = x[actBackwardKillSubWord-56]+	_ = x[actSelectAll-57]+	_ = x[actDeselectAll-58]+	_ = x[actToggle-59]+	_ = x[actToggleSearch-60]+	_ = x[actToggleAll-61]+	_ = x[actToggleDown-62]+	_ = x[actToggleUp-63]+	_ = x[actToggleIn-64]+	_ = x[actToggleOut-65]+	_ = x[actToggleTrack-66]+	_ = x[actToggleTrackCurrent-67]+	_ = x[actToggleHeader-68]+	_ = x[actToggleWrap-69]+	_ = x[actToggleWrapWord-70]+	_ = x[actToggleMultiLine-71]+	_ = x[actToggleHscroll-72]+	_ = x[actToggleRaw-73]+	_ = x[actEnableRaw-74]+	_ = x[actDisableRaw-75]+	_ = x[actTrackCurrent-76]+	_ = x[actToggleInput-77]+	_ = x[actHideInput-78]+	_ = x[actShowInput-79]+	_ = x[actUntrackCurrent-80]+	_ = x[actDown-81]+	_ = x[actDownMatch-82]+	_ = x[actUp-83]+	_ = x[actUpMatch-84]+	_ = x[actPageUp-85]+	_ = x[actPageDown-86]+	_ = x[actPosition-87]+	_ = x[actHalfPageUp-88]+	_ = x[actHalfPageDown-89]+	_ = x[actOffsetUp-90]+	_ = x[actOffsetDown-91]+	_ = x[actOffsetMiddle-92]+	_ = x[actJump-93]+	_ = x[actJumpAccept-94]+	_ = x[actPrintQuery-95]+	_ = x[actRefreshPreview-96]+	_ = x[actReplaceQuery-97]+	_ = x[actToggleSort-98]+	_ = x[actShowPreview-99]+	_ = x[actHidePreview-100]+	_ = x[actTogglePreview-101]+	_ = x[actTogglePreviewWrap-102]+	_ = x[actTogglePreviewWrapWord-103]+	_ = x[actTransform-104]+	_ = x[actTransformBorderLabel-105]+	_ = x[actTransformGhost-106]+	_ = x[actTransformHeader-107]+	_ = x[actTransformHeaderLines-108]+	_ = x[actTransformFooter-109]+	_ = x[actTransformHeaderLabel-110]+	_ = x[actTransformFooterLabel-111]+	_ = x[actTransformInfoCommand-112]+	_ = x[actTransformInputLabel-113]+	_ = x[actTransformListLabel-114]+	_ = x[actTransformNth-115]+	_ = x[actTransformWithNth-116]+	_ = x[actTransformPointer-117]+	_ = x[actTransformPreviewLabel-118]+	_ = x[actTransformPrompt-119]+	_ = x[actTransformQuery-120]+	_ = x[actTransformSearch-121]+	_ = x[actTrigger-122]+	_ = x[actBgTransform-123]+	_ = x[actBgTransformBorderLabel-124]+	_ = x[actBgTransformGhost-125]+	_ = x[actBgTransformHeader-126]+	_ = x[actBgTransformHeaderLines-127]+	_ = x[actBgTransformFooter-128]+	_ = x[actBgTransformHeaderLabel-129]+	_ = x[actBgTransformFooterLabel-130]+	_ = x[actBgTransformInfoCommand-131]+	_ = x[actBgTransformInputLabel-132]+	_ = x[actBgTransformListLabel-133]+	_ = x[actBgTransformNth-134]+	_ = x[actBgTransformWithNth-135]+	_ = x[actBgTransformPointer-136]+	_ = x[actBgTransformPreviewLabel-137]+	_ = x[actBgTransformPrompt-138]+	_ = x[actBgTransformQuery-139]+	_ = x[actBgTransformSearch-140]+	_ = x[actBgCancel-141]+	_ = x[actSearch-142]+	_ = x[actPreview-143]+	_ = x[actPreviewTop-144]+	_ = x[actPreviewBottom-145]+	_ = x[actPreviewUp-146]+	_ = x[actPreviewDown-147]+	_ = x[actPreviewPageUp-148]+	_ = x[actPreviewPageDown-149]+	_ = x[actPreviewHalfPageUp-150]+	_ = x[actPreviewHalfPageDown-151]+	_ = x[actPrevHistory-152]+	_ = x[actPrevSelected-153]+	_ = x[actPrint-154]+	_ = x[actPut-155]+	_ = x[actNextHistory-156]+	_ = x[actNextSelected-157]+	_ = x[actExecute-158]+	_ = x[actExecuteSilent-159]+	_ = x[actExecuteMulti-160]+	_ = x[actSigStop-161]+	_ = x[actBest-162]+	_ = x[actFirst-163]+	_ = x[actLast-164]+	_ = x[actReload-165]+	_ = x[actReloadSync-166]+	_ = x[actDisableSearch-167]+	_ = x[actEnableSearch-168]+	_ = x[actSelect-169]+	_ = x[actDeselect-170]+	_ = x[actUnbind-171]+	_ = x[actRebind-172]+	_ = x[actToggleBind-173]+	_ = x[actBecome-174]+	_ = x[actShowHeader-175]+	_ = x[actHideHeader-176]+	_ = x[actBell-177]+	_ = x[actExclude-178]+	_ = x[actExcludeMulti-179]+	_ = x[actAsync-180]+	_ = x[actWait-181] } -const _actionType_name = "actIgnoreactStartactClickactInvalidactBracketedPasteBeginactBracketedPasteEndactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactBackwardSubWordactCancelactChangeBorderLabelactChangeGhostactChangeHeaderactChangeHeaderLinesactChangeFooteractChangeHeaderLabelactChangeFooterLabelactChangeInputLabelactChangeListLabelactChangeMultiactChangeNthactChangeWithNthactChangePointeractChangePreviewactChangePreviewLabelactChangePreviewWindowactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactForwardSubWordactKillLineactKillWordactKillSubWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactBackwardKillSubWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleWrapWordactToggleMultiLineactToggleHscrollactToggleRawactEnableRawactDisableRawactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactDownMatchactUpactUpMatchactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTogglePreviewWrapWordactTransformactTransformBorderLabelactTransformGhostactTransformHeaderactTransformHeaderLinesactTransformFooteractTransformHeaderLabelactTransformFooterLabelactTransformInputLabelactTransformListLabelactTransformNthactTransformWithNthactTransformPointeractTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactTriggeractBgTransformactBgTransformBorderLabelactBgTransformGhostactBgTransformHeaderactBgTransformHeaderLinesactBgTransformFooteractBgTransformHeaderLabelactBgTransformFooterLabelactBgTransformInputLabelactBgTransformListLabelactBgTransformNthactBgTransformWithNthactBgTransformPointeractBgTransformPreviewLabelactBgTransformPromptactBgTransformQueryactBgTransformSearchactBgCancelactSearchactPreviewactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactBestactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMultiactAsyncactWait"+const _actionType_name = "actIgnoreactStartactClickactInvalidactBracketedPasteBeginactBracketedPasteEndactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactBackwardSubWordactCancelactChangeBorderLabelactChangeGhostactChangeHeaderactChangeHeaderLinesactChangeFooteractChangeHeaderLabelactChangeFooterLabelactChangeInfoCommandactChangeInputLabelactChangeListLabelactChangeMultiactChangeNthactChangeWithNthactChangePointeractChangePreviewactChangePreviewLabelactChangePreviewWindowactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactForwardSubWordactKillLineactKillWordactKillSubWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactBackwardKillSubWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleWrapWordactToggleMultiLineactToggleHscrollactToggleRawactEnableRawactDisableRawactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactDownMatchactUpactUpMatchactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTogglePreviewWrapWordactTransformactTransformBorderLabelactTransformGhostactTransformHeaderactTransformHeaderLinesactTransformFooteractTransformHeaderLabelactTransformFooterLabelactTransformInfoCommandactTransformInputLabelactTransformListLabelactTransformNthactTransformWithNthactTransformPointeractTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactTriggeractBgTransformactBgTransformBorderLabelactBgTransformGhostactBgTransformHeaderactBgTransformHeaderLinesactBgTransformFooteractBgTransformHeaderLabelactBgTransformFooterLabelactBgTransformInfoCommandactBgTransformInputLabelactBgTransformListLabelactBgTransformNthactBgTransformWithNthactBgTransformPointeractBgTransformPreviewLabelactBgTransformPromptactBgTransformQueryactBgTransformSearchactBgCancelactSearchactPreviewactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactBestactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMultiactAsyncactWait" -var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 57, 77, 84, 92, 110, 118, 127, 144, 165, 180, 201, 225, 240, 258, 267, 287, 301, 316, 336, 351, 371, 391, 410, 428, 442, 454, 470, 486, 502, 523, 545, 560, 574, 588, 601, 618, 626, 639, 655, 667, 675, 689, 703, 720, 731, 742, 756, 774, 791, 798, 817, 839, 851, 865, 874, 889, 901, 914, 925, 936, 948, 962, 983, 998, 1011, 1028, 1046, 1062, 1074, 1086, 1099, 1114, 1128, 1140, 1152, 1169, 1176, 1188, 1193, 1203, 1212, 1223, 1234, 1247, 1262, 1273, 1286, 1301, 1308, 1321, 1334, 1351, 1366, 1379, 1393, 1407, 1423, 1443, 1467, 1479, 1502, 1519, 1537, 1560, 1578, 1601, 1624, 1646, 1667, 1682, 1701, 1720, 1744, 1762, 1779, 1797, 1807, 1821, 1846, 1865, 1885, 1910, 1930, 1955, 1980, 2004, 2027, 2044, 2065, 2086, 2112, 2132, 2151, 2171, 2182, 2191, 2201, 2214, 2230, 2242, 2256, 2272, 2290, 2310, 2332, 2346, 2361, 2369, 2375, 2389, 2404, 2414, 2430, 2445, 2455, 2462, 2470, 2477, 2486, 2499, 2515, 2530, 2539, 2550, 2559, 2568, 2581, 2590, 2603, 2616, 2623, 2633, 2648, 2656, 2663}+var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 57, 77, 84, 92, 110, 118, 127, 144, 165, 180, 201, 225, 240, 258, 267, 287, 301, 316, 336, 351, 371, 391, 411, 430, 448, 462, 474, 490, 506, 522, 543, 565, 580, 594, 608, 621, 638, 646, 659, 675, 687, 695, 709, 723, 740, 751, 762, 776, 794, 811, 818, 837, 859, 871, 885, 894, 909, 921, 934, 945, 956, 968, 982, 1003, 1018, 1031, 1048, 1066, 1082, 1094, 1106, 1119, 1134, 1148, 1160, 1172, 1189, 1196, 1208, 1213, 1223, 1232, 1243, 1254, 1267, 1282, 1293, 1306, 1321, 1328, 1341, 1354, 1371, 1386, 1399, 1413, 1427, 1443, 1463, 1487, 1499, 1522, 1539, 1557, 1580, 1598, 1621, 1644, 1667, 1689, 1710, 1725, 1744, 1763, 1787, 1805, 1822, 1840, 1850, 1864, 1889, 1908, 1928, 1953, 1973, 1998, 2023, 2048, 2072, 2095, 2112, 2133, 2154, 2180, 2200, 2219, 2239, 2250, 2259, 2269, 2282, 2298, 2310, 2324, 2340, 2358, 2378, 2400, 2414, 2429, 2437, 2443, 2457, 2472, 2482, 2498, 2513, 2523, 2530, 2538, 2545, 2554, 2567, 2583, 2598, 2607, 2618, 2627, 2636, 2649, 2658, 2671, 2684, 2691, 2701, 2716, 2724, 2731}  func (i actionType) String() string {-	if i < 0 || i >= actionType(len(_actionType_index)-1) {+	idx := int(i) - 0+	if i < 0 || idx >= len(_actionType_index)-1 { 		return "actionType(" + strconv.FormatInt(int64(i), 10) + ")" 	}-	return _actionType_name[_actionType_index[i]:_actionType_index[i+1]]+	return _actionType_name[_actionType_index[idx]:_actionType_index[idx+1]] }

src/options.go

@@ -1672,7 +1672,7 @@ const (  func init() { 	argActionRegexp = regexp.MustCompile(-		`(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|bg-transform|transform)-(?:query|prompt|(?:border|list|preview|input|header|footer)-label|header-lines|header|footer|search|with-nth|nth|pointer|ghost)|bg-transform|transform|change-(?:preview-window|preview|multi)|(?:re|un|toggle-)bind|pos|put|print|search|trigger)`)+		`(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|bg-transform|transform)-(?:query|prompt|(?:border|list|preview|input|header|footer)-label|header-lines|header|footer|search|with-nth|nth|pointer|ghost|info-command)|bg-transform|transform|change-(?:preview-window|preview|multi)|(?:re|un|toggle-)bind|pos|put|print|search|trigger)`) 	splitRegexp = regexp.MustCompile("[,:]+") 	actionNameRegexp = regexp.MustCompile("(?i)^[a-z-]+") }@@ -2101,6 +2101,8 @@ func isExecuteAction(str string) actionType { 		return actChangeHeaderLabel 	case "change-footer-label": 		return actChangeFooterLabel+	case "change-info-command":+		return actChangeInfoCommand 	case "change-ghost": 		return actChangeGhost 	case "change-pointer":@@ -2145,6 +2147,8 @@ func isExecuteAction(str string) actionType { 		return actTransformHeaderLabel 	case "transform-footer-label": 		return actTransformFooterLabel+	case "transform-info-command":+		return actTransformInfoCommand 	case "transform-footer": 		return actTransformFooter 	case "transform-header":@@ -2179,6 +2183,8 @@ func isExecuteAction(str string) actionType { 		return actBgTransformHeaderLabel 	case "bg-transform-footer-label": 		return actBgTransformFooterLabel+	case "bg-transform-info-command":+		return actBgTransformInfoCommand 	case "bg-transform-footer": 		return actBgTransformFooter 	case "bg-transform-header":

src/terminal.go

@@ -589,6 +589,7 @@ const ( 	actChangeFooter 	actChangeHeaderLabel 	actChangeFooterLabel+	actChangeInfoCommand 	actChangeInputLabel 	actChangeListLabel 	actChangeMulti@@ -676,6 +677,7 @@ const ( 	actTransformFooter 	actTransformHeaderLabel 	actTransformFooterLabel+	actTransformInfoCommand 	actTransformInputLabel 	actTransformListLabel 	actTransformNth@@ -696,6 +698,7 @@ const ( 	actBgTransformFooter 	actBgTransformHeaderLabel 	actBgTransformFooterLabel+	actBgTransformInfoCommand 	actBgTransformInputLabel 	actBgTransformListLabel 	actBgTransformNth@@ -764,6 +767,7 @@ func processExecution(action actionType) bool { 		actTransformFooter, 		actTransformHeaderLabel, 		actTransformFooterLabel,+		actTransformInfoCommand, 		actTransformInputLabel, 		actTransformListLabel, 		actTransformNth,@@ -781,6 +785,7 @@ func processExecution(action actionType) bool { 		actBgTransformFooter, 		actBgTransformHeaderLabel, 		actBgTransformFooterLabel,+		actBgTransformInfoCommand, 		actBgTransformInputLabel, 		actBgTransformListLabel, 		actBgTransformNth,@@ -792,6 +797,7 @@ func processExecution(action actionType) bool { 		actBgTransformSearch, 		actPreview, 		actChangePreview,+		actChangeInfoCommand, 		actRefreshPreview, 		actExecute, 		actExecuteSilent,@@ -7447,6 +7453,13 @@ func (t *Terminal) Loop() error { 					t.footerLabel, t.footerLabelLen = t.ansiLabelPrinter(label, &tui.ColFooterLabel, false) 					req(reqRedrawFooterLabel) 				})+			case actChangeInfoCommand, actTransformInfoCommand, actBgTransformInfoCommand:+				capture(true, func(command string) {+					if t.infoCommand != command {+						t.infoCommand = command+						req(reqInfo)+					}+				}) 			case actChangeInputLabel, actTransformInputLabel, actBgTransformInputLabel: 				capture(true, func(label string) { 					t.inputLabelOpts.label = label

test/test_core.rb

@@ -1826,6 +1826,36 @@ class TestCore < TestInteractive     tmux.until { assert_match(/^  2 xx/, it[-2]) }   end +  def test_change_info_command+    tmux.send_keys(%(seq 100 | #{FZF} --separator x --bind 'a:change-info-command(echo {}: $FZF_INFO)' --bind 'b:change-info-command()'), :Enter)+    tmux.until { assert_match(%r{^  100/100 xx}, it[-2]) }+    tmux.send_keys :a+    tmux.until { assert_match(%r{^  1: 100/100 xx}, it[-2]) }+    # Placeholders are evaluated on each update, not when the action runs+    tmux.send_keys :Up+    tmux.until { assert_match(%r{^  2: 100/100 xx}, it[-2]) }+    tmux.send_keys :b+    tmux.until { assert_match(%r{^  100/100 xx}, it[-2]) }+  end++  def test_transform_info_command+    tmux.send_keys(%(seq 100 | #{FZF} --separator x --bind 'a:transform-info-command(echo "echo {}: \\$FZF_POS")'), :Enter)+    tmux.until { assert_match(%r{^  100/100 xx}, it[-2]) }+    tmux.send_keys :a+    tmux.until { assert_match(%r{^  1: 1 xx}, it[-2]) }+    tmux.send_keys :Up+    tmux.until { assert_match(%r{^  1: 2 xx}, it[-2]) }+  end++  def test_bg_transform_info_command+    tmux.send_keys(%(seq 100 | #{FZF} --separator x --bind 'a:bg-transform-info-command(sleep 0.5; echo "echo {}: \\$FZF_POS")'), :Enter)+    tmux.until { assert_match(%r{^  100/100 xx}, it[-2]) }+    tmux.send_keys :a+    tmux.until { assert_match(%r{^  1: 1 xx}, it[-2]) }+    tmux.send_keys :Up+    tmux.until { assert_match(%r{^  1: 2 xx}, it[-2]) }+  end+   def test_prev_next_selected     tmux.send_keys 'seq 10 | fzf --multi --bind ctrl-n:next-selected,ctrl-p:prev-selected', :Enter     tmux.until { |lines| assert_equal 10, lines.match_count }