m/fzf
1
0
mirror of https://github.com/junegunn/fzf.git synced 2025-11-13 05:43:48 -05:00

Suppress 'change' event during bracketed paste mode

Close #4316
This commit is contained in:
Junegunn Choi
2025-03-22 09:15:26 +09:00
parent 7e4dbb5f3b
commit 29cf28d845
7 changed files with 189 additions and 161 deletions

View File

@@ -8,6 +8,7 @@ CHANGELOG
# Display "Type to search" when the input is empty # Display "Type to search" when the input is empty
fzf --ghost "Type to search" fzf --ghost "Type to search"
``` ```
- Bug fixes and improvements
0.60.3 0.60.3
------ ------

View File

@@ -12,139 +12,141 @@ func _() {
_ = x[actStart-1] _ = x[actStart-1]
_ = x[actClick-2] _ = x[actClick-2]
_ = x[actInvalid-3] _ = x[actInvalid-3]
_ = x[actChar-4] _ = x[actBracketedPasteBegin-4]
_ = x[actMouse-5] _ = x[actBracketedPasteEnd-5]
_ = x[actBeginningOfLine-6] _ = x[actChar-6]
_ = x[actAbort-7] _ = x[actMouse-7]
_ = x[actAccept-8] _ = x[actBeginningOfLine-8]
_ = x[actAcceptNonEmpty-9] _ = x[actAbort-9]
_ = x[actAcceptOrPrintQuery-10] _ = x[actAccept-10]
_ = x[actBackwardChar-11] _ = x[actAcceptNonEmpty-11]
_ = x[actBackwardDeleteChar-12] _ = x[actAcceptOrPrintQuery-12]
_ = x[actBackwardDeleteCharEof-13] _ = x[actBackwardChar-13]
_ = x[actBackwardWord-14] _ = x[actBackwardDeleteChar-14]
_ = x[actCancel-15] _ = x[actBackwardDeleteCharEof-15]
_ = x[actChangeBorderLabel-16] _ = x[actBackwardWord-16]
_ = x[actChangeListLabel-17] _ = x[actCancel-17]
_ = x[actChangeInputLabel-18] _ = x[actChangeBorderLabel-18]
_ = x[actChangeHeader-19] _ = x[actChangeListLabel-19]
_ = x[actChangeHeaderLabel-20] _ = x[actChangeInputLabel-20]
_ = x[actChangeMulti-21] _ = x[actChangeHeader-21]
_ = x[actChangePreviewLabel-22] _ = x[actChangeHeaderLabel-22]
_ = x[actChangePrompt-23] _ = x[actChangeMulti-23]
_ = x[actChangeQuery-24] _ = x[actChangePreviewLabel-24]
_ = x[actChangeNth-25] _ = x[actChangePrompt-25]
_ = x[actClearScreen-26] _ = x[actChangeQuery-26]
_ = x[actClearQuery-27] _ = x[actChangeNth-27]
_ = x[actClearSelection-28] _ = x[actClearScreen-28]
_ = x[actClose-29] _ = x[actClearQuery-29]
_ = x[actDeleteChar-30] _ = x[actClearSelection-30]
_ = x[actDeleteCharEof-31] _ = x[actClose-31]
_ = x[actEndOfLine-32] _ = x[actDeleteChar-32]
_ = x[actFatal-33] _ = x[actDeleteCharEof-33]
_ = x[actForwardChar-34] _ = x[actEndOfLine-34]
_ = x[actForwardWord-35] _ = x[actFatal-35]
_ = x[actKillLine-36] _ = x[actForwardChar-36]
_ = x[actKillWord-37] _ = x[actForwardWord-37]
_ = x[actUnixLineDiscard-38] _ = x[actKillLine-38]
_ = x[actUnixWordRubout-39] _ = x[actKillWord-39]
_ = x[actYank-40] _ = x[actUnixLineDiscard-40]
_ = x[actBackwardKillWord-41] _ = x[actUnixWordRubout-41]
_ = x[actSelectAll-42] _ = x[actYank-42]
_ = x[actDeselectAll-43] _ = x[actBackwardKillWord-43]
_ = x[actToggle-44] _ = x[actSelectAll-44]
_ = x[actToggleSearch-45] _ = x[actDeselectAll-45]
_ = x[actToggleAll-46] _ = x[actToggle-46]
_ = x[actToggleDown-47] _ = x[actToggleSearch-47]
_ = x[actToggleUp-48] _ = x[actToggleAll-48]
_ = x[actToggleIn-49] _ = x[actToggleDown-49]
_ = x[actToggleOut-50] _ = x[actToggleUp-50]
_ = x[actToggleTrack-51] _ = x[actToggleIn-51]
_ = x[actToggleTrackCurrent-52] _ = x[actToggleOut-52]
_ = x[actToggleHeader-53] _ = x[actToggleTrack-53]
_ = x[actToggleWrap-54] _ = x[actToggleTrackCurrent-54]
_ = x[actToggleMultiLine-55] _ = x[actToggleHeader-55]
_ = x[actToggleHscroll-56] _ = x[actToggleWrap-56]
_ = x[actTrackCurrent-57] _ = x[actToggleMultiLine-57]
_ = x[actToggleInput-58] _ = x[actToggleHscroll-58]
_ = x[actHideInput-59] _ = x[actTrackCurrent-59]
_ = x[actShowInput-60] _ = x[actToggleInput-60]
_ = x[actUntrackCurrent-61] _ = x[actHideInput-61]
_ = x[actDown-62] _ = x[actShowInput-62]
_ = x[actUp-63] _ = x[actUntrackCurrent-63]
_ = x[actPageUp-64] _ = x[actDown-64]
_ = x[actPageDown-65] _ = x[actUp-65]
_ = x[actPosition-66] _ = x[actPageUp-66]
_ = x[actHalfPageUp-67] _ = x[actPageDown-67]
_ = x[actHalfPageDown-68] _ = x[actPosition-68]
_ = x[actOffsetUp-69] _ = x[actHalfPageUp-69]
_ = x[actOffsetDown-70] _ = x[actHalfPageDown-70]
_ = x[actOffsetMiddle-71] _ = x[actOffsetUp-71]
_ = x[actJump-72] _ = x[actOffsetDown-72]
_ = x[actJumpAccept-73] _ = x[actOffsetMiddle-73]
_ = x[actPrintQuery-74] _ = x[actJump-74]
_ = x[actRefreshPreview-75] _ = x[actJumpAccept-75]
_ = x[actReplaceQuery-76] _ = x[actPrintQuery-76]
_ = x[actToggleSort-77] _ = x[actRefreshPreview-77]
_ = x[actShowPreview-78] _ = x[actReplaceQuery-78]
_ = x[actHidePreview-79] _ = x[actToggleSort-79]
_ = x[actTogglePreview-80] _ = x[actShowPreview-80]
_ = x[actTogglePreviewWrap-81] _ = x[actHidePreview-81]
_ = x[actTransform-82] _ = x[actTogglePreview-82]
_ = x[actTransformBorderLabel-83] _ = x[actTogglePreviewWrap-83]
_ = x[actTransformListLabel-84] _ = x[actTransform-84]
_ = x[actTransformInputLabel-85] _ = x[actTransformBorderLabel-85]
_ = x[actTransformHeader-86] _ = x[actTransformListLabel-86]
_ = x[actTransformHeaderLabel-87] _ = x[actTransformInputLabel-87]
_ = x[actTransformNth-88] _ = x[actTransformHeader-88]
_ = x[actTransformPreviewLabel-89] _ = x[actTransformHeaderLabel-89]
_ = x[actTransformPrompt-90] _ = x[actTransformNth-90]
_ = x[actTransformQuery-91] _ = x[actTransformPreviewLabel-91]
_ = x[actTransformSearch-92] _ = x[actTransformPrompt-92]
_ = x[actSearch-93] _ = x[actTransformQuery-93]
_ = x[actPreview-94] _ = x[actTransformSearch-94]
_ = x[actChangePreview-95] _ = x[actSearch-95]
_ = x[actChangePreviewWindow-96] _ = x[actPreview-96]
_ = x[actPreviewTop-97] _ = x[actChangePreview-97]
_ = x[actPreviewBottom-98] _ = x[actChangePreviewWindow-98]
_ = x[actPreviewUp-99] _ = x[actPreviewTop-99]
_ = x[actPreviewDown-100] _ = x[actPreviewBottom-100]
_ = x[actPreviewPageUp-101] _ = x[actPreviewUp-101]
_ = x[actPreviewPageDown-102] _ = x[actPreviewDown-102]
_ = x[actPreviewHalfPageUp-103] _ = x[actPreviewPageUp-103]
_ = x[actPreviewHalfPageDown-104] _ = x[actPreviewPageDown-104]
_ = x[actPrevHistory-105] _ = x[actPreviewHalfPageUp-105]
_ = x[actPrevSelected-106] _ = x[actPreviewHalfPageDown-106]
_ = x[actPrint-107] _ = x[actPrevHistory-107]
_ = x[actPut-108] _ = x[actPrevSelected-108]
_ = x[actNextHistory-109] _ = x[actPrint-109]
_ = x[actNextSelected-110] _ = x[actPut-110]
_ = x[actExecute-111] _ = x[actNextHistory-111]
_ = x[actExecuteSilent-112] _ = x[actNextSelected-112]
_ = x[actExecuteMulti-113] _ = x[actExecute-113]
_ = x[actSigStop-114] _ = x[actExecuteSilent-114]
_ = x[actFirst-115] _ = x[actExecuteMulti-115]
_ = x[actLast-116] _ = x[actSigStop-116]
_ = x[actReload-117] _ = x[actFirst-117]
_ = x[actReloadSync-118] _ = x[actLast-118]
_ = x[actDisableSearch-119] _ = x[actReload-119]
_ = x[actEnableSearch-120] _ = x[actReloadSync-120]
_ = x[actSelect-121] _ = x[actDisableSearch-121]
_ = x[actDeselect-122] _ = x[actEnableSearch-122]
_ = x[actUnbind-123] _ = x[actSelect-123]
_ = x[actRebind-124] _ = x[actDeselect-124]
_ = x[actToggleBind-125] _ = x[actUnbind-125]
_ = x[actBecome-126] _ = x[actRebind-126]
_ = x[actShowHeader-127] _ = x[actToggleBind-127]
_ = x[actHideHeader-128] _ = x[actBecome-128]
_ = x[actBell-129] _ = x[actShowHeader-129]
_ = x[actExclude-130] _ = x[actHideHeader-130]
_ = x[actExcludeMulti-131] _ = 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 { func (i actionType) String() string {
if i < 0 || i >= actionType(len(_actionType_index)-1) { if i < 0 || i >= actionType(len(_actionType_index)-1) {

View File

@@ -279,6 +279,7 @@ type Terminal struct {
yanked []rune yanked []rune
input []rune input []rune
inputOverride *[]rune inputOverride *[]rune
pasting *[]rune
multi int multi int
multiLine bool multiLine bool
sort bool sort bool
@@ -459,6 +460,8 @@ const (
actStart actStart
actClick actClick
actInvalid actInvalid
actBracketedPasteBegin
actBracketedPasteEnd
actChar actChar
actMouse actMouse
actBeginningOfLine actBeginningOfLine
@@ -668,6 +671,8 @@ func defaultKeymap() map[tui.Event][]*action {
add(tui.Fatal, actFatal) add(tui.Fatal, actFatal)
add(tui.Invalid, actInvalid) add(tui.Invalid, actInvalid)
add(tui.BracketedPasteBegin, actBracketedPasteBegin)
add(tui.BracketedPasteEnd, actBracketedPasteEnd)
add(tui.CtrlA, actBeginningOfLine) add(tui.CtrlA, actBeginningOfLine)
add(tui.CtrlB, actBackwardChar) add(tui.CtrlB, actBackwardChar)
add(tui.CtrlC, actAbort) add(tui.CtrlC, actAbort)
@@ -4977,6 +4982,14 @@ func (t *Terminal) Loop() error {
case actInvalid: case actInvalid:
t.mutex.Unlock() t.mutex.Unlock()
return false return false
case actBracketedPasteBegin:
current := []rune(t.input)
t.pasting = &current
case actBracketedPasteEnd:
if t.pasting != nil {
queryChanged = string(t.input) != string(*t.pasting)
t.pasting = nil
}
case actTogglePreview, actShowPreview, actHidePreview: case actTogglePreview, actShowPreview, actHidePreview:
var act bool var act bool
switch a.t { switch a.t {
@@ -6036,7 +6049,7 @@ func (t *Terminal) Loop() error {
} else { } else {
t.truncateQuery() t.truncateQuery()
} }
queryChanged = string(previousInput) != string(t.input) queryChanged = queryChanged || t.pasting == nil && string(previousInput) != string(t.input)
if queryChanged { if queryChanged {
t.inputOverride = nil t.inputOverride = nil
} }

View File

@@ -84,35 +84,37 @@ func _() {
_ = x[CtrlAlt-73] _ = x[CtrlAlt-73]
_ = x[Invalid-74] _ = x[Invalid-74]
_ = x[Fatal-75] _ = x[Fatal-75]
_ = x[Mouse-76] _ = x[BracketedPasteBegin-76]
_ = x[DoubleClick-77] _ = x[BracketedPasteEnd-77]
_ = x[LeftClick-78] _ = x[Mouse-78]
_ = x[RightClick-79] _ = x[DoubleClick-79]
_ = x[SLeftClick-80] _ = x[LeftClick-80]
_ = x[SRightClick-81] _ = x[RightClick-81]
_ = x[ScrollUp-82] _ = x[SLeftClick-82]
_ = x[ScrollDown-83] _ = x[SRightClick-83]
_ = x[SScrollUp-84] _ = x[ScrollUp-84]
_ = x[SScrollDown-85] _ = x[ScrollDown-85]
_ = x[PreviewScrollUp-86] _ = x[SScrollUp-86]
_ = x[PreviewScrollDown-87] _ = x[SScrollDown-87]
_ = x[Resize-88] _ = x[PreviewScrollUp-88]
_ = x[Change-89] _ = x[PreviewScrollDown-89]
_ = x[BackwardEOF-90] _ = x[Resize-90]
_ = x[Start-91] _ = x[Change-91]
_ = x[Load-92] _ = x[BackwardEOF-92]
_ = x[Focus-93] _ = x[Start-93]
_ = x[One-94] _ = x[Load-94]
_ = x[Zero-95] _ = x[Focus-95]
_ = x[Result-96] _ = x[One-96]
_ = x[Jump-97] _ = x[Zero-97]
_ = x[JumpCancel-98] _ = x[Result-98]
_ = x[ClickHeader-99] _ = 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 { func (i EventType) String() string {
if i < 0 || i >= EventType(len(_EventType_index)-1) { if i < 0 || i >= EventType(len(_EventType_index)-1) {

View File

@@ -214,6 +214,7 @@ func (r *LightRenderer) Init() error {
} }
r.enableMouse() r.enableMouse()
r.csi("?2004h") // Enable bracketed paste mode
r.csi(fmt.Sprintf("%dA", r.MaxY()-1)) r.csi(fmt.Sprintf("%dA", r.MaxY()-1))
r.csi("G") r.csi("G")
r.csi("K") r.csi("K")
@@ -462,10 +463,11 @@ func (r *LightRenderer) escSequence(sz *int) Event {
} }
// Bracketed paste mode: \e[200~ ... \e[201~ // 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] == '~' { 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 *sz = 6
r.buffer = r.buffer[6:] if r.buffer[4] == '0' {
*sz = 0 return Event{BracketedPasteBegin, 0, nil}
return r.GetChar() }
return Event{BracketedPasteEnd, 0, nil}
} }
return Event{Invalid, 0, nil} // INS return Event{Invalid, 0, nil} // INS
case '3': case '3':

View File

@@ -197,6 +197,7 @@ func (r *FullscreenRenderer) initScreen() error {
if e = s.Init(); e != nil { if e = s.Init(); e != nil {
return e return e
} }
s.EnablePaste()
if r.mouse { if r.mouse {
s.EnableMouse() s.EnableMouse()
} else { } else {
@@ -266,6 +267,11 @@ func (r *FullscreenRenderer) Size() TermSize {
func (r *FullscreenRenderer) GetChar() Event { func (r *FullscreenRenderer) GetChar() Event {
ev := _screen.PollEvent() ev := _screen.PollEvent()
switch ev := ev.(type) { switch ev := ev.(type) {
case *tcell.EventPaste:
if ev.Start() {
return Event{BracketedPasteBegin, 0, nil}
}
return Event{BracketedPasteEnd, 0, nil}
case *tcell.EventResize: case *tcell.EventResize:
// Ignore the first resize event // Ignore the first resize event
// https://github.com/gdamore/tcell/blob/v2.7.0/TUTORIAL.md?plain=1#L18 // https://github.com/gdamore/tcell/blob/v2.7.0/TUTORIAL.md?plain=1#L18

View File

@@ -103,6 +103,8 @@ const (
Invalid Invalid
Fatal Fatal
BracketedPasteBegin
BracketedPasteEnd
Mouse Mouse
DoubleClick DoubleClick