fzf icon indicating copy to clipboard operation
fzf copied to clipboard

`** + <TAB>` doesn't work in `bash` sometimes

Open ericrbg-harmonic opened this issue 4 months ago • 7 comments

Checklist

  • [x] I have read through the manual page (man fzf)
  • [x] I have searched through the existing issues
  • [x] For bug reports, I have checked if the bug is reproducible in the latest version of fzf

Output of fzf --version

0.65.1 (e5cd7f0a)

OS

  • [x] Linux
  • [ ] macOS
  • [ ] Windows
  • [ ] Etc.

Shell

  • [x] bash
  • [ ] zsh
  • [ ] fish

Problem / Steps to reproduce

In bash, on some commands, I cannot use ** <TAB>; I understand that if possible, it tries to use information to figure out whether to show files or folders, but it'd be far more important to me to see anything at all.

An example would be pytest **<TAB>, which no-ops. However, in a zsh shell, this works fine! So it's something specific to bash completions. I also imagine it's to do with whether a command is registered somehow or not; typing a bunch of characters (e.g. asdwehg **<TAB>) similarly works in zsh but not in bash

(This is not the easiest issue to search for - Github search breaks with even "**", but I did try!)

ericrbg-harmonic avatar Aug 21 '25 09:08 ericrbg-harmonic

Have you checked https://github.com/junegunn/fzf?tab=readme-ov-file#supported-commands?

junegunn avatar Aug 21 '25 10:08 junegunn

That's an interesting feature, but I think what I was looking for was above instead, referencing _fzf_setup_completion and the default settings:

https://github.com/junegunn/fzf/blob/f9d7877d8b01e58c53c5b7f746f02c8ab81b17d6/shell/completion.bash#L577-L594

However, this still doesn't work on a fairly minimal shell; I do import /usr/share/bash-completion/bash_completion which supposedly is a default? And that uses complete -D:

# set up dynamic completion loading
_completion_loader()
{
    # $1=_EmptycmD_ already for empty cmds in bash 4.3, set to it for earlier
    local cmd="${1:-_EmptycmD_}"
    __load_completion "$cmd" && return 124
    # Need to define *something*, otherwise there will be no completion at all.
    complete -F _minimal -- "$cmd" && return 124
} &&
    complete -D -F _completion_loader

Trying the naive approach of removing that && complete -D -F line didn't help.

ericrbg-harmonic avatar Aug 21 '25 11:08 ericrbg-harmonic

I was just looking at this now as well! For me, it was because I had placed the completion file in /usr/share/bash-completion/completions/fzf, instead of calling it directly in my .bashrc. This meant that the the default completion replacement wasn't triggered until I ran completion on the fzf command itself (fzf <tab>).

c-jason-kim avatar Aug 21 '25 20:08 c-jason-kim

Try this scenario:

# Start clean bash
bash --norc --noprofile

# Make sure to load fzf completion after bash_completion
source /usr/share/bash-completion/bash_completion
eval "$(fzf --bash)"

# No completion for pytest
complete | grep pytest
  # Empty

# fzf completion works
pytest **<tab>

# Press <tab> to trigger dynamic load
pytest <tab>

# Completion loaded
complete | grep pytest
  # complete -F _comp_cmd_pytest py.test
  # complete -F _comp_cmd_pytest py.test-3
  # complete -F _comp_cmd_pytest py.test-2
  # complete -F _comp_cmd_pytest pytest-3
  # complete -F _comp_cmd_pytest pytest-2
  # complete -F _fzf_path_completion pytest

# Still works
pytest **<tab>

Related: https://github.com/junegunn/fzf/pull/3958

junegunn avatar Aug 22 '25 13:08 junegunn

Thanks for that; I cannot replicate the fzf completion working at any point here. I followed all your steps directly.

Maybe it's my bash version? I'm on:

bash-5.2$ bash --version
GNU bash, version 5.2.21(1)-release (x86_64-pc-linux-gnu)

I also replicated this on:

bash-5.1$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

ericrbg-harmonic avatar Aug 25 '25 16:08 ericrbg-harmonic

I'm also using bash 5.2.

I cannot replicate the fzf completion working at any point here.

# Start clean bash
bash --norc --noprofile

# Make sure to load fzf completion after bash_completion
source /usr/share/bash-completion/bash_completion
eval "$(fzf --bash)"

What do you see when you run complete | grep fzf after running the above?

junegunn avatar Sep 04 '25 12:09 junegunn

(dev is some remote server)

❯ ssh dev -t "bash --norc --noprofile"
bash-5.2$ source /usr/share/bash-completion/bash_completion
bash-5.2$ export PATH="~/.fzf/bin:$PATH"
bash-5.2$ eval "$(fzf --bash)"
bash-5.2$ complete | grep fzf
complete -F _fzf_path_completion mv
complete -o default -o nospace -v -F _fzf_var_completion printenv
complete -o bashdefault -o default -F _fzf_path_completion diff3
complete -F _fzf_path_completion head
complete -F _fzf_path_completion uniq
complete -o bashdefault -o default -F _fzf_path_completion svn
complete -F _fzf_path_completion tee
complete -F _fzf_path_completion grep
complete -o bashdefault -o default -F _fzf_path_completion vi
complete -o bashdefault -o default -F _fzf_path_completion bat
complete -o bashdefault -o default -F _fzf_path_completion file
complete -o bashdefault -o default -F _fzf_path_completion hx
complete -o bashdefault -o default -F _fzf_path_completion view
complete -o bashdefault -o default -F _fzf_path_completion dirname
complete -o bashdefault -o default -F _fzf_path_completion hg
complete -a -F _fzf_alias_completion unalias
complete -o bashdefault -o default -F _fzf_complete_ssh ssh
complete -o bashdefault -o default -F _fzf_path_completion tar
complete -o default -F _fzf_opts_completion fzf-tmux
complete -F _fzf_path_completion cp
complete -o bashdefault -o default -F _fzf_path_completion rsync
complete -o nospace -F _fzf_dir_completion cd
complete -o bashdefault -o default -F _fzf_path_completion unzip
complete -o bashdefault -o default -F _fzf_path_completion git
complete -F _fzf_path_completion ln
complete -F _fzf_path_completion ld
complete -o bashdefault -o default -F _fzf_path_completion gunzip
complete -o bashdefault -o default -F _fzf_path_completion emacsclient
complete -F _fzf_path_completion tail
complete -F _fzf_path_completion ls
complete -o bashdefault -o default -F _fzf_path_completion nvim
complete -o nospace -F _fzf_dir_completion pushd
complete -o default -o nospace -v -F _fzf_var_completion unset
complete -o bashdefault -o default -F _fzf_proc_completion kill
complete -o bashdefault -o default -F _fzf_path_completion java
complete -o bashdefault -o default -F _fzf_path_completion open
complete -o bashdefault -o default -F _fzf_path_completion chown
complete -F _fzf_path_completion du
complete -F _fzf_path_completion wc
complete -o bashdefault -o default -F _fzf_path_completion gzip
complete -o bashdefault -o default -F _fzf_path_completion emacs
complete -o bashdefault -o default -F _fzf_path_completion javac
complete -F _fzf_path_completion ftp
complete -o default -F _fzf_opts_completion fzf
complete -F _fzf_path_completion rm
complete -o bashdefault -o default -F _fzf_path_completion basename
complete -o bashdefault -o default -F _fzf_path_completion bzip2
complete -o bashdefault -o default -F _fzf_path_completion mvim
complete -F _fzf_path_completion less
complete -o bashdefault -o default -F _fzf_path_completion bunzip2
complete -o default -o nospace -v -F _fzf_var_completion export
complete -o bashdefault -o default -F _fzf_path_completion gvim
complete -o bashdefault -o default -F _fzf_path_completion find
complete -o bashdefault -o default -F _fzf_path_completion zip
complete -o bashdefault -o default -F _fzf_path_completion scp
complete -o bashdefault -o default -F _fzf_path_completion ruby
complete -o bashdefault -o default -F _fzf_path_completion chmod
complete -o bashdefault -o default -F _fzf_path_completion code
complete -o bashdefault -o default -F _fzf_path_completion perl
complete -o bashdefault -o default -F _fzf_path_completion ex
complete -F _fzf_path_completion diff
complete -o bashdefault -o default -F _fzf_path_completion source
complete -o bashdefault -o default -F _fzf_path_completion curl
complete -o bashdefault -o default -F _fzf_path_completion gcc
complete -o bashdefault -o default -F _fzf_path_completion xdg-open
complete -o bashdefault -o default -F _fzf_path_completion jar
complete -F _fzf_path_completion cat
complete -F _fzf_path_completion awk
complete -o bashdefault -o default -F _fzf_path_completion sftp
complete -F _fzf_path_completion sort
complete -o bashdefault -o default -F _fzf_path_completion patch
complete -o bashdefault -o default -F _fzf_path_completion g++
complete -o bashdefault -o default -F _fzf_path_completion python
complete -F _fzf_path_completion sed
complete -F _fzf_dir_completion rmdir
complete -o bashdefault -o default -F _fzf_path_completion vim
complete -o bashdefault -o default -F _fzf_path_completion more

ericrbg-harmonic avatar Sep 04 '25 15:09 ericrbg-harmonic