Add print(...) action

This commit is contained in:
Junegunn Choi
2024-05-22 22:18:24 +09:00
parent 303c3bae7f
commit a90426b7ca
6 changed files with 44 additions and 28 deletions

View File

@@ -25,6 +25,11 @@ CHANGELOG
- To simplify the implementation, it only uses popups. You need tmux 3.3 or later. - To simplify the implementation, it only uses popups. You need tmux 3.3 or later.
- fzf now works on Git bash (mintty) out of the box via winpty integration - fzf now works on Git bash (mintty) out of the box via winpty integration
- man page is now embedded in the binary; `fzf --man` to see it - man page is now embedded in the binary; `fzf --man` to see it
- Added `print(...)` action to queue arbitrary string to be printed on exit
```sh
fzf --bind 'space:print(space pressed)+accept'
```
- This is similar to `--expect` but it allows you to queue multiple arbitrary strings
- [`NO_COLOR`](https://no-color.org/) environment variable is now respected. If the variable is set, fzf defaults to `--no-color` unless otherwise specified. - [`NO_COLOR`](https://no-color.org/) environment variable is now respected. If the variable is set, fzf defaults to `--no-color` unless otherwise specified.
0.52.1 0.52.1

View File

@@ -1399,7 +1399,7 @@ A key or an event can be bound to one or more of the following actions.
\fBpreview-half-page-up\fR \fBpreview-half-page-up\fR
\fBpreview-bottom\fR \fBpreview-bottom\fR
\fBpreview-top\fR \fBpreview-top\fR
\fBprint-query\fR (print query and exit) \fBprint(...)\fR (add string to the output queue and print on exit)
\fBput\fR (put the character to the prompt) \fBput\fR (put the character to the prompt)
\fBput(...)\fR (put the given string to the prompt) \fBput(...)\fR (put the given string to the prompt)
\fBrefresh-preview\fR \fBrefresh-preview\fR

View File

@@ -98,32 +98,33 @@ func _() {
_ = x[actPreviewHalfPageDown-87] _ = x[actPreviewHalfPageDown-87]
_ = x[actPrevHistory-88] _ = x[actPrevHistory-88]
_ = x[actPrevSelected-89] _ = x[actPrevSelected-89]
_ = x[actPut-90] _ = x[actPrint-90]
_ = x[actNextHistory-91] _ = x[actPut-91]
_ = x[actNextSelected-92] _ = x[actNextHistory-92]
_ = x[actExecute-93] _ = x[actNextSelected-93]
_ = x[actExecuteSilent-94] _ = x[actExecute-94]
_ = x[actExecuteMulti-95] _ = x[actExecuteSilent-95]
_ = x[actSigStop-96] _ = x[actExecuteMulti-96]
_ = x[actFirst-97] _ = x[actSigStop-97]
_ = x[actLast-98] _ = x[actFirst-98]
_ = x[actReload-99] _ = x[actLast-99]
_ = x[actReloadSync-100] _ = x[actReload-100]
_ = x[actDisableSearch-101] _ = x[actReloadSync-101]
_ = x[actEnableSearch-102] _ = x[actDisableSearch-102]
_ = x[actSelect-103] _ = x[actEnableSearch-103]
_ = x[actDeselect-104] _ = x[actSelect-104]
_ = x[actUnbind-105] _ = x[actDeselect-105]
_ = x[actRebind-106] _ = x[actUnbind-106]
_ = x[actBecome-107] _ = x[actRebind-107]
_ = x[actResponse-108] _ = x[actBecome-108]
_ = x[actShowHeader-109] _ = x[actResponse-109]
_ = x[actHideHeader-110] _ = x[actShowHeader-110]
_ = x[actHideHeader-111]
} }
const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeHeaderactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactTrackCurrentactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformHeaderactTransformPreviewLabelactTransformPromptactTransformQueryactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactBecomeactResponseactShowHeaderactHideHeader" const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeHeaderactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactTrackCurrentactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformHeaderactTransformPreviewLabelactTransformPromptactTransformQueryactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactBecomeactResponseactShowHeaderactHideHeader"
var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 42, 50, 68, 76, 85, 102, 123, 138, 159, 183, 198, 207, 227, 242, 256, 277, 292, 306, 320, 333, 350, 358, 371, 387, 399, 407, 421, 435, 446, 457, 475, 492, 499, 518, 530, 544, 553, 568, 580, 593, 604, 615, 627, 641, 662, 677, 692, 709, 716, 721, 730, 741, 752, 765, 780, 791, 804, 811, 824, 837, 854, 869, 882, 896, 910, 926, 946, 958, 981, 999, 1023, 1041, 1058, 1068, 1084, 1106, 1119, 1135, 1147, 1161, 1177, 1195, 1215, 1237, 1251, 1266, 1272, 1286, 1301, 1311, 1327, 1342, 1352, 1360, 1367, 1376, 1389, 1405, 1420, 1429, 1440, 1449, 1458, 1467, 1478, 1491, 1504} var _actionType_index = [...]uint16{0, 9, 17, 25, 35, 42, 50, 68, 76, 85, 102, 123, 138, 159, 183, 198, 207, 227, 242, 256, 277, 292, 306, 320, 333, 350, 358, 371, 387, 399, 407, 421, 435, 446, 457, 475, 492, 499, 518, 530, 544, 553, 568, 580, 593, 604, 615, 627, 641, 662, 677, 692, 709, 716, 721, 730, 741, 752, 765, 780, 791, 804, 811, 824, 837, 854, 869, 882, 896, 910, 926, 946, 958, 981, 999, 1023, 1041, 1058, 1068, 1084, 1106, 1119, 1135, 1147, 1161, 1177, 1195, 1215, 1237, 1251, 1266, 1274, 1280, 1294, 1309, 1319, 1335, 1350, 1360, 1368, 1375, 1384, 1397, 1413, 1428, 1437, 1448, 1457, 1466, 1475, 1486, 1499, 1512}
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

@@ -1188,7 +1188,7 @@ const (
func init() { func init() {
executeRegexp = regexp.MustCompile( executeRegexp = regexp.MustCompile(
`(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|transform)-(?:header|query|prompt|border-label|preview-label)|transform|change-(?:preview-window|preview|multi)|(?:re|un)bind|pos|put)`) `(?si)[:+](become|execute(?:-multi|-silent)?|reload(?:-sync)?|preview|(?:change|transform)-(?:header|query|prompt|border-label|preview-label)|transform|change-(?:preview-window|preview|multi)|(?:re|un)bind|pos|put|print)`)
splitRegexp = regexp.MustCompile("[,:]+") splitRegexp = regexp.MustCompile("[,:]+")
actionNameRegexp = regexp.MustCompile("(?i)^[a-z-]+") actionNameRegexp = regexp.MustCompile("(?i)^[a-z-]+")
} }
@@ -1560,6 +1560,8 @@ func isExecuteAction(str string) actionType {
return actExecuteSilent return actExecuteSilent
case "execute-multi": case "execute-multi":
return actExecuteMulti return actExecuteMulti
case "print":
return actPrint
case "put": case "put":
return actPut return actPut
case "transform": case "transform":

View File

@@ -242,6 +242,7 @@ type Terminal struct {
keymap map[tui.Event][]*action keymap map[tui.Event][]*action
keymapOrg map[tui.Event][]*action keymapOrg map[tui.Event][]*action
pressed string pressed string
printQueue []string
printQuery bool printQuery bool
history *History history *History
cycle bool cycle bool
@@ -439,7 +440,7 @@ const (
actOffsetDown actOffsetDown
actJump actJump
actJumpAccept // XXX Deprecated in favor of jump:accept binding actJumpAccept // XXX Deprecated in favor of jump:accept binding
actPrintQuery actPrintQuery // XXX Deprecated (not very useful, just use --print-query)
actRefreshPreview actRefreshPreview
actReplaceQuery actReplaceQuery
actToggleSort actToggleSort
@@ -466,6 +467,7 @@ const (
actPreviewHalfPageDown actPreviewHalfPageDown
actPrevHistory actPrevHistory
actPrevSelected actPrevSelected
actPrint
actPut actPut
actNextHistory actNextHistory
actNextSelected actNextSelected
@@ -1203,6 +1205,9 @@ func (t *Terminal) output() bool {
if len(t.expect) > 0 { if len(t.expect) > 0 {
t.printer(t.pressed) t.printer(t.pressed)
} }
for _, s := range t.printQueue {
t.printer(s)
}
found := len(t.selected) > 0 found := len(t.selected) > 0
if !found { if !found {
current := t.currentItem() current := t.currentItem()
@@ -3946,6 +3951,8 @@ func (t *Terminal) Loop() error {
suffix := copySlice(t.input[t.cx:]) suffix := copySlice(t.input[t.cx:])
t.input = append(append(t.input[:t.cx], str...), suffix...) t.input = append(append(t.input[:t.cx], str...), suffix...)
t.cx += len(str) t.cx += len(str)
case actPrint:
t.printQueue = append(t.printQueue, a.a)
case actUnixLineDiscard: case actUnixLineDiscard:
beof = len(t.input) == 0 beof = len(t.input) == 0
if t.cx > 0 { if t.cx > 0 {

View File

@@ -107,11 +107,12 @@ func _() {
_ = x[Result-96] _ = x[Result-96]
_ = x[Jump-97] _ = x[Jump-97]
_ = x[JumpCancel-98] _ = x[JumpCancel-98]
_ = x[ClickHeader-99]
} }
const _EventType_name = "RuneCtrlACtrlBCtrlCCtrlDCtrlECtrlFCtrlGCtrlHTabCtrlJCtrlKCtrlLCtrlMCtrlNCtrlOCtrlPCtrlQCtrlRCtrlSCtrlTCtrlUCtrlVCtrlWCtrlXCtrlYCtrlZEscCtrlSpaceCtrlDeleteCtrlBackSlashCtrlRightBracketCtrlCaretCtrlSlashShiftTabBackspaceDeletePageUpPageDownUpDownLeftRightHomeEndInsertShiftUpShiftDownShiftLeftShiftRightShiftDeleteF1F2F3F4F5F6F7F8F9F10F11F12AltBackspaceAltUpAltDownAltLeftAltRightAltShiftUpAltShiftDownAltShiftLeftAltShiftRightAltCtrlAltInvalidFatalMouseDoubleClickLeftClickRightClickSLeftClickSRightClickScrollUpScrollDownSScrollUpSScrollDownPreviewScrollUpPreviewScrollDownResizeChangeBackwardEOFStartLoadFocusOneZeroResultJumpJumpCancel" const _EventType_name = "RuneCtrlACtrlBCtrlCCtrlDCtrlECtrlFCtrlGCtrlHTabCtrlJCtrlKCtrlLCtrlMCtrlNCtrlOCtrlPCtrlQCtrlRCtrlSCtrlTCtrlUCtrlVCtrlWCtrlXCtrlYCtrlZEscCtrlSpaceCtrlDeleteCtrlBackSlashCtrlRightBracketCtrlCaretCtrlSlashShiftTabBackspaceDeletePageUpPageDownUpDownLeftRightHomeEndInsertShiftUpShiftDownShiftLeftShiftRightShiftDeleteF1F2F3F4F5F6F7F8F9F10F11F12AltBackspaceAltUpAltDownAltLeftAltRightAltShiftUpAltShiftDownAltShiftLeftAltShiftRightAltCtrlAltInvalidFatalMouseDoubleClickLeftClickRightClickSLeftClickSRightClickScrollUpScrollDownSScrollUpSScrollDownPreviewScrollUpPreviewScrollDownResizeChangeBackwardEOFStartLoadFocusOneZeroResultJumpJumpCancelClickHeader"
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} 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}
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) {