mirror of
https://github.com/junegunn/fzf.git
synced 2025-11-15 23:03:47 -05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81366c548b | ||
|
|
b2c3e567da | ||
|
|
ca5e633399 | ||
|
|
e60a9a628b | ||
|
|
0167691941 | ||
|
|
3b0f976380 | ||
|
|
7bd298b536 |
@@ -271,22 +271,23 @@ Adaptive height has the following limitations:
|
|||||||
Minimum height when \fB\-\-height\fR is given in percent (default: 10).
|
Minimum height when \fB\-\-height\fR is given in percent (default: 10).
|
||||||
Ignored when \fB\-\-height\fR is not specified.
|
Ignored when \fB\-\-height\fR is not specified.
|
||||||
.TP
|
.TP
|
||||||
.BI "\-\-tmux" "[=[center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]]"
|
.BI "\-\-popup" "[=[center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]]"
|
||||||
Start fzf in a tmux popup (default \fBcenter,50%\fR). Requires tmux 3.3 or
|
Start fzf in a tmux popup or in a zellij floating pane (default
|
||||||
later. This option is ignored if you are not running fzf inside tmux.
|
\fBcenter,50%\fR). Requires tmux 3.3+ or zellij. This option is ignored if you
|
||||||
|
are not running fzf inside tmux or zellij.
|
||||||
|
|
||||||
e.g.
|
e.g.
|
||||||
\fB# Popup in the center with 70% width and height
|
\fB# Popup in the center with 70% width and height
|
||||||
fzf \-\-tmux 70%
|
fzf \-\-popup 70%
|
||||||
|
|
||||||
# Popup on the left with 40% width and 100% height
|
# Popup on the left with 40% width and 100% height
|
||||||
fzf \-\-tmux right,40%
|
fzf \-\-popup right,40%
|
||||||
|
|
||||||
# Popup on the bottom with 100% width and 30% height
|
# Popup on the bottom with 100% width and 30% height
|
||||||
fzf \-\-tmux bottom,30%
|
fzf \-\-popup bottom,30%
|
||||||
|
|
||||||
# Popup on the top with 80% width and 40% height
|
# Popup on the top with 80% width and 40% height
|
||||||
fzf \-\-tmux top,80%,40%\fR
|
fzf \-\-popup top,80%,40%\fR
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BI "\-\-layout=" "LAYOUT"
|
.BI "\-\-layout=" "LAYOUT"
|
||||||
@@ -1506,10 +1507,11 @@ A key or an event can be bound to one or more of the following actions.
|
|||||||
\fBshow\-preview\fR
|
\fBshow\-preview\fR
|
||||||
\fBtoggle\fR (\fIright\-click\fR)
|
\fBtoggle\fR (\fIright\-click\fR)
|
||||||
\fBtoggle\-all\fR (toggle all matches)
|
\fBtoggle\-all\fR (toggle all matches)
|
||||||
\fBtoggle+down\fR \fIctrl\-i (tab)\fR
|
|
||||||
\fBtoggle\-header\fR
|
|
||||||
\fBtoggle\-in\fR (\fB\-\-layout=reverse*\fR ? \fBtoggle+up\fR : \fBtoggle+down\fR)
|
\fBtoggle\-in\fR (\fB\-\-layout=reverse*\fR ? \fBtoggle+up\fR : \fBtoggle+down\fR)
|
||||||
\fBtoggle\-out\fR (\fB\-\-layout=reverse*\fR ? \fBtoggle+down\fR : \fBtoggle+up\fR)
|
\fBtoggle\-out\fR (\fB\-\-layout=reverse*\fR ? \fBtoggle+down\fR : \fBtoggle+up\fR)
|
||||||
|
\fBtoggle\-header\fR
|
||||||
|
\fBtoggle\-hscroll\fR
|
||||||
|
\fBtoggle\-multi\-line\fR
|
||||||
\fBtoggle\-preview\fR
|
\fBtoggle\-preview\fR
|
||||||
\fBtoggle\-preview\-wrap\fR
|
\fBtoggle\-preview\-wrap\fR
|
||||||
\fBtoggle\-search\fR (toggle search functionality)
|
\fBtoggle\-search\fR (toggle search functionality)
|
||||||
@@ -1517,6 +1519,7 @@ A key or an event can be bound to one or more of the following actions.
|
|||||||
\fBtoggle\-track\fR (toggle global tracking option (\fB\-\-track\fR))
|
\fBtoggle\-track\fR (toggle global tracking option (\fB\-\-track\fR))
|
||||||
\fBtoggle\-track\-current\fR (toggle tracking of the current item)
|
\fBtoggle\-track\-current\fR (toggle tracking of the current item)
|
||||||
\fBtoggle\-wrap\fR \fIctrl\-/\fR \fIalt\-/\fR
|
\fBtoggle\-wrap\fR \fIctrl\-/\fR \fIalt\-/\fR
|
||||||
|
\fBtoggle+down\fR \fIctrl\-i (tab)\fR
|
||||||
\fBtoggle+up\fR \fIbtab (shift\-tab)\fR
|
\fBtoggle+up\fR \fIbtab (shift\-tab)\fR
|
||||||
\fBtrack\-current\fR (track the current item; automatically disabled if focus changes)
|
\fBtrack\-current\fR (track the current item; automatically disabled if focus changes)
|
||||||
\fBtransform(...)\fR (transform states using the output of an external command)
|
\fBtransform(...)\fR (transform states using the output of an external command)
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ function fzf_key_bindings
|
|||||||
function fzf-history-widget -d "Show command history"
|
function fzf-history-widget -d "Show command history"
|
||||||
test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40%
|
test -n "$FZF_TMUX_HEIGHT"; or set FZF_TMUX_HEIGHT 40%
|
||||||
begin
|
begin
|
||||||
set -l FISH_MAJOR (string split '.' -- $version)[1]
|
set -l FISH_MAJOR (string split -- '.' $version)[1]
|
||||||
set -l FISH_MINOR (string split '.' -- $version)[2]
|
set -l FISH_MINOR (string split -- '.' $version)[2]
|
||||||
|
|
||||||
# merge history from other sessions before searching
|
# merge history from other sessions before searching
|
||||||
test -z "$fish_private_mode"; and builtin history merge
|
test -z "$fish_private_mode"; and builtin history merge
|
||||||
@@ -150,17 +150,20 @@ function fzf_key_bindings
|
|||||||
set -l prefix (string match -r -- '^-[^\s=]+=' $commandline)
|
set -l prefix (string match -r -- '^-[^\s=]+=' $commandline)
|
||||||
set commandline (string replace -- "$prefix" '' $commandline)
|
set commandline (string replace -- "$prefix" '' $commandline)
|
||||||
|
|
||||||
|
# Enable home directory expansion of leading ~/
|
||||||
|
set commandline (string replace -r -- '^~/' '\$HOME/' $commandline)
|
||||||
|
|
||||||
# escape special characters, except for the $ sign of valid variable names,
|
# escape special characters, except for the $ sign of valid variable names,
|
||||||
# so that after eval, the original string is returned, but with the
|
# so that after eval, the original string is returned, but with the
|
||||||
# variable names replaced by their values.
|
# variable names replaced by their values.
|
||||||
set commandline (string escape -n -- $commandline)
|
set commandline (string escape -n -- $commandline)
|
||||||
set commandline (string replace -r -a '\x5c\$(?=[\w])' '\$' -- $commandline)
|
set commandline (string replace -r -a -- '\x5c\$(?=[\w])' '\$' $commandline)
|
||||||
|
|
||||||
# eval is used to do shell expansion on paths
|
# eval is used to do shell expansion on paths
|
||||||
eval set commandline $commandline
|
eval set commandline $commandline
|
||||||
|
|
||||||
# Combine multiple consecutive slashes into one
|
# Combine multiple consecutive slashes into one
|
||||||
set commandline (string replace -r -a '/+' '/' -- $commandline)
|
set commandline (string replace -r -a -- '/+' '/' $commandline)
|
||||||
|
|
||||||
if test -z "$commandline"
|
if test -z "$commandline"
|
||||||
# Default to current directory with no --query
|
# Default to current directory with no --query
|
||||||
@@ -172,12 +175,12 @@ function fzf_key_bindings
|
|||||||
# BUG: on combined expressions, if a left argument is a single `!`, the
|
# BUG: on combined expressions, if a left argument is a single `!`, the
|
||||||
# builtin test command of fish will treat it as the ! operator. To
|
# builtin test command of fish will treat it as the ! operator. To
|
||||||
# overcome this, have the variable parts on the right.
|
# overcome this, have the variable parts on the right.
|
||||||
if test "." = "$dir" -a "." != (string sub -l 1 -- $commandline)
|
if test "." = "$dir" -a "./" != (string sub -l 2 -- $commandline)
|
||||||
# if $dir is "." but commandline is not a relative path, this means no file path found
|
# if $dir is "." but commandline is not a relative path, this means no file path found
|
||||||
set fzf_query $commandline
|
set fzf_query $commandline
|
||||||
else
|
else
|
||||||
# Also remove trailing slash after dir, to "split" input properly
|
# Also remove trailing slash after dir, to "split" input properly
|
||||||
set fzf_query (string replace -r "^$dir/?" '' -- $commandline)
|
set fzf_query (string replace -r -- "^$dir/?" '' $commandline)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -190,7 +193,7 @@ function fzf_key_bindings
|
|||||||
set dir $argv
|
set dir $argv
|
||||||
|
|
||||||
# Strip trailing slash, unless $dir is root dir (/)
|
# Strip trailing slash, unless $dir is root dir (/)
|
||||||
set dir (string replace -r '(?<!^)/$' '' -- $dir)
|
set dir (string replace -r -- '(?<!^)/$' '' $dir)
|
||||||
|
|
||||||
# Iteratively check if dir exists and strip tail end of path
|
# Iteratively check if dir exists and strip tail end of path
|
||||||
while test ! -d "$dir"
|
while test ! -d "$dir"
|
||||||
|
|||||||
@@ -59,73 +59,75 @@ func _() {
|
|||||||
_ = x[actToggleTrackCurrent-48]
|
_ = x[actToggleTrackCurrent-48]
|
||||||
_ = x[actToggleHeader-49]
|
_ = x[actToggleHeader-49]
|
||||||
_ = x[actToggleWrap-50]
|
_ = x[actToggleWrap-50]
|
||||||
_ = x[actTrackCurrent-51]
|
_ = x[actToggleMultiLine-51]
|
||||||
_ = x[actUntrackCurrent-52]
|
_ = x[actToggleHscroll-52]
|
||||||
_ = x[actDown-53]
|
_ = x[actTrackCurrent-53]
|
||||||
_ = x[actUp-54]
|
_ = x[actUntrackCurrent-54]
|
||||||
_ = x[actPageUp-55]
|
_ = x[actDown-55]
|
||||||
_ = x[actPageDown-56]
|
_ = x[actUp-56]
|
||||||
_ = x[actPosition-57]
|
_ = x[actPageUp-57]
|
||||||
_ = x[actHalfPageUp-58]
|
_ = x[actPageDown-58]
|
||||||
_ = x[actHalfPageDown-59]
|
_ = x[actPosition-59]
|
||||||
_ = x[actOffsetUp-60]
|
_ = x[actHalfPageUp-60]
|
||||||
_ = x[actOffsetDown-61]
|
_ = x[actHalfPageDown-61]
|
||||||
_ = x[actOffsetMiddle-62]
|
_ = x[actOffsetUp-62]
|
||||||
_ = x[actJump-63]
|
_ = x[actOffsetDown-63]
|
||||||
_ = x[actJumpAccept-64]
|
_ = x[actOffsetMiddle-64]
|
||||||
_ = x[actPrintQuery-65]
|
_ = x[actJump-65]
|
||||||
_ = x[actRefreshPreview-66]
|
_ = x[actJumpAccept-66]
|
||||||
_ = x[actReplaceQuery-67]
|
_ = x[actPrintQuery-67]
|
||||||
_ = x[actToggleSort-68]
|
_ = x[actRefreshPreview-68]
|
||||||
_ = x[actShowPreview-69]
|
_ = x[actReplaceQuery-69]
|
||||||
_ = x[actHidePreview-70]
|
_ = x[actToggleSort-70]
|
||||||
_ = x[actTogglePreview-71]
|
_ = x[actShowPreview-71]
|
||||||
_ = x[actTogglePreviewWrap-72]
|
_ = x[actHidePreview-72]
|
||||||
_ = x[actTransform-73]
|
_ = x[actTogglePreview-73]
|
||||||
_ = x[actTransformBorderLabel-74]
|
_ = x[actTogglePreviewWrap-74]
|
||||||
_ = x[actTransformHeader-75]
|
_ = x[actTransform-75]
|
||||||
_ = x[actTransformPreviewLabel-76]
|
_ = x[actTransformBorderLabel-76]
|
||||||
_ = x[actTransformPrompt-77]
|
_ = x[actTransformHeader-77]
|
||||||
_ = x[actTransformQuery-78]
|
_ = x[actTransformPreviewLabel-78]
|
||||||
_ = x[actPreview-79]
|
_ = x[actTransformPrompt-79]
|
||||||
_ = x[actChangePreview-80]
|
_ = x[actTransformQuery-80]
|
||||||
_ = x[actChangePreviewWindow-81]
|
_ = x[actPreview-81]
|
||||||
_ = x[actPreviewTop-82]
|
_ = x[actChangePreview-82]
|
||||||
_ = x[actPreviewBottom-83]
|
_ = x[actChangePreviewWindow-83]
|
||||||
_ = x[actPreviewUp-84]
|
_ = x[actPreviewTop-84]
|
||||||
_ = x[actPreviewDown-85]
|
_ = x[actPreviewBottom-85]
|
||||||
_ = x[actPreviewPageUp-86]
|
_ = x[actPreviewUp-86]
|
||||||
_ = x[actPreviewPageDown-87]
|
_ = x[actPreviewDown-87]
|
||||||
_ = x[actPreviewHalfPageUp-88]
|
_ = x[actPreviewPageUp-88]
|
||||||
_ = x[actPreviewHalfPageDown-89]
|
_ = x[actPreviewPageDown-89]
|
||||||
_ = x[actPrevHistory-90]
|
_ = x[actPreviewHalfPageUp-90]
|
||||||
_ = x[actPrevSelected-91]
|
_ = x[actPreviewHalfPageDown-91]
|
||||||
_ = x[actPrint-92]
|
_ = x[actPrevHistory-92]
|
||||||
_ = x[actPut-93]
|
_ = x[actPrevSelected-93]
|
||||||
_ = x[actNextHistory-94]
|
_ = x[actPrint-94]
|
||||||
_ = x[actNextSelected-95]
|
_ = x[actPut-95]
|
||||||
_ = x[actExecute-96]
|
_ = x[actNextHistory-96]
|
||||||
_ = x[actExecuteSilent-97]
|
_ = x[actNextSelected-97]
|
||||||
_ = x[actExecuteMulti-98]
|
_ = x[actExecute-98]
|
||||||
_ = x[actSigStop-99]
|
_ = x[actExecuteSilent-99]
|
||||||
_ = x[actFirst-100]
|
_ = x[actExecuteMulti-100]
|
||||||
_ = x[actLast-101]
|
_ = x[actSigStop-101]
|
||||||
_ = x[actReload-102]
|
_ = x[actFirst-102]
|
||||||
_ = x[actReloadSync-103]
|
_ = x[actLast-103]
|
||||||
_ = x[actDisableSearch-104]
|
_ = x[actReload-104]
|
||||||
_ = x[actEnableSearch-105]
|
_ = x[actReloadSync-105]
|
||||||
_ = x[actSelect-106]
|
_ = x[actDisableSearch-106]
|
||||||
_ = x[actDeselect-107]
|
_ = x[actEnableSearch-107]
|
||||||
_ = x[actUnbind-108]
|
_ = x[actSelect-108]
|
||||||
_ = x[actRebind-109]
|
_ = x[actDeselect-109]
|
||||||
_ = x[actBecome-110]
|
_ = x[actUnbind-110]
|
||||||
_ = x[actShowHeader-111]
|
_ = x[actRebind-111]
|
||||||
_ = x[actHideHeader-112]
|
_ = x[actBecome-112]
|
||||||
|
_ = x[actShowHeader-113]
|
||||||
|
_ = x[actHideHeader-114]
|
||||||
}
|
}
|
||||||
|
|
||||||
const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeHeaderactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactTrackCurrentactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformHeaderactTransformPreviewLabelactTransformPromptactTransformQueryactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactBecomeactShowHeaderactHideHeader"
|
const _actionType_name = "actIgnoreactStartactClickactInvalidactCharactMouseactBeginningOfLineactAbortactAcceptactAcceptNonEmptyactAcceptOrPrintQueryactBackwardCharactBackwardDeleteCharactBackwardDeleteCharEofactBackwardWordactCancelactChangeBorderLabelactChangeHeaderactChangeMultiactChangePreviewLabelactChangePromptactChangeQueryactClearScreenactClearQueryactClearSelectionactCloseactDeleteCharactDeleteCharEofactEndOfLineactFatalactForwardCharactForwardWordactKillLineactKillWordactUnixLineDiscardactUnixWordRuboutactYankactBackwardKillWordactSelectAllactDeselectAllactToggleactToggleSearchactToggleAllactToggleDownactToggleUpactToggleInactToggleOutactToggleTrackactToggleTrackCurrentactToggleHeaderactToggleWrapactToggleMultiLineactToggleHscrollactTrackCurrentactUntrackCurrentactDownactUpactPageUpactPageDownactPositionactHalfPageUpactHalfPageDownactOffsetUpactOffsetDownactOffsetMiddleactJumpactJumpAcceptactPrintQueryactRefreshPreviewactReplaceQueryactToggleSortactShowPreviewactHidePreviewactTogglePreviewactTogglePreviewWrapactTransformactTransformBorderLabelactTransformHeaderactTransformPreviewLabelactTransformPromptactTransformQueryactPreviewactChangePreviewactChangePreviewWindowactPreviewTopactPreviewBottomactPreviewUpactPreviewDownactPreviewPageUpactPreviewPageDownactPreviewHalfPageUpactPreviewHalfPageDownactPrevHistoryactPrevSelectedactPrintactPutactNextHistoryactNextSelectedactExecuteactExecuteSilentactExecuteMultiactSigStopactFirstactLastactReloadactReloadSyncactDisableSearchactEnableSearchactSelectactDeselectactUnbindactRebindactBecomeactShowHeaderactHideHeader"
|
||||||
|
|
||||||
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, 690, 705, 722, 729, 734, 743, 754, 765, 778, 793, 804, 817, 832, 839, 852, 865, 882, 897, 910, 924, 938, 954, 974, 986, 1009, 1027, 1051, 1069, 1086, 1096, 1112, 1134, 1147, 1163, 1175, 1189, 1205, 1223, 1243, 1265, 1279, 1294, 1302, 1308, 1322, 1337, 1347, 1363, 1378, 1388, 1396, 1403, 1412, 1425, 1441, 1456, 1465, 1476, 1485, 1494, 1503, 1516, 1529}
|
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, 690, 708, 724, 739, 756, 763, 768, 777, 788, 799, 812, 827, 838, 851, 866, 873, 886, 899, 916, 931, 944, 958, 972, 988, 1008, 1020, 1043, 1061, 1085, 1103, 1120, 1130, 1146, 1168, 1181, 1197, 1209, 1223, 1239, 1257, 1277, 1299, 1313, 1328, 1336, 1342, 1356, 1371, 1381, 1397, 1412, 1422, 1430, 1437, 1446, 1459, 1475, 1490, 1499, 1510, 1519, 1528, 1537, 1550, 1563}
|
||||||
|
|
||||||
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) {
|
||||||
|
|||||||
@@ -39,8 +39,13 @@ func (r revision) compatible(other revision) bool {
|
|||||||
// Run starts fzf
|
// Run starts fzf
|
||||||
func Run(opts *Options) (int, error) {
|
func Run(opts *Options) (int, error) {
|
||||||
if opts.Filter == nil {
|
if opts.Filter == nil {
|
||||||
if opts.Tmux != nil && len(os.Getenv("TMUX")) > 0 && opts.Tmux.index >= opts.Height.index {
|
if opts.Tmux != nil && opts.Tmux.index >= opts.Height.index {
|
||||||
return runTmux(os.Args, opts)
|
if len(os.Getenv("TMUX")) > 0 {
|
||||||
|
return runTmux(os.Args, opts)
|
||||||
|
}
|
||||||
|
if len(os.Getenv("ZELLIJ")) > 0 {
|
||||||
|
return runZellij(os.Args, opts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if needWinpty(opts) {
|
if needWinpty(opts) {
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ Usage: fzf [options]
|
|||||||
according to the input size.
|
according to the input size.
|
||||||
--min-height=HEIGHT Minimum height when --height is given in percent
|
--min-height=HEIGHT Minimum height when --height is given in percent
|
||||||
(default: 10)
|
(default: 10)
|
||||||
--tmux[=OPTS] Start fzf in a tmux popup (requires tmux 3.3+)
|
--popup[=OPTS] Start fzf in a popup (requires tmux 3.3+ or zellij)
|
||||||
[center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]
|
[center|top|bottom|left|right][,SIZE[%]][,SIZE[%]]
|
||||||
(default: center,50%)
|
(default: center,50%)
|
||||||
--layout=LAYOUT Choose layout: [default|reverse|reverse-list]
|
--layout=LAYOUT Choose layout: [default|reverse|reverse-list]
|
||||||
@@ -299,7 +299,7 @@ func parseTmuxOptions(arg string, index int) (*tmuxOptions, error) {
|
|||||||
var err error
|
var err error
|
||||||
opts := defaultTmuxOptions(index)
|
opts := defaultTmuxOptions(index)
|
||||||
tokens := splitRegexp.Split(arg, -1)
|
tokens := splitRegexp.Split(arg, -1)
|
||||||
errorToReturn := errors.New("invalid tmux option: " + arg + " (expected: [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]])")
|
errorToReturn := errors.New("invalid popup option: " + arg + " (expected: [center|top|bottom|left|right][,SIZE[%]][,SIZE[%]])")
|
||||||
if len(tokens) == 0 || len(tokens) > 3 {
|
if len(tokens) == 0 || len(tokens) > 3 {
|
||||||
return nil, errorToReturn
|
return nil, errorToReturn
|
||||||
}
|
}
|
||||||
@@ -1431,6 +1431,10 @@ func parseActionList(masked string, original string, prevActions []*action, putA
|
|||||||
appendAction(actToggleHeader)
|
appendAction(actToggleHeader)
|
||||||
case "toggle-wrap":
|
case "toggle-wrap":
|
||||||
appendAction(actToggleWrap)
|
appendAction(actToggleWrap)
|
||||||
|
case "toggle-multi-line":
|
||||||
|
appendAction(actToggleMultiLine)
|
||||||
|
case "toggle-hscroll":
|
||||||
|
appendAction(actToggleHscroll)
|
||||||
case "show-header":
|
case "show-header":
|
||||||
appendAction(actShowHeader)
|
appendAction(actShowHeader)
|
||||||
case "hide-header":
|
case "hide-header":
|
||||||
@@ -2027,7 +2031,7 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
|
|||||||
opts.Version = true
|
opts.Version = true
|
||||||
case "--no-winpty":
|
case "--no-winpty":
|
||||||
opts.NoWinpty = true
|
opts.NoWinpty = true
|
||||||
case "--tmux":
|
case "--tmux", "--popup":
|
||||||
given, str := optionalNextString(allArgs, &i)
|
given, str := optionalNextString(allArgs, &i)
|
||||||
if given {
|
if given {
|
||||||
if opts.Tmux, err = parseTmuxOptions(str, index); err != nil {
|
if opts.Tmux, err = parseTmuxOptions(str, index); err != nil {
|
||||||
@@ -2036,7 +2040,7 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
|
|||||||
} else {
|
} else {
|
||||||
opts.Tmux = defaultTmuxOptions(index)
|
opts.Tmux = defaultTmuxOptions(index)
|
||||||
}
|
}
|
||||||
case "--no-tmux":
|
case "--no-tmux", "--no-popup":
|
||||||
opts.Tmux = nil
|
opts.Tmux = nil
|
||||||
case "--force-tty-in":
|
case "--force-tty-in":
|
||||||
// NOTE: We need this because `system('fzf --tmux < /dev/tty')` doesn't
|
// NOTE: We need this because `system('fzf --tmux < /dev/tty')` doesn't
|
||||||
@@ -2573,6 +2577,10 @@ func parseOptions(index *int, opts *Options, allArgs []string) error {
|
|||||||
if opts.FuzzyAlgo, err = parseAlgo(value); err != nil {
|
if opts.FuzzyAlgo, err = parseAlgo(value); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
} else if match, value := optString(arg, "--popup="); match {
|
||||||
|
if opts.Tmux, err = parseTmuxOptions(value, index); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else if match, value := optString(arg, "--tmux="); match {
|
} else if match, value := optString(arg, "--tmux="); match {
|
||||||
if opts.Tmux, err = parseTmuxOptions(value, index); err != nil {
|
if opts.Tmux, err = parseTmuxOptions(value, index); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -463,6 +463,8 @@ const (
|
|||||||
actToggleTrackCurrent
|
actToggleTrackCurrent
|
||||||
actToggleHeader
|
actToggleHeader
|
||||||
actToggleWrap
|
actToggleWrap
|
||||||
|
actToggleMultiLine
|
||||||
|
actToggleHscroll
|
||||||
actTrackCurrent
|
actTrackCurrent
|
||||||
actUntrackCurrent
|
actUntrackCurrent
|
||||||
actDown
|
actDown
|
||||||
@@ -1537,7 +1539,7 @@ func (t *Terminal) resizeWindows(forcePreview bool, redrawBorder bool) {
|
|||||||
width := screenWidth - marginInt[1] - marginInt[3]
|
width := screenWidth - marginInt[1] - marginInt[3]
|
||||||
height := screenHeight - marginInt[0] - marginInt[2]
|
height := screenHeight - marginInt[0] - marginInt[2]
|
||||||
|
|
||||||
t.prevLines = make([]itemLine, screenHeight)
|
t.prevLines = make([]itemLine, util.Max(1, screenHeight))
|
||||||
if t.border != nil && redrawBorder {
|
if t.border != nil && redrawBorder {
|
||||||
t.border = nil
|
t.border = nil
|
||||||
}
|
}
|
||||||
@@ -4639,6 +4641,14 @@ func (t *Terminal) Loop() error {
|
|||||||
case actToggleWrap:
|
case actToggleWrap:
|
||||||
t.wrap = !t.wrap
|
t.wrap = !t.wrap
|
||||||
req(reqList, reqHeader)
|
req(reqList, reqHeader)
|
||||||
|
case actToggleMultiLine:
|
||||||
|
t.multiLine = !t.multiLine
|
||||||
|
req(reqList)
|
||||||
|
case actToggleHscroll:
|
||||||
|
// Force re-rendering of the list
|
||||||
|
t.prevLines = make([]itemLine, len(t.prevLines))
|
||||||
|
t.hscroll = !t.hscroll
|
||||||
|
req(reqList)
|
||||||
case actTrackCurrent:
|
case actTrackCurrent:
|
||||||
if t.track == trackDisabled {
|
if t.track == trackDisabled {
|
||||||
t.track = trackCurrent
|
t.track = trackCurrent
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func runTmux(args []string, opts *Options) (int, error) {
|
|||||||
for _, arg := range args {
|
for _, arg := range args {
|
||||||
argStr += " " + escapeSingleQuote(arg)
|
argStr += " " + escapeSingleQuote(arg)
|
||||||
}
|
}
|
||||||
argStr += ` --no-tmux --no-height`
|
argStr += ` --no-popup --no-height`
|
||||||
|
|
||||||
// Get current directory
|
// Get current directory
|
||||||
dir, err := os.Getwd()
|
dir, err := os.Getwd()
|
||||||
|
|||||||
103
src/zellij.go
Normal file
103
src/zellij.go
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
package fzf
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/junegunn/fzf/src/tui"
|
||||||
|
)
|
||||||
|
|
||||||
|
func runZellij(args []string, opts *Options) (int, error) {
|
||||||
|
// Prepare arguments
|
||||||
|
fzf := args[0]
|
||||||
|
args = append([]string{"--bind=ctrl-z:ignore"}, args[1:]...)
|
||||||
|
if opts.BorderShape == tui.BorderUndefined {
|
||||||
|
args = append(args, "--no-border")
|
||||||
|
}
|
||||||
|
argStr := escapeSingleQuote(fzf)
|
||||||
|
for _, arg := range args {
|
||||||
|
argStr += " " + escapeSingleQuote(arg)
|
||||||
|
}
|
||||||
|
argStr += ` --no-popup --no-height`
|
||||||
|
|
||||||
|
// Get current directory
|
||||||
|
dir, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
dir = "."
|
||||||
|
}
|
||||||
|
|
||||||
|
sh, err := sh(false)
|
||||||
|
if err != nil {
|
||||||
|
return ExitError, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fifo, err := fifo("zellij-fifo")
|
||||||
|
if err != nil {
|
||||||
|
return ExitError, err
|
||||||
|
}
|
||||||
|
|
||||||
|
zopts := " --width " + opts.Tmux.width.String() + " --height " + opts.Tmux.height.String()
|
||||||
|
centerX := func() {
|
||||||
|
// TODO: Handle non-percent values
|
||||||
|
if opts.Tmux.width.percent {
|
||||||
|
x := (100.0 - opts.Tmux.width.size) / 2
|
||||||
|
if x <= 0 {
|
||||||
|
zopts += " -x0"
|
||||||
|
} else {
|
||||||
|
zopts += fmt.Sprintf(" -x%d%%", int(x))
|
||||||
|
}
|
||||||
|
} else if cols := os.Getenv("COLUMNS"); len(cols) > 0 {
|
||||||
|
if w, e := strconv.Atoi(cols); e == nil {
|
||||||
|
x := (float64(w) - opts.Tmux.width.size) / 2
|
||||||
|
zopts += fmt.Sprintf(" -x%d", int(x))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
centerY := func() {
|
||||||
|
if opts.Tmux.height.percent {
|
||||||
|
y := (100.0 - opts.Tmux.height.size) / 2
|
||||||
|
if y <= 0 {
|
||||||
|
zopts += " -y0"
|
||||||
|
} else {
|
||||||
|
zopts += fmt.Sprintf(" -y%d%%", int(y))
|
||||||
|
}
|
||||||
|
} else if lines := os.Getenv("LINES"); len(lines) > 0 {
|
||||||
|
if h, e := strconv.Atoi(lines); e == nil {
|
||||||
|
y := (float64(h) - opts.Tmux.height.size) / 2
|
||||||
|
zopts += fmt.Sprintf(" -y%d", int(y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch opts.Tmux.position {
|
||||||
|
case posUp:
|
||||||
|
zopts += " -y0"
|
||||||
|
centerX()
|
||||||
|
case posDown:
|
||||||
|
zopts += " -y9999"
|
||||||
|
centerX()
|
||||||
|
case posLeft:
|
||||||
|
zopts += " -x0"
|
||||||
|
centerY()
|
||||||
|
case posRight:
|
||||||
|
zopts += " -x9999"
|
||||||
|
centerY()
|
||||||
|
case posCenter:
|
||||||
|
centerX()
|
||||||
|
centerY()
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := []string{
|
||||||
|
"#!/bin/sh",
|
||||||
|
fmt.Sprintf(`zellij run --name '' --floating --close-on-exit --cwd %s %s -- %s -c "%s $1; echo \$? > %s" || exit $?`, dir, zopts, sh, sh, fifo),
|
||||||
|
fmt.Sprintf(`exit $(cat %s)`, fifo),
|
||||||
|
}
|
||||||
|
temptemp := WriteTemporaryFile(lines, "\n")
|
||||||
|
defer os.Remove(temptemp)
|
||||||
|
|
||||||
|
return runProxy(argStr, func(temp string, needBash bool) (*exec.Cmd, error) {
|
||||||
|
return exec.Command(sh, temptemp, temp), nil
|
||||||
|
}, opts, true)
|
||||||
|
}
|
||||||
@@ -1442,10 +1442,14 @@ class TestGoFZF < TestBase
|
|||||||
writelines(['=' * 10_000 + '0123456789'])
|
writelines(['=' * 10_000 + '0123456789'])
|
||||||
[0, 3, 6].each do |off|
|
[0, 3, 6].each do |off|
|
||||||
tmux.prepare
|
tmux.prepare
|
||||||
tmux.send_keys "#{FZF} --hscroll-off=#{off} -q 0 < #{tempname}", :Enter
|
tmux.send_keys "#{FZF} --hscroll-off=#{off} -q 0 --bind space:toggle-hscroll < #{tempname}", :Enter
|
||||||
tmux.until { |lines| assert lines[-3]&.end_with?((0..off).to_a.join + '··') }
|
tmux.until { |lines| assert lines[-3]&.end_with?((0..off).to_a.join + '··') }
|
||||||
tmux.send_keys '9'
|
tmux.send_keys '9'
|
||||||
tmux.until { |lines| assert lines[-3]&.end_with?('789') }
|
tmux.until { |lines| assert lines[-3]&.end_with?('789') }
|
||||||
|
tmux.send_keys :Space
|
||||||
|
tmux.until { |lines| assert lines[-3]&.end_with?('=··') }
|
||||||
|
tmux.send_keys :Space
|
||||||
|
tmux.until { |lines| assert lines[-3]&.end_with?('789') }
|
||||||
tmux.send_keys :Enter
|
tmux.send_keys :Enter
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -2133,7 +2137,11 @@ class TestGoFZF < TestBase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_keep_right
|
def test_keep_right
|
||||||
tmux.send_keys "seq 10000 | #{FZF} --read0 --keep-right --no-multi-line", :Enter
|
tmux.send_keys "seq 10000 | #{FZF} --read0 --keep-right --no-multi-line --bind space:toggle-multi-line", :Enter
|
||||||
|
tmux.until { |lines| assert lines.any_include?('9999␊10000') }
|
||||||
|
tmux.send_keys :Space
|
||||||
|
tmux.until { |lines| assert lines.any_include?('> 1') }
|
||||||
|
tmux.send_keys :Space
|
||||||
tmux.until { |lines| assert lines.any_include?('9999␊10000') }
|
tmux.until { |lines| assert lines.any_include?('9999␊10000') }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user