diff --git a/CHANGELOG.md b/CHANGELOG.md index 149574d1..099fc6b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG # Display "Type to search" when the input is empty fzf --ghost "Type to search" ``` +- Bug fixes and improvements 0.60.3 ------ diff --git a/src/actiontype_string.go b/src/actiontype_string.go index 46b63c59..ce388e38 100644 --- a/src/actiontype_string.go +++ b/src/actiontype_string.go @@ -12,139 +12,141 @@ func _() { _ = x[actStart-1] _ = x[actClick-2] _ = x[actInvalid-3] - _ = x[actChar-4] - _ = x[actMouse-5] - _ = x[actBeginningOfLine-6] - _ = x[actAbort-7] - _ = x[actAccept-8] - _ = x[actAcceptNonEmpty-9] - _ = x[actAcceptOrPrintQuery-10] - _ = x[actBackwardChar-11] - _ = x[actBackwardDeleteChar-12] - _ = x[actBackwardDeleteCharEof-13] - _ = x[actBackwardWord-14] - _ = x[actCancel-15] - _ = x[actChangeBorderLabel-16] - _ = x[actChangeListLabel-17] - _ = x[actChangeInputLabel-18] - _ = x[actChangeHeader-19] - _ = x[actChangeHeaderLabel-20] - _ = x[actChangeMulti-21] - _ = x[actChangePreviewLabel-22] - _ = x[actChangePrompt-23] - _ = x[actChangeQuery-24] - _ = x[actChangeNth-25] - _ = x[actClearScreen-26] - _ = x[actClearQuery-27] - _ = x[actClearSelection-28] - _ = x[actClose-29] - _ = x[actDeleteChar-30] - _ = x[actDeleteCharEof-31] - _ = x[actEndOfLine-32] - _ = x[actFatal-33] - _ = x[actForwardChar-34] - _ = x[actForwardWord-35] - _ = x[actKillLine-36] - _ = x[actKillWord-37] - _ = x[actUnixLineDiscard-38] - _ = x[actUnixWordRubout-39] - _ = x[actYank-40] - _ = x[actBackwardKillWord-41] - _ = x[actSelectAll-42] - _ = x[actDeselectAll-43] - _ = x[actToggle-44] - _ = x[actToggleSearch-45] - _ = x[actToggleAll-46] - _ = x[actToggleDown-47] - _ = x[actToggleUp-48] - _ = x[actToggleIn-49] - _ = x[actToggleOut-50] - _ = x[actToggleTrack-51] - _ = x[actToggleTrackCurrent-52] - _ = x[actToggleHeader-53] - _ = x[actToggleWrap-54] - _ = x[actToggleMultiLine-55] - _ = x[actToggleHscroll-56] - _ = x[actTrackCurrent-57] - _ = 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] - _ = x[actExclude-130] - _ = x[actExcludeMulti-131] + _ = x[actBracketedPasteBegin-4] + _ = x[actBracketedPasteEnd-5] + _ = x[actChar-6] + _ = x[actMouse-7] + _ = x[actBeginningOfLine-8] + _ = x[actAbort-9] + _ = x[actAccept-10] + _ = x[actAcceptNonEmpty-11] + _ = x[actAcceptOrPrintQuery-12] + _ = x[actBackwardChar-13] + _ = x[actBackwardDeleteChar-14] + _ = x[actBackwardDeleteCharEof-15] + _ = x[actBackwardWord-16] + _ = x[actCancel-17] + _ = x[actChangeBorderLabel-18] + _ = x[actChangeListLabel-19] + _ = x[actChangeInputLabel-20] + _ = x[actChangeHeader-21] + _ = x[actChangeHeaderLabel-22] + _ = x[actChangeMulti-23] + _ = x[actChangePreviewLabel-24] + _ = x[actChangePrompt-25] + _ = x[actChangeQuery-26] + _ = x[actChangeNth-27] + _ = x[actClearScreen-28] + _ = x[actClearQuery-29] + _ = x[actClearSelection-30] + _ = x[actClose-31] + _ = x[actDeleteChar-32] + _ = x[actDeleteCharEof-33] + _ = x[actEndOfLine-34] + _ = x[actFatal-35] + _ = x[actForwardChar-36] + _ = x[actForwardWord-37] + _ = x[actKillLine-38] + _ = x[actKillWord-39] + _ = x[actUnixLineDiscard-40] + _ = x[actUnixWordRubout-41] + _ = x[actYank-42] + _ = x[actBackwardKillWord-43] + _ = x[actSelectAll-44] + _ = x[actDeselectAll-45] + _ = x[actToggle-46] + _ = x[actToggleSearch-47] + _ = x[actToggleAll-48] + _ = x[actToggleDown-49] + _ = x[actToggleUp-50] + _ = x[actToggleIn-51] + _ = x[actToggleOut-52] + _ = x[actToggleTrack-53] + _ = x[actToggleTrackCurrent-54] + _ = x[actToggleHeader-55] + _ = x[actToggleWrap-56] + _ = x[actToggleMultiLine-57] + _ = x[actToggleHscroll-58] + _ = x[actTrackCurrent-59] + _ = x[actToggleInput-60] + _ = x[actHideInput-61] + _ = x[actShowInput-62] + _ = x[actUntrackCurrent-63] + _ = x[actDown-64] + _ = x[actUp-65] + _ = x[actPageUp-66] + _ = x[actPageDown-67] + _ = x[actPosition-68] + _ = x[actHalfPageUp-69] + _ = x[actHalfPageDown-70] + _ = x[actOffsetUp-71] + _ = x[actOffsetDown-72] + _ = x[actOffsetMiddle-73] + _ = x[actJump-74] + _ = x[actJumpAccept-75] + _ = x[actPrintQuery-76] + _ = x[actRefreshPreview-77] + _ = x[actReplaceQuery-78] + _ = x[actToggleSort-79] + _ = x[actShowPreview-80] + _ = x[actHidePreview-81] + _ = x[actTogglePreview-82] + _ = x[actTogglePreviewWrap-83] + _ = x[actTransform-84] + _ = x[actTransformBorderLabel-85] + _ = x[actTransformListLabel-86] + _ = x[actTransformInputLabel-87] + _ = x[actTransformHeader-88] + _ = x[actTransformHeaderLabel-89] + _ = x[actTransformNth-90] + _ = x[actTransformPreviewLabel-91] + _ = x[actTransformPrompt-92] + _ = x[actTransformQuery-93] + _ = x[actTransformSearch-94] + _ = x[actSearch-95] + _ = x[actPreview-96] + _ = x[actChangePreview-97] + _ = x[actChangePreviewWindow-98] + _ = x[actPreviewTop-99] + _ = x[actPreviewBottom-100] + _ = x[actPreviewUp-101] + _ = x[actPreviewDown-102] + _ = x[actPreviewPageUp-103] + _ = x[actPreviewPageDown-104] + _ = x[actPreviewHalfPageUp-105] + _ = x[actPreviewHalfPageDown-106] + _ = x[actPrevHistory-107] + _ = x[actPrevSelected-108] + _ = x[actPrint-109] + _ = x[actPut-110] + _ = x[actNextHistory-111] + _ = x[actNextSelected-112] + _ = x[actExecute-113] + _ = x[actExecuteSilent-114] + _ = x[actExecuteMulti-115] + _ = x[actSigStop-116] + _ = x[actFirst-117] + _ = x[actLast-118] + _ = x[actReload-119] + _ = x[actReloadSync-120] + _ = x[actDisableSearch-121] + _ = x[actEnableSearch-122] + _ = x[actSelect-123] + _ = x[actDeselect-124] + _ = x[actUnbind-125] + _ = x[actRebind-126] + _ = x[actToggleBind-127] + _ = x[actBecome-128] + _ = x[actShowHeader-129] + _ = x[actHideHeader-130] + _ = x[actBell-131] + _ = x[actExclude-132] + _ = x[actExcludeMulti-133] } -const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeListLabelactChangeInputLabelactChangeHeaderactChangeHeaderLabelactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactChangeNthactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformListLabelactTransformInputLabelactTransformHeaderactTransformHeaderLabelactTransformNthactTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactSearchactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMulti" +const _actionType_name = "actIgnoreactStartactClickactInvalidactBracketedPasteBeginactBracketedPasteEndactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeListLabelactChangeInputLabelactChangeHeaderactChangeHeaderLabelactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactChangeNthactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactToggleInputactHideInputactShowInputactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformListLabelactTransformInputLabelactTransformHeaderactTransformHeaderLabelactTransformNthactTransformPreviewLabelactTransformPromptactTransformQueryactTransformSearchactSearchactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactToggleBindactBecomeactShowHeaderactHideHeaderactBellactExcludeactExcludeMulti" -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, 1808, 1823} +var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 57, 77, 84, 92, 110, 118, 127, 144, 165, 180, 201, 225, 240, 249, 269, 287, 306, 321, 341, 355, 376, 391, 405, 417, 431, 444, 461, 469, 482, 498, 510, 518, 532, 546, 557, 568, 586, 603, 610, 629, 641, 655, 664, 679, 691, 704, 715, 726, 738, 752, 773, 788, 801, 819, 835, 850, 864, 876, 888, 905, 912, 917, 926, 937, 948, 961, 976, 987, 1000, 1015, 1022, 1035, 1048, 1065, 1080, 1093, 1107, 1121, 1137, 1157, 1169, 1192, 1213, 1235, 1253, 1276, 1291, 1315, 1333, 1350, 1368, 1377, 1387, 1403, 1425, 1438, 1454, 1466, 1480, 1496, 1514, 1534, 1556, 1570, 1585, 1593, 1599, 1613, 1628, 1638, 1654, 1669, 1679, 1687, 1694, 1703, 1716, 1732, 1747, 1756, 1767, 1776, 1785, 1798, 1807, 1820, 1833, 1840, 1850, 1865} func (i actionType) String() string { if i < 0 || i >= actionType(len(_actionType_index)-1) { diff --git a/src/terminal.go b/src/terminal.go index 923c6005..d892a340 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -279,6 +279,7 @@ type Terminal struct { yanked []rune input []rune inputOverride *[]rune + pasting *[]rune multi int multiLine bool sort bool @@ -459,6 +460,8 @@ const ( actStart actClick actInvalid + actBracketedPasteBegin + actBracketedPasteEnd actChar actMouse actBeginningOfLine @@ -668,6 +671,8 @@ func defaultKeymap() map[tui.Event][]*action { add(tui.Fatal, actFatal) add(tui.Invalid, actInvalid) + add(tui.BracketedPasteBegin, actBracketedPasteBegin) + add(tui.BracketedPasteEnd, actBracketedPasteEnd) add(tui.CtrlA, actBeginningOfLine) add(tui.CtrlB, actBackwardChar) add(tui.CtrlC, actAbort) @@ -4977,6 +4982,14 @@ func (t *Terminal) Loop() error { case actInvalid: t.mutex.Unlock() return false + case actBracketedPasteBegin: + current := []rune(t.input) + t.pasting = ¤t + case actBracketedPasteEnd: + if t.pasting != nil { + queryChanged = string(t.input) != string(*t.pasting) + t.pasting = nil + } case actTogglePreview, actShowPreview, actHidePreview: var act bool switch a.t { @@ -6036,7 +6049,7 @@ func (t *Terminal) Loop() error { } else { t.truncateQuery() } - queryChanged = string(previousInput) != string(t.input) + queryChanged = queryChanged || t.pasting == nil && string(previousInput) != string(t.input) if queryChanged { t.inputOverride = nil } diff --git a/src/tui/eventtype_string.go b/src/tui/eventtype_string.go index df57ccc1..a37d123e 100644 --- a/src/tui/eventtype_string.go +++ b/src/tui/eventtype_string.go @@ -84,35 +84,37 @@ func _() { _ = x[CtrlAlt-73] _ = x[Invalid-74] _ = x[Fatal-75] - _ = x[Mouse-76] - _ = x[DoubleClick-77] - _ = x[LeftClick-78] - _ = x[RightClick-79] - _ = x[SLeftClick-80] - _ = x[SRightClick-81] - _ = x[ScrollUp-82] - _ = x[ScrollDown-83] - _ = x[SScrollUp-84] - _ = x[SScrollDown-85] - _ = x[PreviewScrollUp-86] - _ = x[PreviewScrollDown-87] - _ = x[Resize-88] - _ = x[Change-89] - _ = x[BackwardEOF-90] - _ = x[Start-91] - _ = x[Load-92] - _ = x[Focus-93] - _ = x[One-94] - _ = x[Zero-95] - _ = x[Result-96] - _ = x[Jump-97] - _ = x[JumpCancel-98] - _ = x[ClickHeader-99] + _ = x[BracketedPasteBegin-76] + _ = x[BracketedPasteEnd-77] + _ = x[Mouse-78] + _ = x[DoubleClick-79] + _ = x[LeftClick-80] + _ = x[RightClick-81] + _ = x[SLeftClick-82] + _ = x[SRightClick-83] + _ = x[ScrollUp-84] + _ = x[ScrollDown-85] + _ = x[SScrollUp-86] + _ = x[SScrollDown-87] + _ = x[PreviewScrollUp-88] + _ = x[PreviewScrollDown-89] + _ = x[Resize-90] + _ = x[Change-91] + _ = x[BackwardEOF-92] + _ = x[Start-93] + _ = x[Load-94] + _ = x[Focus-95] + _ = x[One-96] + _ = x[Zero-97] + _ = x[Result-98] + _ = x[Jump-99] + _ = x[JumpCancel-100] + _ = x[ClickHeader-101] } -const _EventType_name = "RuneCtrlACtrlBCtrlCCtrlDCtrlECtrlFCtrlGCtrlHTabCtrlJCtrlKCtrlLEnterCtrlNCtrlOCtrlPCtrlQCtrlRCtrlSCtrlTCtrlUCtrlVCtrlWCtrlXCtrlYCtrlZEscCtrlSpaceCtrlDeleteCtrlBackSlashCtrlRightBracketCtrlCaretCtrlSlashShiftTabBackspaceDeletePageUpPageDownUpDownLeftRightHomeEndInsertShiftUpShiftDownShiftLeftShiftRightShiftDeleteF1F2F3F4F5F6F7F8F9F10F11F12AltBackspaceAltUpAltDownAltLeftAltRightAltShiftUpAltShiftDownAltShiftLeftAltShiftRightAltCtrlAltInvalidFatalMouseDoubleClickLeftClickRightClickSLeftClickSRightClickScrollUpScrollDownSScrollUpSScrollDownPreviewScrollUpPreviewScrollDownResizeChangeBackwardEOFStartLoadFocusOneZeroResultJumpJumpCancelClickHeader" +const _EventType_name = "RuneCtrlACtrlBCtrlCCtrlDCtrlECtrlFCtrlGCtrlHTabCtrlJCtrlKCtrlLEnterCtrlNCtrlOCtrlPCtrlQCtrlRCtrlSCtrlTCtrlUCtrlVCtrlWCtrlXCtrlYCtrlZEscCtrlSpaceCtrlDeleteCtrlBackSlashCtrlRightBracketCtrlCaretCtrlSlashShiftTabBackspaceDeletePageUpPageDownUpDownLeftRightHomeEndInsertShiftUpShiftDownShiftLeftShiftRightShiftDeleteF1F2F3F4F5F6F7F8F9F10F11F12AltBackspaceAltUpAltDownAltLeftAltRightAltShiftUpAltShiftDownAltShiftLeftAltShiftRightAltCtrlAltInvalidFatalBracketedPasteBeginBracketedPasteEndMouseDoubleClickLeftClickRightClickSLeftClickSRightClickScrollUpScrollDownSScrollUpSScrollDownPreviewScrollUpPreviewScrollDownResizeChangeBackwardEOFStartLoadFocusOneZeroResultJumpJumpCancelClickHeader" -var _EventType_index = [...]uint16{0, 4, 9, 14, 19, 24, 29, 34, 39, 44, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 102, 107, 112, 117, 122, 127, 132, 135, 144, 154, 167, 183, 192, 201, 209, 218, 224, 230, 238, 240, 244, 248, 253, 257, 260, 266, 273, 282, 291, 301, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 333, 336, 339, 351, 356, 363, 370, 378, 388, 400, 412, 425, 428, 435, 442, 447, 452, 463, 472, 482, 492, 503, 511, 521, 530, 541, 556, 573, 579, 585, 596, 601, 605, 610, 613, 617, 623, 627, 637, 648} +var _EventType_index = [...]uint16{0, 4, 9, 14, 19, 24, 29, 34, 39, 44, 47, 52, 57, 62, 67, 72, 77, 82, 87, 92, 97, 102, 107, 112, 117, 122, 127, 132, 135, 144, 154, 167, 183, 192, 201, 209, 218, 224, 230, 238, 240, 244, 248, 253, 257, 260, 266, 273, 282, 291, 301, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 333, 336, 339, 351, 356, 363, 370, 378, 388, 400, 412, 425, 428, 435, 442, 447, 466, 483, 488, 499, 508, 518, 528, 539, 547, 557, 566, 577, 592, 609, 615, 621, 632, 637, 641, 646, 649, 653, 659, 663, 673, 684} func (i EventType) String() string { if i < 0 || i >= EventType(len(_EventType_index)-1) { diff --git a/src/tui/light.go b/src/tui/light.go index 3b940646..805bee80 100644 --- a/src/tui/light.go +++ b/src/tui/light.go @@ -214,6 +214,7 @@ func (r *LightRenderer) Init() error { } r.enableMouse() + r.csi("?2004h") // Enable bracketed paste mode r.csi(fmt.Sprintf("%dA", r.MaxY()-1)) r.csi("G") r.csi("K") @@ -462,10 +463,11 @@ func (r *LightRenderer) escSequence(sz *int) Event { } // Bracketed paste mode: \e[200~ ... \e[201~ if len(r.buffer) > 5 && r.buffer[3] == '0' && (r.buffer[4] == '0' || r.buffer[4] == '1') && r.buffer[5] == '~' { - // Immediately discard the sequence from the buffer and reread input - r.buffer = r.buffer[6:] - *sz = 0 - return r.GetChar() + *sz = 6 + if r.buffer[4] == '0' { + return Event{BracketedPasteBegin, 0, nil} + } + return Event{BracketedPasteEnd, 0, nil} } return Event{Invalid, 0, nil} // INS case '3': diff --git a/src/tui/tcell.go b/src/tui/tcell.go index dffd235f..a2630463 100644 --- a/src/tui/tcell.go +++ b/src/tui/tcell.go @@ -197,6 +197,7 @@ func (r *FullscreenRenderer) initScreen() error { if e = s.Init(); e != nil { return e } + s.EnablePaste() if r.mouse { s.EnableMouse() } else { @@ -266,6 +267,11 @@ func (r *FullscreenRenderer) Size() TermSize { func (r *FullscreenRenderer) GetChar() Event { ev := _screen.PollEvent() switch ev := ev.(type) { + case *tcell.EventPaste: + if ev.Start() { + return Event{BracketedPasteBegin, 0, nil} + } + return Event{BracketedPasteEnd, 0, nil} case *tcell.EventResize: // Ignore the first resize event // https://github.com/gdamore/tcell/blob/v2.7.0/TUTORIAL.md?plain=1#L18 diff --git a/src/tui/tui.go b/src/tui/tui.go index 4f2fe2c6..e181deaa 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -103,6 +103,8 @@ const ( Invalid Fatal + BracketedPasteBegin + BracketedPasteEnd Mouse DoubleClick