Add transform-query(...) action

Test case authored by @SpicyLemon

Close #1930
Close #2465
Close #2559
Close #2509 (e.g. fzf --bind 'space:transform-query:printf %s%s {q} {}')
This commit is contained in:
Junegunn Choi
2022-12-28 00:05:31 +09:00
parent 4dbe45640a
commit 36d2bb332b
5 changed files with 51 additions and 7 deletions

View File

@@ -308,6 +308,7 @@ const (
actToggleSort
actTogglePreview
actTogglePreviewWrap
actTransformQuery
actPreview
actChangePreview
actChangePreviewWindow
@@ -2014,10 +2015,11 @@ func (t *Terminal) redraw(clear bool) {
t.printAll()
}
func (t *Terminal) executeCommand(template string, forcePlus bool, background bool) {
func (t *Terminal) executeCommand(template string, forcePlus bool, background bool, captureFirstLine bool) string {
line := ""
valid, list := t.buildPlusList(template, forcePlus)
if !valid {
return
return line
}
command := t.replacePlaceholder(template, forcePlus, string(t.input), list)
cmd := util.ExecCommand(command, false)
@@ -2033,11 +2035,21 @@ func (t *Terminal) executeCommand(template string, forcePlus bool, background bo
t.refresh()
} else {
t.tui.Pause(false)
cmd.Run()
if captureFirstLine {
out, _ := cmd.StdoutPipe()
reader := bufio.NewReader(out)
cmd.Start()
line, _ = reader.ReadString('\n')
line = strings.TrimRight(line, "\r\n")
cmd.Wait()
} else {
cmd.Run()
}
t.tui.Resume(false, false)
}
t.executing.Set(false)
cleanTemporaryFiles()
return line
}
func (t *Terminal) hasPreviewer() bool {
@@ -2610,9 +2622,9 @@ func (t *Terminal) Loop() {
switch a.t {
case actIgnore:
case actExecute, actExecuteSilent:
t.executeCommand(a.a, false, a.t == actExecuteSilent)
t.executeCommand(a.a, false, a.t == actExecuteSilent, false)
case actExecuteMulti:
t.executeCommand(a.a, true, false)
t.executeCommand(a.a, true, false, false)
case actInvalid:
t.mutex.Unlock()
return false
@@ -2635,6 +2647,10 @@ func (t *Terminal) Loop() {
t.previewed.version = 0
req(reqPreviewRefresh)
}
case actTransformQuery:
query := t.executeCommand(a.a, false, true, true)
t.input = []rune(query)
t.cx = len(t.input)
case actToggleSort:
t.sort = !t.sort
changed = true