m/fzf
1
0
mirror of https://github.com/junegunn/fzf.git synced 2025-11-15 06:43:47 -05:00

Add exclude-current action

https://github.com/junegunn/fzf/pull/4231#issuecomment-2646063208
This commit is contained in:
Junegunn Choi
2025-02-09 13:37:22 +09:00
parent 67dd7e1923
commit 1be1991299
4 changed files with 79 additions and 12 deletions

View File

@@ -1602,6 +1602,7 @@ A key or an event can be bound to one or more of the following actions.
\fBenable\-search\fR (enable search functionality) \fBenable\-search\fR (enable search functionality)
\fBend\-of\-line\fR \fIctrl\-e end\fR \fBend\-of\-line\fR \fIctrl\-e end\fR
\fBexclude\fR (exclude the current item or the selected items from the result) \fBexclude\fR (exclude the current item or the selected items from the result)
\fBexclude\-current\fR (exclude the current item from the result)
\fBexecute(...)\fR (see below for the details) \fBexecute(...)\fR (see below for the details)
\fBexecute\-silent(...)\fR (see below for the details) \fBexecute\-silent(...)\fR (see below for the details)
\fBfirst\fR (move to the first match; same as \fBpos(1)\fR) \fBfirst\fR (move to the first match; same as \fBpos(1)\fR)

View File

@@ -1605,6 +1605,8 @@ func parseActionList(masked string, original string, prevActions []*action, putA
appendAction(actBell) appendAction(actBell)
case "exclude": case "exclude":
appendAction(actExclude) appendAction(actExclude)
case "exclude-current":
appendAction(actExcludeCurrent)
default: default:
t := isExecuteAction(specLower) t := isExecuteAction(specLower)
if t == actIgnore { if t == actIgnore {

View File

@@ -585,6 +585,7 @@ const (
actHideHeader actHideHeader
actBell actBell
actExclude actExclude
actExcludeCurrent
) )
func (a actionType) Name() string { func (a actionType) Name() string {
@@ -4926,6 +4927,12 @@ func (t *Terminal) Loop() error {
} }
} }
changed = true changed = true
case actExcludeCurrent:
if item := t.currentItem(); item != nil {
denylist = append(denylist, item.Index())
t.deselectItem(item)
changed = true
}
case actExecute, actExecuteSilent: case actExecute, actExecuteSilent:
t.executeCommand(a.a, false, a.t == actExecuteSilent, false, false, "") t.executeCommand(a.a, false, a.t == actExecuteSilent, false, false, "")
case actExecuteMulti: case actExecuteMulti:

View File

@@ -1669,23 +1669,80 @@ class TestCore < TestInteractive
def test_exclude def test_exclude
tmux.send_keys %(seq 1000 | #{FZF} --multi --bind 'a:exclude,b:reload(seq 1000),c:reload-sync(seq 1000)'), :Enter tmux.send_keys %(seq 1000 | #{FZF} --multi --bind 'a:exclude,b:reload(seq 1000),c:reload-sync(seq 1000)'), :Enter
tmux.until { |lines| assert_equal 1000, lines.match_count } tmux.until do |lines|
tmux.until { |lines| assert_includes lines, '> 1' } assert_equal 1000, lines.match_count
assert_includes lines, '> 1'
end
tmux.send_keys :a tmux.send_keys :a
tmux.until { |lines| assert_includes lines, '> 2' } tmux.until do |lines|
tmux.until { |lines| assert_equal 999, lines.match_count } assert_includes lines, '> 2'
assert_equal 999, lines.match_count
end
tmux.send_keys :Up, :BTab, :BTab, :BTab, :a tmux.send_keys :Up, :BTab, :BTab, :BTab, :a
tmux.until { |lines| assert_equal 996, lines.match_count } tmux.until do |lines|
tmux.until { |lines| assert_includes lines, '> 9' } assert_equal 996, lines.match_count
assert_includes lines, '> 9'
end
tmux.send_keys :b tmux.send_keys :b
tmux.until { |lines| assert_equal 1000, lines.match_count } tmux.until do |lines|
tmux.until { |lines| assert_includes lines, '> 5' } assert_equal 1000, lines.match_count
assert_includes lines, '> 5'
end
tmux.send_keys :Tab, :Tab, :Tab, :a tmux.send_keys :Tab, :Tab, :Tab, :a
tmux.until { |lines| assert_equal 997, lines.match_count } tmux.until do |lines|
tmux.until { |lines| assert_includes lines, '> 2' } assert_equal 997, lines.match_count
assert_includes lines, '> 2'
end
tmux.send_keys :c tmux.send_keys :c
tmux.until { |lines| assert_equal 1000, lines.match_count } tmux.until do |lines|
tmux.until { |lines| assert_includes lines, '> 2' } assert_equal 1000, lines.match_count
assert_includes lines, '> 2'
end
# TODO: We should also check the behavior of 'exclude' during reloads
end
def test_exclude_current
tmux.send_keys %(seq 1000 | #{FZF} --multi --bind 'a:exclude-current,b:reload(seq 1000),c:reload-sync(seq 1000)'), :Enter
tmux.until do |lines|
assert_equal 1000, lines.match_count
assert_includes lines, '> 1'
end
tmux.send_keys :a
tmux.until do |lines|
assert_includes lines, '> 2'
assert_equal 999, lines.match_count
end
tmux.send_keys :Up, :BTab, :BTab, :BTab, :a
tmux.until do |lines|
assert_equal 998, lines.match_count
assert_equal 3, lines.select_count
assert_includes lines, '> 7'
end
tmux.send_keys :b
tmux.until do |lines|
assert_equal 1000, lines.match_count
assert_equal 0, lines.select_count
assert_includes lines, '> 5'
end
tmux.send_keys :Tab, :Tab, :Tab, :a
tmux.until do |lines|
assert_equal 999, lines.match_count
assert_equal 3, lines.select_count
assert_includes lines, '>>3'
end
tmux.send_keys :a
tmux.until do |lines|
assert_equal 998, lines.match_count
assert_equal 2, lines.select_count
assert_includes lines, '>>4'
end
tmux.send_keys :c
tmux.until do |lines|
assert_equal 1000, lines.match_count
assert_includes lines, '> 2'
end
# TODO: We should also check the behavior of 'exclude' during reloads # TODO: We should also check the behavior of 'exclude' during reloads
end end