🚀 A next-generation cd command with your interactive filter
Alternatives To Enhancd
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Ripgrep41,6463323464 days ago37November 26, 202371unlicenseRust
ripgrep recursively searches directories for a regex pattern while respecting your gitignore
Pm239,9865,3701,8688 days ago278March 15, 2023855otherJavaScript
Node.js Production Process Manager with a built-in Load Balancer.
Fx17,717112124 days ago61November 10, 20235mitGo
Terminal JSON viewer & processor
Spicetify Cli15,550
2 days ago47April 06, 202217lgpl-2.1JavaScript
Command-line tool to customize Spotify client. Supports Windows, MacOS, and Linux.
11 days ago30August 04, 202363mitRust
A smarter cd command. Supports all major shells.
17 days ago1January 19, 202153gpl-3.0Go
Tool for shell commands execution, visualization and alerting. Configured with a simple YAML file.
2 months ago1February 27, 2018107gpl-3.0Python
q - Run SQL directly on delimited files and multi-file sqlite databases
an hour ago168November 22, 2023188mitRust
A new way to see and navigate directory trees : https://dystroy.org/broot
Tokei9,125712a day ago71March 27, 2023145otherRust
Count your code, quickly.
Mac Cli8,406
10 months agomitShell
 macOS command line tool for developers – The ultimate tool to manage your Mac. It provides a huge set of command line commands that automatize the usage of your Mac.
Alternatives To Enhancd
Select To Compare

Alternative Project Comparisons


🚀 🚀 🚀

enhancd is an enhanced cd command integrated with a command line fuzzy finder based on UNIX concept.

Typing cd in your console, enhancd provides you a new window to visit a directory. The basic UX of enhancd is almost same as builtin cd command but totally differenent in that you can choose where to go from the list of visited directories in the past. You can select the directory you want to visit using your favorite command line interactive filter (e.g. fzf). It just extends original cd command but brings you completely new experience.

Getting Started


Trying enhancd on the current shell, you need to run this command:

source ./init.sh

After that, cd is aliased to __enhancd::cd so you can use enhancd feature by typing cd as usual.

Using enhancd feature requires a command line fuzzy finder tool (as known as an interactive filter), for example, fzf. The ENHANCD_FILTER is the command name for interactive filters. It is a colon-separated list of executables. Each arguments can be also included to the list. It searches from the top of the list and uses the first installed one. A default value is fzy:fzf:peco:sk:zf.

Changing the order of each executables in the list, you can change the interactive filter command used by enhancd. Lets configure whats your favorite one!

$ export ENHANCD_FILTER="fzf --height 40%:fzy"


The usage of cd command powered by enhancd is almost same as built-in cd command.

$ cd [-|..|.] <dir>
Argument Behavior
(none) List all directories visited in the past. The HOME is always shown at a top of the list as builtin cd does.
<dir> (exists in cwd) Go to dir without the filter command (same as builtin cd)
<dir> (not exists in cwd) Find directories matched with dir or being similar to dir and then pass them to the filter command. A directory named "afx" is not in the current directory but enhancd cd can show where to go from the visited log.
- List latest 10 directories
.. List all parent directories of cwd
. List all sub directories in cwd

Hyphen (-)

List latest 10 directories. This is useful for choosing the directory recently visited only. The number of directories shown as the choices can be changed as you like by editing ENHANCD_HYPHEN_NUM (Defaults to 10).

$ cd -
> /Users/babarot/src/github.com/b4b4r07/enhancd

To disable this feature, set ENHANCD_ENABLE_HYPHEN to false.

Double-dot (..)

List all parent directories of the current working directory to quickly go back to any directory instead of typing cd ../../.. redundantly.

Let's say you're in ~/src/github.com/b4b4r07/enhancd. The result of cd .. will be:

$ cd ..
> /Users/babarot/src/github.com/b4b4r07

To disable this feature, set ENHANCD_ENABLE_DOUBLE_DOT to false.

Single-dot (.)

List all sub directories recursively located under the current directory. The built-in cd command does nothing even if a dot (.) is passed. Whereas, in enhancd cd, it's useful for visiting any sub directory easily (the example below is that if you're in "enhancd" directory):

$ cd .
> .github/

This would be very useful to find a directory you want to visit within current directory. It uses find command internally to list directories but it would be good to install fd (sharkdp/fd) command. It'll be more fast and also be included hidden directories into the list if fd is used.

To disable this feature, set ENHANCD_ENABLE_SINGLE_DOT to false.


💡 Zsh only.

enhancd allows you to pass one or multiple directory paths to cd commands like this:

$ (paths) | cd


$ cd --help
Usage: cd [OPTIONS] [dir]

  -h, --help          Show help message
  -q                  (default) quiet, no output or use of hooks
  -s                  (default) refuse to use paths with symlinks
  -L                  (default) retain symbolic links ignoring CHASE_LINKS
  -P                  (default) resolve symbolic links as CHASE_LINKS

Version: 2.3.0

In enhancd, all options are defined at a configuration file (config.ltsv). This mechanism allows you to add what you want as new option or delete unneeded default options. It uses LTSV (Labeled Tab-Separated Values) format.

For example, let's say you want to use ghq list as custom inputs for cd command. In this case, all you have to do is just to add this one line to your any config.ltsv:

short:-G	long:--ghq	desc:Show ghq path	func:ghq list --full-path	condition:which ghq
Label Description
short (*) a short option (e.g. -G)
long (*) a long option (e.g. --ghq)
desc a description for the option
func (*) a command which returns directory list (e.g. ghq list --full-path)
condition a command which determine that the option should be implemented or not (e.g. which ghq)
format a string which indicates how to format a line selected by the filter before passing cd command. % is replaced as a selected line and then passed to cd command (e.g. $HOME/src/%). This is useful for the case that input sources for the interactive filter are not a full-path.

Note: *: A required key. But either short or long is good enough.


enhancd loads these config.ltsv files located in:

  1. $ENHANCD_ROOT/config.ltsv
  2. $ENHANCD_DIR/config.ltsv
  3. $HOME/.config/enhancd/config.ltsv

Thanks to this feature, it's easy to add your custom option as you hope.



enhancd is consists of a bunch of shell scripts. Running this command to clone repo and to run an entrypoint script enables you to try it out.

git clone https://github.com/b4b4r07/enhancd && source enhancd/init.sh

Using package manager

Using AFX for installing and managing shell plugins is heavily recommended now because it's better solution to manage enhancd and your favorite interactive filter at the same way.

- name: b4b4r07/enhancd
  description: A next-generation cd command with your interactive filter
  owner: b4b4r07
  repo: enhancd
        fzf --preview 'exa -al --tree --level 1 --group-directories-first --git-ignore
        --header --git --no-user --no-time --no-filesize --no-permissions {}'
        --preview-window right,50% --height 35% --reverse --ansi
    - init.sh
- name: junegunn/fzf
  description: A command-line fuzzy finder
  owner: junegunn
  repo: fzf
        - ./install --bin --no-update-rc --no-key-bindings
    - from: 'bin/fzf'
    - from: 'bin/fzf-tmux'
    - shell/completion.zsh
      FZF_DEFAULT_COMMAND: fd --type f
        --height 75% --multi --reverse --margin=0,1
        --bind ctrl-f:page-down,ctrl-b:page-up,ctrl-/:toggle-preview
        --bind pgdn:preview-page-down,pgup:preview-page-up
        --marker="" --pointer="" --prompt=" "
        --no-separator --scrollbar=""
        --color bg+:#262626,fg+:#dadada,hl:#f09479,hl+:#f09479
        --color border:#303030,info:#cfcfb0,header:#80a0ff,spinner:#36c692
        --color prompt:#87afff,pointer:#ff5189,marker:#f09479
      FZF_CTRL_T_COMMAND: rg --files --hidden --follow --glob "!.git/*"
      FZF_CTRL_T_OPTS: --preview "bat --color=always --style=header,grid --line-range :100 {}"
      FZF_ALT_C_COMMAND: fd --type d
      FZF_ALT_C_OPTS: --preview "tree -C {} | head -100"


$ afx install

For more details, see the full documentation.

Other installations are here!
Case Installation


Install enhancd with Fig on zsh, bash, or fish with just one click.


  1. Run cloning on the console.

    $ git clone https://github.com/b4b4r07/enhancd.git /path/to/enhancd
  2. Add this line to your bashrc.

    # ~/.bashrc
    source /path/to/enhancd/init.sh

zplug (powerful plugin manager for zsh):

Add this line to your zshrc

# .zshrc
zplug "b4b4r07/enhancd", use:init.sh

and then run this command.

$ zplug install

oh-my-zsh user:

Clone repo,

$ git clone https://github.com/b4b4r07/enhancd.git $ZSH_CUSTOM/plugins/enhancd

and then load as a plugin in your zshrc.

# .zshrc


System Requirements:

Install with Fisher:

$ fisher install b4b4r07/enhancd



A directory to have enhancd.log and config.ltsv. It defaults to ~/.enhancd.


A list of executable commands (interactive filter such as fzf) concatenated with ':' like PATH. For example:

export ENHANCD_FILTER="/usr/local/bin/sk:fzf --ansi:fzy:non-existing-filter"

The command found by searching in order from the first is used as an interactive filter of enhancd. If there is nothing any commands, it only provides a functionality as a built-in cd command.


A command name to trigger enhancd cd command. It defaults to cd. By default, enhancd aliases cd to enhancd one. So you want to prevent it, you need to set this environemnt variable.

After set, you need to set restart your shell to apply the changes.

$ export ENHANCD_COMMAND=ecd
$ source /path/to/init.sh

Enable to list parent directories when .. is given. Defaults to true.

ref: Double-dot (..)


Enable to list sub directories in the current directory when . is given. Defaults to true.

ref: Single-dot (.)

Note Added in #188 #198


Enable to list visited directories limited latest 10 cases when - is given. Defaults to true.

ref: Single-dot (.)


Enable to use the interactive filter when no argument is given. When set it to false, cd just changes the current working directory to home directory. Defaults to true.


You can customize the double-dot (..) argument for enhancd by this environment variable. Default is ...

If you set this variable any but .., it gives you the double-dot behavior with that argument; i.e. upward search of directory hierarchy. Then cd .. changes current directory to parent directory without interactive filter.

In other words, you can keep original cd .. behavior by this option.


You can customize the single-dot (.) argument for enhancd by this environment variable. Default is ..


A string to trigger a hyphen behavior. Default is -.

If you set this variable any but -, it gives you a hyphen behavior with that argument; i.e. backward search of directory-change history. Then cd - changes current directory to $OLDPWD without interactive filter.

In other words, you can keep the original cd - behavior by setting this option.


You can customize to trigger the argumentless cd behavior by giving the string specified by this environment variable as an argument. Default is empty string.

If you set this variable any but empty string, it gives you the behavior of cd with no argument; i.e. backward search of the whole directory-change history. Then cd with no argument changes current directory to $HOME without interactive filter.

In other words, you can keep original behavior of cd with no argument by setting this option.


A variable to specify how many lines to show up in the list when a hyphen behavior. Default is 10.


Default is empty. You can run any commands after changing directory with enhancd (e.g. set ls to this variable => same as cd && ls).


Set this to true to abbreviate the home directory prefix to ~ when performing an interactive search. Using the example shown previously, all entries when searching will be shown as follows:

false true
$ cd -
> /Users/babarot/src/github.com/b4b4..
$ cd -
> ~/src/github.com/b4b4..

Default is false (disable).

Known issues

Enhancd complete (fish):

On fish shell, you can use alt+f to trigger enhancd when typing a command, the selected item will be appended to the commandline

  • Fish version
    • Because of how fish piping works, it's not possible to pipe to cd like : ls / | cd


Interactive filter commands

The "visual filter" (interactive filter) is what is called "Interactive Grep Tool" according to percol that is a pioneer in interactive selection to the traditional pipe concept on UNIX. Some candidates of an interactive filter are listed on here.

Name Stars Language Activity


Similar projects.

(However, the basic concept of enhancd is totally different from these directory-jump tools)



Popular Command Line Projects
Popular Command Line Tool Projects
Popular Command Line Interface Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Command Line
Command Line Tool
Continuous Deployment
Shell Script
Fuzzy Search
Shell Extension