mirror of
https://github.com/junegunn/fzf.git
synced 2026-10-12 08:00:20 +08:00
Separate floating pane border label from pane title
--border-label of a tmux floating pane was stored in the pane title and
read back by pane-border-format as '#{pane_title}', so any program in the
pane could replace the border text by setting the title. On Zellij the
name was only set when the pane was created. Either way the built-in
label actions could not touch it, as fzf draws no border of its own
there.
- tmux: hold the label in pane-scoped @fzf-border-label. Set the option
even without a label, so a later change-border-label has somewhere to
write. Drop select-pane -T; the pane title is left to the user
- Zellij: run 'zellij action rename-pane' on label change. 'zellij run'
has no option to set the environment of the new pane, so the command
exports the target itself
- change-border-label and transform-border-label now update the native
border, through the setter nativeLabelSetter picks by multiplexer
- The pane is named in a __FZF_INTERNAL_ variable that runProxy withholds
from the environment replay, so the same name in the outer environment
cannot redirect the update to another pane
This commit is contained in:
9 files changed
+279
-57
No files matched your search
+22
-5
@@ -1,11 +1,20 @@
|
||||
package fzf
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os/exec"
|
||||
|
||||
"github.com/junegunn/fzf/src/tui"
|
||||
)
|
||||
|
||||
const zellijBorderLabelEnv = internalEnvPrefix + "ZELLIJ_LABEL_PANE"
|
||||
|
||||
// Errors are ignored. The pane may be gone
|
||||
func setZellijBorderLabel(pane string, label string) {
|
||||
// Strip ANSI sequences fzf would otherwise render itself
|
||||
label, _, _ = extractColor(label, nil, nil)
|
||||
// '--' so that a label starting with a hyphen is not parsed as a flag
|
||||
exec.Command("zellij", "action", "rename-pane", "-p", pane, "--", label).Run()
|
||||
}
|
||||
|
||||
func runZellij(args []string, opts *Options) (int, error) {
|
||||
// Use the native Zellij border by default, consistent with tmux, so that
|
||||
// the pane can be moved and resized with the mouse. Set before
|
||||
@@ -20,6 +29,7 @@ func runZellij(args []string, opts *Options) (int, error) {
|
||||
"run", "--floating", "--close-on-exit", "--block-until-exit",
|
||||
"--cwd", dir,
|
||||
}
|
||||
ownsLabel := false
|
||||
if !opts.Tmux.border {
|
||||
zellijArgs = append(zellijArgs, "--borderless", "true")
|
||||
} else {
|
||||
@@ -33,8 +43,8 @@ func runZellij(args []string, opts *Options) (int, error) {
|
||||
// stripping ANSI sequences fzf would otherwise render itself.
|
||||
// --border-label-pos is ignored.
|
||||
label := ""
|
||||
if opts.BorderShape == tui.BorderUndefined || opts.BorderShape == tui.BorderLine ||
|
||||
opts.BorderShape == tui.BorderNone {
|
||||
ownsLabel = noBorderSpecified(opts)
|
||||
if ownsLabel {
|
||||
label, _, _ = extractColor(opts.BorderLabel.label, nil, nil)
|
||||
}
|
||||
zellijArgs = append(zellijArgs, "--name="+label)
|
||||
@@ -60,7 +70,14 @@ func runZellij(args []string, opts *Options) (int, error) {
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
zellijArgs = append(zellijArgs, sh, temp)
|
||||
if ownsLabel {
|
||||
// 'zellij run' cannot set the new pane's environment, so the
|
||||
// command exports it itself. exec avoids a lingering shell
|
||||
zellijArgs = append(zellijArgs, sh, "-c", fmt.Sprintf(`export %s="$ZELLIJ_PANE_ID"; exec %s %s`,
|
||||
zellijBorderLabelEnv, escapeSingleQuote(sh), escapeSingleQuote(temp)))
|
||||
} else {
|
||||
zellijArgs = append(zellijArgs, sh, temp)
|
||||
}
|
||||
return exec.Command("zellij", zellijArgs...), nil
|
||||
}, opts, true)
|
||||
}
|
||||
Reference in new issue
Block a user