summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2024-05-13 23:33:04 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2024-05-18 17:08:36 +0900
commit04dfb14e3215f578d44cdc117d9f19920af21faa (patch)
tree8ebb682c060dffa456588b7cbbbe3b720b199423
parentc24256cba33233ed707b428249a1a1c766034e8c (diff)
Do not 'become' inside a tmux popup
fzf --tmux center --bind 'enter:become:vim {}'
-rw-r--r--src/constants.go2
-rw-r--r--src/options.go5
-rw-r--r--src/terminal.go15
-rw-r--r--src/tmux.go23
4 files changed, 42 insertions, 3 deletions
diff --git a/src/constants.go b/src/constants.go
index dd2e870e..980e1583 100644
--- a/src/constants.go
+++ b/src/constants.go
@@ -67,9 +67,9 @@ const (
)
const (
- ExitCancel = -1
ExitOk = 0
ExitNoMatch = 1
ExitError = 2
+ ExitBecome = 126
ExitInterrupt = 130
)
diff --git a/src/options.go b/src/options.go
index 1024038d..ded8a92d 100644
--- a/src/options.go
+++ b/src/options.go
@@ -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":
diff --git a/src/terminal.go b/src/terminal.go
index 87178a77..530c9eb6 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -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)
diff --git a/src/tmux.go b/src/tmux.go
index ea1816a5..5cc970fa 100644
--- a/src/tmux.go
+++ b/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
}
}