From abb1d3af7b60633e3e9a4299f8ff4d74eef5c38a Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Mon, 29 Sep 2025 22:36:44 +0900 Subject: [PATCH] Add $FZF_RAW for conditional actions --- CHANGELOG.md | 16 ++++++++++++++++ man/man1/fzf.1 | 2 ++ src/terminal.go | 7 +++++++ test/test_raw.rb | 11 ++++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ec86bf6..334b7f64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,22 @@ fzf --raw --color hidden:red:strikethrough fzf --raw --color hidden:regular:red:strikethrough ``` +#### Conditional actions for raw mode + +You may want to perform different actions depending on whether the current item +is a match or not. For that, fzf now exports `$FZF_RAW` environment variable. + +It's: + +- Undefined if raw mode is disabled +- `1` if the current item is a match +- `0` otherwise + +```sh +# Do not allow selecting non-matching items +fzf --raw --bind 'enter:transform:[[ ${FZF_RAW-1} = 1 ]] && echo accept || echo bell' +``` + #### Leveraging raw mode in shell integration The `CTRL-R` binding (command history) now lets you toggle raw mode with diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 380078ae..ffd47f12 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -1377,6 +1377,8 @@ fzf exports the following environment variables to its child processes. .BR FZF_PREVIEW_LINES " Number of lines in the preview window" .br .BR FZF_PREVIEW_COLUMNS " Number of columns in the preview window" +.br +.BR FZF_RAW " Only in raw mode. 1 if the current item matches, 0 otherwise" .SH EXTENDED SEARCH MODE diff --git a/src/terminal.go b/src/terminal.go index cc0f2a54..45460451 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -1305,6 +1305,13 @@ func (t *Terminal) environImpl(forPreview bool) []string { if len(t.nthCurrent) > 0 { env = append(env, "FZF_NTH="+RangesToString(t.nthCurrent)) } + if t.raw { + val := "0" + if t.isCurrentItemMatch() { + val = "1" + } + env = append(env, "FZF_RAW="+val) + } inputState := "enabled" if t.inputless { inputState = "hidden" diff --git a/test/test_raw.rb b/test/test_raw.rb index 139b1950..eb0df4de 100644 --- a/test/test_raw.rb +++ b/test/test_raw.rb @@ -5,7 +5,7 @@ require_relative 'lib/common' # Testing raw mode class TestRaw < TestInteractive def test_raw_mode - tmux.send_keys %(seq 1000 | #{FZF} --raw --bind ctrl-x:toggle-raw,a:enable-raw,b:disable-raw --gutter '▌' --multi), :Enter + tmux.send_keys %(seq 1000 | #{FZF} --raw --bind ctrl-x:toggle-raw,a:enable-raw,b:disable-raw --gutter '▌' --multi --bind 'space:transform-prompt:echo "[[$FZF_RAW]] "'), :Enter tmux.until { assert_equal 1000, it.match_count } tmux.send_keys 1 @@ -64,11 +64,20 @@ class TestRaw < TestInteractive assert_includes it, '▖ 10' end + tmux.send_keys :Down, :Space + tmux.until { assert_includes it, '[[0]] 11' } + + tmux.send_keys :Up, :Space + tmux.until { assert_includes it, '[[1]] 11' } + tmux.send_keys 'b' tmux.until do assert_equal 1, it.select_count assert_includes it, '▌ 110' assert_includes it, '>>11' end + + tmux.send_keys :Space + tmux.until { assert_includes it, '[[]] 11' } end end