From c1f8d18a0c7fddf57f1bb4b1ed3ba3948255d361 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 29 Sep 2025 18:42:50 +0900 Subject: [PATCH] Add enable-raw and disable-raw actions --- man/man1/fzf.1 | 4 +- src/actiontype_string.go | 200 ++++++++++++++++++++------------------- src/options.go | 4 + src/terminal.go | 17 +++- test/test_raw.rb | 16 +++- 5 files changed, 138 insertions(+), 103 deletions(-) diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 36c322f2..380078ae 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -1846,10 +1846,12 @@ A key or an event can be bound to one or more of the following actions. \fBdelete\-char/eof\fR \fIctrl\-d\fR (same as \fBdelete\-char\fR except aborts fzf if query is empty) \fBdeselect\fR \fBdeselect\-all\fR (deselect all matches; to also clear non-matching selections, use \fBclear\-multi\fR) + \fBdisable\-raw\fR (disable raw mode) \fBdisable\-search\fR (disable search functionality) \fBdown\fR \fIctrl\-j down\fR \fBdown\-match\fR \fIctrl\-n\fR \fIalt\-down\fR (move to the match below the cursor) \fBdown\-selected\fR (move to the selected item below the cursor) + \fBenable\-raw\fR (enable raw mode) \fBenable\-search\fR (enable search functionality) \fBend\-of\-line\fR \fIctrl\-e end\fR \fBexclude\fR (exclude the current item from the result) @@ -1915,7 +1917,7 @@ A key or an event can be bound to one or more of the following actions. \fBtoggle\-multi\-line\fR \fBtoggle\-preview\fR \fBtoggle\-preview\-wrap\fR - \fBtoggle\-raw\fR + \fBtoggle\-raw\fR (toggle raw mode for displaying non-matching items) \fBtoggle\-search\fR (toggle search functionality) \fBtoggle\-sort\fR \fBtoggle\-track\fR (toggle global tracking option (\fB\-\-track\fR)) diff --git a/src/actiontype_string.go b/src/actiontype_string.go index f6316a51..dba74540 100644 --- a/src/actiontype_string.go +++ b/src/actiontype_string.go @@ -78,108 +78,110 @@ func _() { _ = x[actToggleMultiLine-67] _ = x[actToggleHscroll-68] _ = x[actToggleRaw-69] - _ = x[actTrackCurrent-70] - _ = x[actToggleInput-71] - _ = x[actHideInput-72] - _ = x[actShowInput-73] - _ = x[actUntrackCurrent-74] - _ = x[actDown-75] - _ = x[actDownMatch-76] - _ = x[actUp-77] - _ = x[actUpMatch-78] - _ = x[actPageUp-79] - _ = x[actPageDown-80] - _ = x[actPosition-81] - _ = x[actHalfPageUp-82] - _ = x[actHalfPageDown-83] - _ = x[actOffsetUp-84] - _ = x[actOffsetDown-85] - _ = x[actOffsetMiddle-86] - _ = x[actJump-87] - _ = x[actJumpAccept-88] - _ = x[actPrintQuery-89] - _ = x[actRefreshPreview-90] - _ = x[actReplaceQuery-91] - _ = x[actToggleSort-92] - _ = x[actShowPreview-93] - _ = x[actHidePreview-94] - _ = x[actTogglePreview-95] - _ = x[actTogglePreviewWrap-96] - _ = x[actTransform-97] - _ = x[actTransformBorderLabel-98] - _ = x[actTransformGhost-99] - _ = x[actTransformHeader-100] - _ = x[actTransformFooter-101] - _ = x[actTransformHeaderLabel-102] - _ = x[actTransformFooterLabel-103] - _ = x[actTransformInputLabel-104] - _ = x[actTransformListLabel-105] - _ = x[actTransformNth-106] - _ = x[actTransformPointer-107] - _ = x[actTransformPreviewLabel-108] - _ = x[actTransformPrompt-109] - _ = x[actTransformQuery-110] - _ = x[actTransformSearch-111] - _ = x[actTrigger-112] - _ = x[actBgTransform-113] - _ = x[actBgTransformBorderLabel-114] - _ = x[actBgTransformGhost-115] - _ = x[actBgTransformHeader-116] - _ = x[actBgTransformFooter-117] - _ = x[actBgTransformHeaderLabel-118] - _ = x[actBgTransformFooterLabel-119] - _ = x[actBgTransformInputLabel-120] - _ = x[actBgTransformListLabel-121] - _ = x[actBgTransformNth-122] - _ = x[actBgTransformPointer-123] - _ = x[actBgTransformPreviewLabel-124] - _ = x[actBgTransformPrompt-125] - _ = x[actBgTransformQuery-126] - _ = x[actBgTransformSearch-127] - _ = x[actBgCancel-128] - _ = x[actSearch-129] - _ = x[actPreview-130] - _ = x[actPreviewTop-131] - _ = x[actPreviewBottom-132] - _ = x[actPreviewUp-133] - _ = x[actPreviewDown-134] - _ = x[actPreviewPageUp-135] - _ = x[actPreviewPageDown-136] - _ = x[actPreviewHalfPageUp-137] - _ = x[actPreviewHalfPageDown-138] - _ = x[actPrevHistory-139] - _ = x[actPrevSelected-140] - _ = x[actPrint-141] - _ = x[actPut-142] - _ = x[actNextHistory-143] - _ = x[actNextSelected-144] - _ = x[actExecute-145] - _ = x[actExecuteSilent-146] - _ = x[actExecuteMulti-147] - _ = x[actSigStop-148] - _ = x[actFirst-149] - _ = x[actLast-150] - _ = x[actReload-151] - _ = x[actReloadSync-152] - _ = x[actDisableSearch-153] - _ = x[actEnableSearch-154] - _ = x[actSelect-155] - _ = x[actDeselect-156] - _ = x[actUnbind-157] - _ = x[actRebind-158] - _ = x[actToggleBind-159] - _ = x[actBecome-160] - _ = x[actShowHeader-161] - _ = x[actHideHeader-162] - _ = x[actBell-163] - _ = x[actExclude-164] - _ = x[actExcludeMulti-165] - _ = x[actAsync-166] + _ = x[actEnableRaw-70] + _ = x[actDisableRaw-71] + _ = x[actTrackCurrent-72] + _ = x[actToggleInput-73] + _ = x[actHideInput-74] + _ = x[actShowInput-75] + _ = x[actUntrackCurrent-76] + _ = x[actDown-77] + _ = x[actDownMatch-78] + _ = x[actUp-79] + _ = x[actUpMatch-80] + _ = x[actPageUp-81] + _ = x[actPageDown-82] + _ = x[actPosition-83] + _ = x[actHalfPageUp-84] + _ = x[actHalfPageDown-85] + _ = x[actOffsetUp-86] + _ = x[actOffsetDown-87] + _ = x[actOffsetMiddle-88] + _ = x[actJump-89] + _ = x[actJumpAccept-90] + _ = x[actPrintQuery-91] + _ = x[actRefreshPreview-92] + _ = x[actReplaceQuery-93] + _ = x[actToggleSort-94] + _ = x[actShowPreview-95] + _ = x[actHidePreview-96] + _ = x[actTogglePreview-97] + _ = x[actTogglePreviewWrap-98] + _ = x[actTransform-99] + _ = x[actTransformBorderLabel-100] + _ = x[actTransformGhost-101] + _ = x[actTransformHeader-102] + _ = x[actTransformFooter-103] + _ = x[actTransformHeaderLabel-104] + _ = x[actTransformFooterLabel-105] + _ = x[actTransformInputLabel-106] + _ = x[actTransformListLabel-107] + _ = x[actTransformNth-108] + _ = x[actTransformPointer-109] + _ = x[actTransformPreviewLabel-110] + _ = x[actTransformPrompt-111] + _ = x[actTransformQuery-112] + _ = x[actTransformSearch-113] + _ = x[actTrigger-114] + _ = x[actBgTransform-115] + _ = x[actBgTransformBorderLabel-116] + _ = x[actBgTransformGhost-117] + _ = x[actBgTransformHeader-118] + _ = x[actBgTransformFooter-119] + _ = x[actBgTransformHeaderLabel-120] + _ = x[actBgTransformFooterLabel-121] + _ = x[actBgTransformInputLabel-122] + _ = x[actBgTransformListLabel-123] + _ = x[actBgTransformNth-124] + _ = x[actBgTransformPointer-125] + _ = x[actBgTransformPreviewLabel-126] + _ = x[actBgTransformPrompt-127] + _ = x[actBgTransformQuery-128] + _ = x[actBgTransformSearch-129] + _ = x[actBgCancel-130] + _ = x[actSearch-131] + _ = x[actPreview-132] + _ = x[actPreviewTop-133] + _ = x[actPreviewBottom-134] + _ = x[actPreviewUp-135] + _ = x[actPreviewDown-136] + _ = x[actPreviewPageUp-137] + _ = x[actPreviewPageDown-138] + _ = x[actPreviewHalfPageUp-139] + _ = x[actPreviewHalfPageDown-140] + _ = x[actPrevHistory-141] + _ = x[actPrevSelected-142] + _ = x[actPrint-143] + _ = x[actPut-144] + _ = x[actNextHistory-145] + _ = x[actNextSelected-146] + _ = x[actExecute-147] + _ = x[actExecuteSilent-148] + _ = x[actExecuteMulti-149] + _ = x[actSigStop-150] + _ = x[actFirst-151] + _ = x[actLast-152] + _ = x[actReload-153] + _ = x[actReloadSync-154] + _ = x[actDisableSearch-155] + _ = x[actEnableSearch-156] + _ = x[actSelect-157] + _ = x[actDeselect-158] + _ = x[actUnbind-159] + _ = x[actRebind-160] + _ = x[actToggleBind-161] + _ = x[actBecome-162] + _ = x[actShowHeader-163] + _ = x[actHideHeader-164] + _ = x[actBell-165] + _ = x[actExclude-166] + _ = x[actExcludeMulti-167] + _ = x[actAsync-168] } -const _actionType_name = "actIgnoreactStartactClickactInvalidactBracketedPasteBeginactBracketedPasteEndactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactBackwardSubWordactCancelactChangeBorderLabelactChangeGhostactChangeHeaderactChangeFooteractChangeHeaderLabelactChangeFooterLabelactChangeInputLabelactChangeListLabelactChangeMultiactChangeNthactChangePointeractChangePreviewactChangePreviewLabelactChangePreviewWindowactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactForwardSubWordactKillLineactKillWordactKillSubWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactBackwardKillSubWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactToggleRawactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactDownMatchactUpactUpMatchactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformGhostactTransformHeaderactTransformFooteractTransformHeaderLabelactTransformFooterLabelactTransformInputLabelactTransformListLabelactTransformNthactTransformPointeractTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactTriggeractBgTransformactBgTransformBorderLabelactBgTransformGhostactBgTransformHeaderactBgTransformFooteractBgTransformHeaderLabelactBgTransformFooterLabelactBgTransformInputLabelactBgTransformListLabelactBgTransformNthactBgTransformPointeractBgTransformPreviewLabelactBgTransformPromptactBgTransformQueryactBgTransformSearchactBgCancelactSearchactPreviewactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMultiactAsync" +const _actionType_name = "actIgnoreactStartactClickactInvalidactBracketedPasteBeginactBracketedPasteEndactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactBackwardSubWordactCancelactChangeBorderLabelactChangeGhostactChangeHeaderactChangeFooteractChangeHeaderLabelactChangeFooterLabelactChangeInputLabelactChangeListLabelactChangeMultiactChangeNthactChangePointeractChangePreviewactChangePreviewLabelactChangePreviewWindowactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactForwardSubWordactKillLineactKillWordactKillSubWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactBackwardKillSubWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactToggleRawactEnableRawactDisableRawactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactDownMatchactUpactUpMatchactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformGhostactTransformHeaderactTransformFooteractTransformHeaderLabelactTransformFooterLabelactTransformInputLabelactTransformListLabelactTransformNthactTransformPointeractTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactTriggeractBgTransformactBgTransformBorderLabelactBgTransformGhostactBgTransformHeaderactBgTransformFooteractBgTransformHeaderLabelactBgTransformFooterLabelactBgTransformInputLabelactBgTransformListLabelactBgTransformNthactBgTransformPointeractBgTransformPreviewLabelactBgTransformPromptactBgTransformQueryactBgTransformSearchactBgCancelactSearchactPreviewactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMultiactAsync" -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, 331, 351, 371, 390, 408, 422, 434, 450, 466, 487, 509, 524, 538, 552, 565, 582, 590, 603, 619, 631, 639, 653, 667, 684, 695, 706, 720, 738, 755, 762, 781, 803, 815, 829, 838, 853, 865, 878, 889, 900, 912, 926, 947, 962, 975, 993, 1009, 1021, 1036, 1050, 1062, 1074, 1091, 1098, 1110, 1115, 1125, 1134, 1145, 1156, 1169, 1184, 1195, 1208, 1223, 1230, 1243, 1256, 1273, 1288, 1301, 1315, 1329, 1345, 1365, 1377, 1400, 1417, 1435, 1453, 1476, 1499, 1521, 1542, 1557, 1576, 1600, 1618, 1635, 1653, 1663, 1677, 1702, 1721, 1741, 1761, 1786, 1811, 1835, 1858, 1875, 1896, 1922, 1942, 1961, 1981, 1992, 2001, 2011, 2024, 2040, 2052, 2066, 2082, 2100, 2120, 2142, 2156, 2171, 2179, 2185, 2199, 2214, 2224, 2240, 2255, 2265, 2273, 2280, 2289, 2302, 2318, 2333, 2342, 2353, 2362, 2371, 2384, 2393, 2406, 2419, 2426, 2436, 2451, 2459} +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, 331, 351, 371, 390, 408, 422, 434, 450, 466, 487, 509, 524, 538, 552, 565, 582, 590, 603, 619, 631, 639, 653, 667, 684, 695, 706, 720, 738, 755, 762, 781, 803, 815, 829, 838, 853, 865, 878, 889, 900, 912, 926, 947, 962, 975, 993, 1009, 1021, 1033, 1046, 1061, 1075, 1087, 1099, 1116, 1123, 1135, 1140, 1150, 1159, 1170, 1181, 1194, 1209, 1220, 1233, 1248, 1255, 1268, 1281, 1298, 1313, 1326, 1340, 1354, 1370, 1390, 1402, 1425, 1442, 1460, 1478, 1501, 1524, 1546, 1567, 1582, 1601, 1625, 1643, 1660, 1678, 1688, 1702, 1727, 1746, 1766, 1786, 1811, 1836, 1860, 1883, 1900, 1921, 1947, 1967, 1986, 2006, 2017, 2026, 2036, 2049, 2065, 2077, 2091, 2107, 2125, 2145, 2167, 2181, 2196, 2204, 2210, 2224, 2239, 2249, 2265, 2280, 2290, 2298, 2305, 2314, 2327, 2343, 2358, 2367, 2378, 2387, 2396, 2409, 2418, 2431, 2444, 2451, 2461, 2476, 2484} func (i actionType) String() string { if i < 0 || i >= actionType(len(_actionType_index)-1) { diff --git a/src/options.go b/src/options.go index e7f693b6..7ed6c77d 100644 --- a/src/options.go +++ b/src/options.go @@ -1750,6 +1750,10 @@ func parseActionList(masked string, original string, prevActions []*action, putA appendAction(actToggleHscroll) case "toggle-raw": appendAction(actToggleRaw) + case "enable-raw": + appendAction(actEnableRaw) + case "disable-raw": + appendAction(actDisableRaw) case "show-header": appendAction(actShowHeader) case "hide-header": diff --git a/src/terminal.go b/src/terminal.go index 8508efe2..4cba4ada 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -577,6 +577,8 @@ const ( actToggleMultiLine actToggleHscroll actToggleRaw + actEnableRaw + actDisableRaw actTrackCurrent actToggleInput actHideInput @@ -6106,8 +6108,19 @@ func (t *Terminal) Loop() error { t.vmove(dir, true) } req(reqList) - case actToggleRaw: - t.raw = !t.raw + case actToggleRaw, actEnableRaw, actDisableRaw: + prevRaw := t.raw + switch a.t { + case actEnableRaw: + t.raw = true + case actDisableRaw: + t.raw = false + case actToggleRaw: + t.raw = !t.raw + } + if prevRaw == t.raw { + break + } prevPos := t.cy - t.offset prevIndex := t.currentIndex() if t.raw { diff --git a/test/test_raw.rb b/test/test_raw.rb index 4e3c36ea..139b1950 100644 --- a/test/test_raw.rb +++ b/test/test_raw.rb @@ -5,7 +5,7 @@ require_relative 'lib/common' # Testing raw mode class TestRaw < TestInteractive def test_raw_mode - tmux.send_keys %(seq 1000 | #{FZF} --raw --bind ctrl-x:toggle-raw --gutter '▌' --multi), :Enter + tmux.send_keys %(seq 1000 | #{FZF} --raw --bind ctrl-x:toggle-raw,a:enable-raw,b:disable-raw --gutter '▌' --multi), :Enter tmux.until { assert_equal 1000, it.match_count } tmux.send_keys 1 @@ -56,5 +56,19 @@ class TestRaw < TestInteractive assert_includes it, '▌ 110' assert_includes it, '>>11' end + + tmux.send_keys 'a' + tmux.until do + assert_equal 1, it.select_count + assert_includes it, '>>11' + assert_includes it, '▖ 10' + end + + tmux.send_keys 'b' + tmux.until do + assert_equal 1, it.select_count + assert_includes it, '▌ 110' + assert_includes it, '>>11' + end end end