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. Let’s configure what’s 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 |
-
)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 -
❯ enhancd
2/10
> /Users/babarot/src/github.com/b4b4r07/enhancd
/Users/babarot/src/github.com/b4b4r07/enhancd/src
To disable this feature, set ENHANCD_ENABLE_HYPHEN
to false
.
..
)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 ..
❯ _
6/6
> /Users/babarot/src/github.com/b4b4r07
/Users/babarot/src/github.com
/Users/babarot/src
/Users/babarot
/Users
/
To disable this feature, set ENHANCD_ENABLE_DOUBLE_DOT
to false
.
.
)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 .
❯ _
8/8
> .github/
.github/ISSUE_TEMPLATE/
.github/workflows/
conf.d/
functions/
functions/enhancd/
functions/enhancd/lib/
src/
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
.
:bulb: 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]
OPTIONS:
-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 eithershort
orlong
is good enough.
enhancd loads these config.ltsv
files located in:
$ENHANCD_ROOT/config.ltsv
$ENHANCD_DIR/config.ltsv
$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 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.
github:
- name: b4b4r07/enhancd
description: A next-generation cd command with your interactive filter
owner: b4b4r07
repo: enhancd
plugin:
env:
ENHANCD_FILTER: >
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
:fzy
:peco
sources:
- init.sh
- name: junegunn/fzf
description: A command-line fuzzy finder
owner: junegunn
repo: fzf
command:
build:
steps:
- ./install --bin --no-update-rc --no-key-bindings
link:
- from: 'bin/fzf'
- from: 'bin/fzf-tmux'
plugin:
sources:
- shell/completion.zsh
env:
FZF_DEFAULT_COMMAND: fd --type f
FZF_DEFAULT_OPTS: >
--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"
then,
$ afx install
For more details, see the full documentation.
ENHANCD_DIR
ENHANCD_FILTER
ENHANCD_COMMAND
ENHANCD_ENABLE_DOUBLE_DOT
ENHANCD_ENABLE_SINGLE_DOT
ENHANCD_ENABLE_HYPHEN
ENHANCD_ENABLE_HOME
ENHANCD_ARG_DOUBLE_DOT
ENHANCD_ARG_SINGLE_DOT
ENHANCD_ARG_HYPHEN
ENHANCD_ARG_HOME
ENHANCD_HYPHEN_NUM
ENHANCD_HOOK_AFTER_CD
ENHANCD_USE_ABBREV
false | true |
```console $ cd - ❯ _ 10/10 /Users/babarot/src > /Users/babarot/src/github.com/b4b4.. /Users/babarot/enhancd /Users/babarot/src/github.com/b4b4.. /Users/babarot/src/github.com/b4b4.. /Users/babarot/src/github.com/b4b4.. /Users/babarot/src/github.com/b4b4.. /Users/babarot/.tmux/plugins/tmux-.. /Users/babarot/.tmux/plugins/tmux-.. /Users/babarot/.afx/github.com/b4b.. ``` | ```console $ cd - ❯ _ 10/10 ~/src > ~/src/github.com/b4b4.. ~/enhancd ~/src/github.com/b4b4.. ~/src/github.com/b4b4.. ~/src/github.com/b4b4.. ~/src/github.com/b4b4.. ~/.tmux/plugins/tmux-.. ~/.tmux/plugins/tmux-.. ~/.afx/github.com/b4b.. ``` |
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
ls / | cd
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 |
---|---|---|---|
junegunn/fzf | |||
mooz/percol | |||
peco/peco | |||
jhawthorn/fzy | |||
mattn/gof | |||
garybernhardt/selecta | |||
mptre/pick | |||
lotabout/skim | |||
natecraddock/zf |
Similar projects.
(However, the basic concept of enhancd
is totally different from these directory-jump tools)