This script integrates the FZF "fuzzy finder" with the Clink command line editing enhancements for CMD.exe on Windows.
This also includes key bindings for git objects, powered by fzf (ported from fzf-git.sh).
Tip
Consider using clink-gizmos instead, which includes this script as well as many other useful scripts. If you use clink-gizmos, then you don't need clink-fzf -- clink-gizmos contains a collection of scripts, and clink-fzf contains a single script.
-
Copy the
fzf.luafile into your Clink scripts directory (you can runclink infoto find it, or see Location of Lua Scripts in the Clink docs for more info).- You can also copy the
fzf_git*.*files into your Clink scripts directory, to enable using fzf to browse git objects.
- You can also copy the
-
Either put
fzf.exein a directory listed in the system PATH environment variable, or runclink set fzf.exe_location <put_full_exe_name_here>to tell Clink where to find the FZF program. -
Set up key bindings.
- To use the default key bindings, run
clink set fzf.default_bindings true. - To use custom key bindings, add them to your .inputrc file (see Key Bindings).
- To use the default key bindings, run
For detailed information on using FZF, please refer to the FZF documentation.
Here are the default key bindings for fzf powered completions in Clink, if you've enabled the fzf.default_bindings setting:
| Key | Description |
|---|---|
| Ctrl-T | Lists files recursively; choose one or multiple to insert them. |
| Ctrl-R | Lists history entries; choose one to insert it Press Del in the list to delete the selected history entry. Press Ctrl-R in the history list to toggle fzf's sorting mode. |
| Alt-C | Lists subdirectories; choose one to 'cd /d' to it. |
| Alt-B | Lists key bindings; choose one to invoke it. |
| Tab | Uses fzf to filter match completions, but only when preceded by '**' (recursive). |
| Ctrl-Space | Uses fzf to filter match completions (and supports '**' for recursive). |
You can use **Tab to list files recursively under the directory.
For example:
notepad **lists files recursively under the current directory.notepad foo**lists files recursively under the current directory, and usesfooas the search phrase.notepad bar\foo**lists files recursively under thebardirectory, and usesfooas the search phrase.
Here are the default key bindings for git objects in Clink, unless you've disabled the fzf_git.default_bindings setting:
| Key | Description |
|---|---|
| Ctrl-G,? | Show key bindings for fzf_git |
| Ctrl-G,Ctrl-F | Use fzf for Files |
| Ctrl-G,Ctrl-B | Use fzf for Branches |
| Ctrl-G,Ctrl-T | Use fzf for Tags |
| Ctrl-G,Ctrl-R | Use fzf for Remotes |
| Ctrl-G,Ctrl-H | Use fzf for commit Hashes |
| Ctrl-G,Ctrl-S | Use fzf for Stashes |
| Ctrl-G,Ctrl-L | Use fzf for reflogs |
| Ctrl-G,Ctrl-W | Use fzf for Worktrees |
| Ctrl-G,Ctrl-E | Use fzf for Each ref (git for-each-ref) |
You can use your own custom key bindings if you prefer.
Run clink set fzf.default_bindings false and add key bindings to your .inputrc file manually.
Run clink echo to find key bindings strings. See Key Bindings in the Clink documentation for more information on how to set key bindings.
The default key bindings for FZF are listed here in .inputrc file format for convenience:
# Default key bindings for fzf with Clink.
"\C-t": "luafunc:fzf_file" # Ctrl-T lists files recursively; choose one or multiple to insert them.
"\C-r": "luafunc:fzf_history" # Ctrl-R lists history entries; choose one to insert it.
"\M-c": "luafunc:fzf_directory" # Alt-C lists subdirectories; choose one to 'cd /d' to it.
"\M-b": "luafunc:fzf_bindings" # Alt-B lists key bindings; choose one to invoke it.
"\t": "luafunc:fzf_complete" # Tab uses fzf to filter match completions, but only when preceded by '**' (recursive).
"\e[27;5;32~": "luafunc:fzf_complete_force" # Ctrl-Space uses fzf to filter match completions (and supports '**' for recursive).The default key bindings for git objects are listed here in .inputrc file format for convenience:
# Default key bindings for fzf_git with Clink.
"\C-g?": "luafunc:fzf_git_help" # Ctrl-G,? shows key bindings for fzf_git.
"\C-g\C-f": "luafunc:fzf_git_files" # Ctrl-G,Ctrl-F uses fzf for Files.
"\C-g\C-b": "luafunc:fzf_git_branches" # Ctrl-G,Ctrl-B uses fzf for Branches.
"\C-g\C-t": "luafunc:fzf_git_tags" # Ctrl-G,Ctrl-T uses fzf for Tags.
"\C-g\C-r": "luafunc:fzf_git_remotes" # Ctrl-G,Ctrl-R uses fzf for Remotes.
"\C-g\C-h": "luafunc:fzf_git_commit_hashes" # Ctrl-G,Ctrl-H uses fzf for commit Hashes.
"\C-g\C-s": "luafunc:fzf_git_stashes" # Ctrl-G,Ctrl-S uses fzf for Stashes.
"\C-g\C-l": "luafunc:fzf_git_reflogs" # Ctrl-G,Ctrl-L uses fzf for reflogs.
"\C-g\C-w": "luafunc:fzf_git_worktrees" # Ctrl-G,Ctrl-W uses fzf for Worktrees.
"\C-g\C-e": "luafunc:fzf_git_eachref" # Ctrl-G,Ctrl-E uses fzf for Eachref (git for-each-ref).The following commands are also available for binding to keys:
| Command | Description |
|---|---|
"luafunc:fzf_menucomplete" |
Use fzf for completion after ** otherwise use the menu-complete command. |
"luafunc:fzf_oldmenucomplete" |
Use fzf for completion after ** otherwise use the old-menu-complete command. |
You can specify FZF options for each of the different commands:
| Env Var Name | Description |
|---|---|
FZF_DEFAULT_OPTS |
Options that are applied to all fzf invocations. |
FZF_CTRL_T_OPTS |
Options for Ctrl-T (the "luafunc:fzf_file" function). |
FZF_CTRL_R_OPTS |
Options for Ctrl-R (the "luafunc:fzf_history" function). |
FZF_ALT_C_OPTS |
Options for Alt-C (the "luafunc:fzf_directory" function). |
FZF_BINDINGS_OPTS |
Options for Alt-B (the "luafunc:fzf_bindings" function). |
FZF_COMPLETION_OPTS |
Options for the completion functions ("luafunc:fzf_complete", "luafunc:fzf_menucomplete", "luafunc:fzf_oldmenucomplete", "luafunc:fzf_selectcomplete", etc). |
Tip
The options in FZF_DEFAULT_OPTS are added to all fzf commands.
The options in the other ..._OPTS environment variables are added only to their corresponding fzf commands.
You can specify FZF options for the git object browsing commands:
| Env Var Name | Description |
|---|---|
BAT_STYLE |
Defines what will be passed to bat via its --style="..." flag. |
FZF_GIT_CAT |
Defines the preview command used for displaying files. |
FZF_GIT_COLOR |
Control colors in the list: always (default) shows colors, never suppresses colors. |
FZF_GIT_PAGER |
Specifies the pager command for the preview window. (This is not used yet.) |
FZF_GIT_PREVIEW_COLOR |
Control colors in the preview window: always (default) shows colors, never suppresses colors. |
FZF_GIT_DEFAULT_COLORS |
Defines the default colors for fzf. This is passed to fzf via the --color flag. |
FZF_GIT_EDITOR |
Defines the command for editing a file. Falls back to %EDITOR% or notepad.exe if not set. |
You can specify commands to run for collecting files or directories:
| Env Var Name | Description |
|---|---|
FZF_CTRL_T_COMMAND |
Command to run for collecting files for Ctrl-T (the "luafunc:fzf_file" function). |
FZF_ALT_C_COMMAND |
Command to run for collecting directories for Alt-C (the "luafunc:fzf_directory" function). |
You can optionally have file icons show up in FZF completion lists in Clink (but not for the git object fzf commands).
Requirements:
Configure the following environment variables:
set FZF_CTRL_T_COMMAND=dirx.exe /b /s /X:d /a:-s-h --bare-relative --icons=always --utf8 -- $dirset FZF_ALT_C_COMMAND=dirx.exe /b /s /X:d /a:d-s-h --bare-relative --icons=always --utf8 -- $dirset FZF_ICON_WIDTH=2
If you want it to recurse into hidden directories, then remove the /X:d part from the commands in the environment variables.
If you want it to list hidden files and directories, then remove the -h part at the end of the /a: flags in the environment variables.
You can specify a preview command for FZF.
If you have enabled icons, then replace each {} with {2..}.
The examples also let you toggle between different preview window sizes with Ctrl-/.
The command will show the contents of files with the Ctrl-T hotkey; it assumes you have bat installed and available in the %PATH% environment variable.
set FZF_CTRL_T_OPTS=--preview-window "right:40%,border-left" --bind "ctrl-/:change-preview-window(right:70%|hidden|)" --preview "bat --force-colorization --style=numbers,changes --line-range=:500 -- {}"
This command will show the contents of folders with the Alt-C hotkey; it assumes you have dirx installed and available in the %PATH% environment variable.
set FZF_ALT_C_OPTS=--preview-window "right:40%,border-left" --bind "ctrl-/:change-preview-window(right:70%|hidden|)" --preview "dirx -b -s --bare-relative --utf8 --level=3 --tree --icons=always -- {}"
The sample script fzf-preview.cmd can be used to preview image files. It assumes you have both chafa and bat installed and available in the %PATH% environment variable.
To use the sample script for previewing image files, replace the --preview "..." part of the examples above with either:
--preview "fzf-preview.cmd {}"if you're not using icons, or--preview "fzf-preview.cmd {2..}"if you're using icons.
If your terminal supports sixels, you can also run set CLINK_FZF_PREVIEW_SIXELS=1 to tell the fzf-preview.cmd script to tell chafa to use sixels.
If you want to customize the flags for chafa and bat:
- Make a copy of the script.
- Customize the copy instead of the original. That way, your changes won't get overwritten when you update clink-fzf (or clink-gizmos).
- Replace
fzf-preview.cmdin the examples above with the filename of your customized copy.
FZF assumes UTF8 stdin, but native Windows programs assume stdin and stdout are in the console's current codepage, which is not UTF8 by default.
The fzf.lua and fzf_git.lua scripts automatically save the current codepage and switch to UTF8 before invoking FZF, and then restore the original codepage after FZF exits. This should ensure that users don't need to apply any custom workarounds to get Unicode text to show up in FZF.
For curious readers, here are related issues in FZF: