summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2025-09-29 22:36:44 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2025-10-09 00:17:00 +0900
commit8f0c91545d308e534284b19edf61cbdb1ebbb315 (patch)
treee670530b324b8d9bfdde7ba5dc2c625cfbed8261
parent0eefcf348e7e56c6ee0f888384d63281e6678a7d (diff)
downloadfzf-8f0c91545d308e534284b19edf61cbdb1ebbb315.tar.gz
Add $FZF_RAW for conditional actions
-rw-r--r--CHANGELOG.md16
-rw-r--r--man/man1/fzf.12
-rw-r--r--src/terminal.go7
-rw-r--r--test/test_raw.rb11
4 files changed, 35 insertions, 1 deletions
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 4cba4ada..f3b9ccda 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