mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-11-25 06:07:42 +00:00
Do not 'become' inside a tmux popup
fzf --tmux center --bind 'enter:become:vim {}'
This commit is contained in:
parent
c24256cba3
commit
04dfb14e32
@ -67,9 +67,9 @@ const (
|
||||
)
|
||||
|
||||
const (
|
||||
ExitCancel = -1
|
||||
ExitOk = 0
|
||||
ExitNoMatch = 1
|
||||
ExitError = 2
|
||||
ExitBecome = 126
|
||||
ExitInterrupt = 130
|
||||
)
|
||||
|
@ -381,6 +381,7 @@ type Options struct {
|
||||
Input chan string
|
||||
Output chan string
|
||||
Tmux *tmuxOptions
|
||||
TmuxScript string
|
||||
Bash bool
|
||||
Zsh bool
|
||||
Fish bool
|
||||
@ -1882,6 +1883,10 @@ func parseOptions(opts *Options, allArgs []string) error {
|
||||
}
|
||||
case "--no-tmux":
|
||||
opts.Tmux = nil
|
||||
case "--tmux-script":
|
||||
if opts.TmuxScript, err = nextString(allArgs, &i, ""); err != nil {
|
||||
return err
|
||||
}
|
||||
case "-x", "--extended":
|
||||
opts.Extended = true
|
||||
case "-e", "--exact":
|
||||
|
@ -312,6 +312,7 @@ type Terminal struct {
|
||||
forcePreview bool
|
||||
clickHeaderLine int
|
||||
clickHeaderColumn int
|
||||
tmuxScript string
|
||||
}
|
||||
|
||||
type selectedItem struct {
|
||||
@ -351,6 +352,7 @@ const (
|
||||
reqPreviewDisplay
|
||||
reqPreviewRefresh
|
||||
reqPreviewDelayed
|
||||
reqBecome
|
||||
reqQuit
|
||||
reqFatal
|
||||
)
|
||||
@ -782,6 +784,7 @@ func NewTerminal(opts *Options, eventBox *util.EventBox, executor *util.Executor
|
||||
jumpLabels: opts.JumpLabels,
|
||||
printer: opts.Printer,
|
||||
printsep: opts.PrintSep,
|
||||
tmuxScript: opts.TmuxScript,
|
||||
merger: EmptyMerger(0),
|
||||
selected: make(map[int32]selectedItem),
|
||||
reqBox: util.NewEventBox(),
|
||||
@ -3299,6 +3302,9 @@ func (t *Terminal) Loop() error {
|
||||
return ExitOk
|
||||
})
|
||||
return
|
||||
case reqBecome:
|
||||
exit(func() int { return ExitBecome })
|
||||
return
|
||||
case reqQuit:
|
||||
exit(func() int { return ExitInterrupt })
|
||||
return
|
||||
@ -3473,7 +3479,14 @@ func (t *Terminal) Loop() error {
|
||||
if t.history != nil {
|
||||
t.history.append(string(t.input))
|
||||
}
|
||||
t.executor.Become(t.ttyin, t.environ(), command)
|
||||
|
||||
if len(t.tmuxScript) > 0 {
|
||||
data := strings.Join(append([]string{command}, t.environ()...), "\x00")
|
||||
os.WriteFile(t.tmuxScript, []byte(data), 0600)
|
||||
req(reqBecome)
|
||||
} else {
|
||||
t.executor.Become(t.ttyin, t.environ(), command)
|
||||
}
|
||||
}
|
||||
case actExecute, actExecuteSilent:
|
||||
t.executeCommand(a.a, false, a.t == actExecuteSilent, false, false)
|
||||
|
23
src/tmux.go
23
src/tmux.go
@ -2,6 +2,7 @@ package fzf
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
@ -45,6 +46,7 @@ func runTmux(args []string, opts *Options) (int, error) {
|
||||
// %q formatting escapes $'foo\nbar' to "foo\nbar"
|
||||
argStr += " " + escapeSingleQuote(arg)
|
||||
}
|
||||
argStr += ` --tmux-script "$0"`
|
||||
|
||||
// Build command
|
||||
var command string
|
||||
@ -141,7 +143,26 @@ func runTmux(args []string, opts *Options) (int, error) {
|
||||
cmd := exec.Command("tmux", tmuxArgs...)
|
||||
if err := cmd.Run(); err != nil {
|
||||
if exitError, ok := err.(*exec.ExitError); ok {
|
||||
return exitError.ExitCode(), err
|
||||
code := exitError.ExitCode()
|
||||
if code == ExitBecome {
|
||||
data, err := os.ReadFile(temp)
|
||||
if err != nil {
|
||||
return ExitError, err
|
||||
}
|
||||
elems := strings.Split(string(data), "\x00")
|
||||
if len(elems) < 1 {
|
||||
return ExitError, errors.New("invalid become command")
|
||||
}
|
||||
command := elems[0]
|
||||
env := []string{}
|
||||
if len(elems) > 1 {
|
||||
env = elems[1:]
|
||||
}
|
||||
os.Remove(temp)
|
||||
executor := util.NewExecutor(opts.WithShell)
|
||||
executor.Become(tui.TtyIn(), env, command)
|
||||
}
|
||||
return code, err
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user