summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2025-02-01 11:16:16 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2025-02-01 17:03:59 +0900
commite84afe196a85f677aef272677a346082f88bdfb6 (patch)
treeeb2c2e349321ad3cedf51fb69dba80f28c074da2 /src
parente1e171a3c458b8bc7dc347cbbd89be30f490ffb8 (diff)
downloadfzf-e84afe196a85f677aef272677a346082f88bdfb6.tar.gz
Add {show,hide,toggle}-input and expose $FZF_INPUT_STATE
Diffstat (limited to 'src')
-rw-r--r--src/actiontype_string.go145
-rw-r--r--src/options.go6
-rw-r--r--src/terminal.go64
-rw-r--r--src/tui/dummy.go1
-rw-r--r--src/tui/light.go6
-rw-r--r--src/tui/tcell.go4
-rw-r--r--src/tui/tui.go1
7 files changed, 147 insertions, 80 deletions
diff --git a/src/actiontype_string.go b/src/actiontype_string.go
index 123c0651..e178670f 100644
--- a/src/actiontype_string.go
+++ b/src/actiontype_string.go
@@ -66,80 +66,83 @@ func _() {
_ = x[actToggleMultiLine-55]
_ = x[actToggleHscroll-56]
_ = x[actTrackCurrent-57]
- _ = x[actUntrackCurrent-58]
- _ = x[actDown-59]
- _ = x[actUp-60]
- _ = x[actPageUp-61]
- _ = x[actPageDown-62]
- _ = x[actPosition-63]
- _ = x[actHalfPageUp-64]
- _ = x[actHalfPageDown-65]
- _ = x[actOffsetUp-66]
- _ = x[actOffsetDown-67]
- _ = x[actOffsetMiddle-68]
- _ = x[actJump-69]
- _ = x[actJumpAccept-70]
- _ = x[actPrintQuery-71]
- _ = x[actRefreshPreview-72]
- _ = x[actReplaceQuery-73]
- _ = x[actToggleSort-74]
- _ = x[actShowPreview-75]
- _ = x[actHidePreview-76]
- _ = x[actTogglePreview-77]
- _ = x[actTogglePreviewWrap-78]
- _ = x[actTransform-79]
- _ = x[actTransformBorderLabel-80]
- _ = x[actTransformListLabel-81]
- _ = x[actTransformInputLabel-82]
- _ = x[actTransformHeader-83]
- _ = x[actTransformHeaderLabel-84]
- _ = x[actTransformNth-85]
- _ = x[actTransformPreviewLabel-86]
- _ = x[actTransformPrompt-87]
- _ = x[actTransformQuery-88]
- _ = x[actTransformSearch-89]
- _ = x[actSearch-90]
- _ = x[actPreview-91]
- _ = x[actChangePreview-92]
- _ = x[actChangePreviewWindow-93]
- _ = x[actPreviewTop-94]
- _ = x[actPreviewBottom-95]
- _ = x[actPreviewUp-96]
- _ = x[actPreviewDown-97]
- _ = x[actPreviewPageUp-98]
- _ = x[actPreviewPageDown-99]
- _ = x[actPreviewHalfPageUp-100]
- _ = x[actPreviewHalfPageDown-101]
- _ = x[actPrevHistory-102]
- _ = x[actPrevSelected-103]
- _ = x[actPrint-104]
- _ = x[actPut-105]
- _ = x[actNextHistory-106]
- _ = x[actNextSelected-107]
- _ = x[actExecute-108]
- _ = x[actExecuteSilent-109]
- _ = x[actExecuteMulti-110]
- _ = x[actSigStop-111]
- _ = x[actFirst-112]
- _ = x[actLast-113]
- _ = x[actReload-114]
- _ = x[actReloadSync-115]
- _ = x[actDisableSearch-116]
- _ = x[actEnableSearch-117]
- _ = x[actSelect-118]
- _ = x[actDeselect-119]
- _ = x[actUnbind-120]
- _ = x[actRebind-121]
- _ = x[actToggleBind-122]
- _ = x[actBecome-123]
- _ = x[actShowHeader-124]
- _ = x[actHideHeader-125]
- _ = x[actBell-126]
+ _ = x[actToggleInput-58]
+ _ = x[actHideInput-59]
+ _ = x[actShowInput-60]
+ _ = x[actUntrackCurrent-61]
+ _ = x[actDown-62]
+ _ = x[actUp-63]
+ _ = x[actPageUp-64]
+ _ = x[actPageDown-65]
+ _ = x[actPosition-66]
+ _ = x[actHalfPageUp-67]
+ _ = x[actHalfPageDown-68]
+ _ = x[actOffsetUp-69]
+ _ = x[actOffsetDown-70]
+ _ = x[actOffsetMiddle-71]
+ _ = x[actJump-72]
+ _ = x[actJumpAccept-73]
+ _ = x[actPrintQuery-74]
+ _ = x[actRefreshPreview-75]
+ _ = x[actReplaceQuery-76]
+ _ = x[actToggleSort-77]
+ _ = x[actShowPreview-78]
+ _ = x[actHidePreview-79]
+ _ = x[actTogglePreview-80]
+ _ = x[actTogglePreviewWrap-81]
+ _ = x[actTransform-82]
+ _ = x[actTransformBorderLabel-83]
+ _ = x[actTransformListLabel-84]
+ _ = x[actTransformInputLabel-85]
+ _ = x[actTransformHeader-86]
+ _ = x[actTransformHeaderLabel-87]
+ _ = x[actTransformNth-88]
+ _ = x[actTransformPreviewLabel-89]
+ _ = x[actTransformPrompt-90]
+ _ = x[actTransformQuery-91]
+ _ = x[actTransformSearch-92]
+ _ = x[actSearch-93]
+ _ = x[actPreview-94]
+ _ = x[actChangePreview-95]
+ _ = x[actChangePreviewWindow-96]
+ _ = x[actPreviewTop-97]
+ _ = x[actPreviewBottom-98]
+ _ = x[actPreviewUp-99]
+ _ = x[actPreviewDown-100]
+ _ = x[actPreviewPageUp-101]
+ _ = x[actPreviewPageDown-102]
+ _ = x[actPreviewHalfPageUp-103]
+ _ = x[actPreviewHalfPageDown-104]
+ _ = x[actPrevHistory-105]
+ _ = x[actPrevSelected-106]
+ _ = x[actPrint-107]
+ _ = x[actPut-108]
+ _ = x[actNextHistory-109]
+ _ = x[actNextSelected-110]
+ _ = x[actExecute-111]
+ _ = x[actExecuteSilent-112]
+ _ = x[actExecuteMulti-113]
+ _ = x[actSigStop-114]
+ _ = x[actFirst-115]
+ _ = x[actLast-116]
+ _ = x[actReload-117]
+ _ = x[actReloadSync-118]
+ _ = x[actDisableSearch-119]
+ _ = x[actEnableSearch-120]
+ _ = x[actSelect-121]
+ _ = x[actDeselect-122]
+ _ = x[actUnbind-123]
+ _ = x[actRebind-124]
+ _ = x[actToggleBind-125]
+ _ = x[actBecome-126]
+ _ = x[actShowHeader-127]
+ _ = x[actHideHeader-128]
+ _ = x[actBell-129]
}
-const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeListLabelactChangeInputLabelactChangeHeaderactChangeHeaderLabelactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactChangeNthactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformListLabelactTransformInputLabelactTransformHeaderactTransformHeaderLabelactTransformNthactTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactSearchactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBell"
+const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeListLabelactChangeInputLabelactChangeHeaderactChangeHeaderLabelactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactChangeNthactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformListLabelactTransformInputLabelactTransformHeaderactTransformHeaderLabelactTransformNthactTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactSearchactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBell"
-var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 42, 50, 68, 76, 85, 102, 123, 138, 159, 183, 198, 207, 227, 245, 264, 279, 299, 313, 334, 349, 363, 375, 389, 402, 419, 427, 440, 456, 468, 476, 490, 504, 515, 526, 544, 561, 568, 587, 599, 613, 622, 637, 649, 662, 673, 684, 696, 710, 731, 746, 759, 777, 793, 808, 825, 832, 837, 846, 857, 868, 881, 896, 907, 920, 935, 942, 955, 968, 985, 1000, 1013, 1027, 1041, 1057, 1077, 1089, 1112, 1133, 1155, 1173, 1196, 1211, 1235, 1253, 1270, 1288, 1297, 1307, 1323, 1345, 1358, 1374, 1386, 1400, 1416, 1434, 1454, 1476, 1490, 1505, 1513, 1519, 1533, 1548, 1558, 1574, 1589, 1599, 1607, 1614, 1623, 1636, 1652, 1667, 1676, 1687, 1696, 1705, 1718, 1727, 1740, 1753, 1760}
+var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 42, 50, 68, 76, 85, 102, 123, 138, 159, 183, 198, 207, 227, 245, 264, 279, 299, 313, 334, 349, 363, 375, 389, 402, 419, 427, 440, 456, 468, 476, 490, 504, 515, 526, 544, 561, 568, 587, 599, 613, 622, 637, 649, 662, 673, 684, 696, 710, 731, 746, 759, 777, 793, 808, 822, 834, 846, 863, 870, 875, 884, 895, 906, 919, 934, 945, 958, 973, 980, 993, 1006, 1023, 1038, 1051, 1065, 1079, 1095, 1115, 1127, 1150, 1171, 1193, 1211, 1234, 1249, 1273, 1291, 1308, 1326, 1335, 1345, 1361, 1383, 1396, 1412, 1424, 1438, 1454, 1472, 1492, 1514, 1528, 1543, 1551, 1557, 1571, 1586, 1596, 1612, 1627, 1637, 1645, 1652, 1661, 1674, 1690, 1705, 1714, 1725, 1734, 1743, 1756, 1765, 1778, 1791, 1798}
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 a22916e3..b7eed83c 100644
--- a/src/options.go
+++ b/src/options.go
@@ -1500,6 +1500,12 @@ func parseActionList(masked string, original string, prevActions []*action, putA
appendAction(actToggleTrack)
case "toggle-track-current":
appendAction(actToggleTrackCurrent)
+ case "toggle-input":
+ appendAction(actToggleInput)
+ case "hide-input":
+ appendAction(actHideInput)
+ case "show-input":
+ appendAction(actShowInput)
case "toggle-header":
appendAction(actToggleHeader)
case "toggle-wrap":
diff --git a/src/terminal.go b/src/terminal.go
index d6e7eadc..1a738da9 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -505,6 +505,9 @@ const (
actToggleMultiLine
actToggleHscroll
actTrackCurrent
+ actToggleInput
+ actHideInput
+ actShowInput
actUntrackCurrent
actDown
actUp
@@ -1064,6 +1067,13 @@ func (t *Terminal) environImpl(forPreview bool) []string {
if len(t.nthCurrent) > 0 {
env = append(env, "FZF_NTH="+RangesToString(t.nthCurrent))
}
+ inputState := "enabled"
+ if t.inputless {
+ inputState = "hidden"
+ } else if t.paused {
+ inputState = "disabled"
+ }
+ env = append(env, "FZF_INPUT_STATE="+inputState)
env = append(env, fmt.Sprintf("FZF_TOTAL_COUNT=%d", t.count))
env = append(env, fmt.Sprintf("FZF_MATCH_COUNT=%d", t.merger.Length()))
env = append(env, fmt.Sprintf("FZF_SELECT_COUNT=%d", len(t.selected)))
@@ -2492,22 +2502,29 @@ func (t *Terminal) printInfoImpl() {
}
}
-func (t *Terminal) printHeader() {
+func (t *Terminal) resizeIfNeeded() bool {
+ // Check if input border is used and input has changed
+ if t.inputBorderShape.Visible() && t.inputWindow == nil && !t.inputless {
+ t.printAll()
+ return true
+ }
+
+ // Check if the header borders are used and header has changed
allHeaderLines := t.visibleHeaderLines()
primaryHeaderLines := allHeaderLines
if t.headerLinesShape.Visible() {
primaryHeaderLines -= t.headerLines
}
- // We may need to resize header windows
if (t.headerBorderShape.Visible() || t.headerLinesShape.Visible()) &&
(t.headerWindow == nil && primaryHeaderLines > 0 || t.headerWindow != nil && primaryHeaderLines != t.headerWindow.Height()) ||
t.headerLinesShape.Visible() && (t.headerLinesWindow == nil && t.headerLines > 0 || t.headerLinesWindow != nil && t.headerLines != t.headerLinesWindow.Height()) {
- t.resizeWindows(false, true)
- t.printList()
- t.printPrompt()
- t.printInfo()
- t.printPreview()
+ t.printAll()
+ return true
}
+ return false
+}
+
+func (t *Terminal) printHeader() {
if !t.headerVisible {
return
}
@@ -4498,7 +4515,11 @@ func (t *Terminal) Loop() error {
// U t.uiMutex |
t.uiMutex.Lock()
t.mutex.Lock()
- printInfo := util.RunOnce(t.printInfo)
+ printInfo := util.RunOnce(func() {
+ if !t.resizeIfNeeded() {
+ t.printInfo()
+ }
+ })
for _, key := range keys {
req := util.EventType(key)
value := (*events)[req]
@@ -4540,7 +4561,9 @@ func (t *Terminal) Loop() error {
}
t.printList()
case reqHeader:
- t.printHeader()
+ if !t.resizeIfNeeded() {
+ t.printHeader()
+ }
case reqActivate:
t.suppress = false
if t.hasPreviewer() {
@@ -4796,6 +4819,7 @@ func (t *Terminal) Loop() error {
return true
}
doAction = func(a *action) bool {
+ Action:
switch a.t {
case actIgnore, actStart, actClick:
case actBecome:
@@ -5416,6 +5440,28 @@ func (t *Terminal) Loop() error {
t.forceRerenderList()
t.hscroll = !t.hscroll
req(reqList)
+ case actToggleInput, actShowInput, actHideInput:
+ switch a.t {
+ case actToggleInput:
+ t.inputless = !t.inputless
+ case actShowInput:
+ if !t.inputless {
+ break Action
+ }
+ t.inputless = false
+ case actHideInput:
+ if t.inputless {
+ break Action
+ }
+ t.inputless = true
+ }
+ t.forceRerenderList()
+ if t.inputless {
+ t.tui.HideCursor()
+ } else {
+ t.tui.ShowCursor()
+ }
+ req(reqList, reqInfo, reqPrompt, reqHeader)
case actTrackCurrent:
if t.track == trackDisabled {
t.track = trackCurrent
diff --git a/src/tui/dummy.go b/src/tui/dummy.go
index 8dd58457..cd856233 100644
--- a/src/tui/dummy.go
+++ b/src/tui/dummy.go
@@ -46,6 +46,7 @@ func (r *FullscreenRenderer) NeedScrollbarRedraw() bool { return false
func (r *FullscreenRenderer) ShouldEmitResizeEvent() bool { return false }
func (r *FullscreenRenderer) Bell() {}
func (r *FullscreenRenderer) HideCursor() {}
+func (r *FullscreenRenderer) ShowCursor() {}
func (r *FullscreenRenderer) Refresh() {}
func (r *FullscreenRenderer) Close() {}
func (r *FullscreenRenderer) Size() TermSize { return TermSize{} }
diff --git a/src/tui/light.go b/src/tui/light.go
index 7b40efbb..ab7bd87f 100644
--- a/src/tui/light.go
+++ b/src/tui/light.go
@@ -1228,4 +1228,10 @@ func (w *LightWindow) EraseMaybe() bool {
func (r *LightRenderer) HideCursor() {
r.showCursor = false
+ r.csi("?25l")
+}
+
+func (r *LightRenderer) ShowCursor() {
+ r.showCursor = true
+ r.csi("?25h")
}
diff --git a/src/tui/tcell.go b/src/tui/tcell.go
index 9d6fde80..5f70f54a 100644
--- a/src/tui/tcell.go
+++ b/src/tui/tcell.go
@@ -111,6 +111,10 @@ func (r *FullscreenRenderer) HideCursor() {
r.showCursor = false
}
+func (r *FullscreenRenderer) ShowCursor() {
+ r.showCursor = true
+}
+
func (r *FullscreenRenderer) PassThrough(str string) {
// No-op
// https://github.com/gdamore/tcell/pull/650#issuecomment-1806442846
diff --git a/src/tui/tui.go b/src/tui/tui.go
index 0c778ad6..8423c631 100644
--- a/src/tui/tui.go
+++ b/src/tui/tui.go
@@ -616,6 +616,7 @@ type Renderer interface {
ShouldEmitResizeEvent() bool
Bell()
HideCursor()
+ ShowCursor()
GetChar() Event