Welcome to Vifm Q&A, where you can ask questions about using Vifm. Registration is optional, anonymous posts are moderated. E-mail and GitHub logins are enabled.
0 votes
in vifm by

It's basically a file/dir cder with fzf I'm trying to make the last conditional part working that checks wether the fzf picked output is a file or a dir and use the command cd OR goto accordinglly

Here's the code:

command! FZFCd : set noquickview
                \| let $FZF_PICK = term('fd --type directory | fzf-tmux --ansi 
                \  --bind "start:transform-header(echo ${Cwd})+execute-silent(echo "$Cwd" | tee /tmp/fpicker-dir)" 
                \  --bind "ctrl-r:transform([[ -n {q} ]] && echo \"execute-silent(echo {q} | tee /tmp/fpicker-dir)\" || echo \"execute-silent(echo ${Cwd} | tee /tmp/fpicker-dir)\")+transform-query(cat /tmp/fpicker-dir)+transform-header(cat /tmp/fpicker-dir)+transform:[[ {fzf:prompt} =~ Files ]] &&
                \  echo \"reload(fd --hidden --type file . {q})+transform-header(cat /tmp/fpicker-dir)+change-query()\" ||
                \  echo \"reload(fd --hidden --type directory . {q})+transform-header(cat /tmp/fpicker-dir)+change-query()\"" 
                \  --bind "ctrl-e:execute-silent(echo \"/\" > /tmp/fpicker-dir)+transform-header(cat /tmp/fpicker-dir)+transform:[[ {fzf:prompt} =~ Files ]] &&
                \    echo \"reload(fd --hidden --type file . \"/\")+transform-header(cat /tmp/fpicker-dir)\" ||
                \    echo \"reload(fd --hidden --type directory . \"/\")+transform-header(cat /tmp/fpicker-dir)\"" 
                \  --bind "ctrl-d:execute-silent(echo \"/home/pong/\" > /tmp/fpicker-dir)+transform-header(cat /tmp/fpicker-dir)+transform:[[ {fzf:prompt} =~ Files ]] &&
                \    echo \"reload(fd --hidden --type file . \"/home/pong/.config\")+transform-header(cat /tmp/fpicker-dir)\" ||
                \    echo \"reload(fd --hidden --type directory . \"/home/pong/.config\")+transform-header(cat /tmp/fpicker-dir)\"" 
                \  --bind "ctrl-b:execute-silent(echo \"$Cwd\" > /tmp/fpicker-dir)+transform-header(cat /tmp/fpicker-dir)+transform:[[ {fzf:prompt} =~ Files ]] &&
                \    echo \"reload(fd --hidden --type file . \"/home/pong/.config\")+transform-header(cat /tmp/fpicker-dir)\" ||
                \    echo \"reload(fd --hidden --type directory . \"/home/pong/.config\")+transform-header(cat /tmp/fpicker-dir)\"" 
                \  --bind "ctrl-t:transform(echo {fzf:query} > /tmp/fzf-q)+transform-query(cat /tmp/fpicker-dir)+transform:[[ ! {fzf:prompt} =~ Files ]] && 
                \    echo \"change-prompt(Files >)+reload(fd --hidden --type file . {q})+transform-header(cat /tmp/fpicker-dir)+transform-query(cat /tmp/fzf-q)\" ||
                \    echo \"change-prompt(Dirs  >)+reload(fd --hidden --type directory . {q})+transform-header(cat /tmp/fpicker-dir)+transform-query(cat /tmp/fzf-q)\"" 
                \  --preview "[[ \$FZF_PROMPT =~ Files ]] && bat --color=always {} || tree -C {}" 
                \  --header "My new header"
                \  --prompt "Dirs  >" 
                \  --border "rounded" 
                \  --border-label "CD Tool"')
                \| if filetype('$FZF_PICK') == "dir"
                \|     echo "Its a dir!"
                \|     execute 'cd' fnameescape($FZF_PICK)
                \| else 
                \|     echo "Its a file!"
                \|     execute 'goto' fnameescape($FZF_PICK)
                \| endif

1 Answer

0 votes
by
selected by
 
Best answer

filetype() doesn't accept a path, it only handles indices in file view (maybe it should handle paths though). You need to use shell for this as in:

if system('[ -d "$FZF_PICK" ] && echo dir') == 'dir'
by

Ah yeah that just did the job! didn't notice system() in vifm's manual and all words language and terminologies are so mixed up it's almost always confusing!
Thank you very much for the help!

by

In the next version (v0.14), filetype() will accept paths.

If you would like to make a bug report or feature request consider using GitHub, SourceForge or e-mail. Posting such things here is acceptable, but this is not a perfect place for them.
...