Expedite your navigation of Linux filesystem.
A cd
command with improved and extended usability features to quickly navigate your Linux filesystem.
Features • Requirements • Installation • Configurations • Other Info • Known Caveats
If you're in a git repository and deeply embedded within directories, you can directly traverse to the root of the git repository.
Synopsis: cd .
Often when you're deeply embedded within directories, you may want to be able to search and traverse with respect to a particular directory. For example, many users may often feel the need of searching and traversing within their $HOME
directory irrespective of what their current working directory is.
By default, smartcd
will use $HOME
as base. User can provide multiple base paths as well (check out SMARTCD_BASE_PATHS
& SMARTCD_BASE_DIR_KEYBIND
).
Synopsis: cd (-b | --base) [string ...]
smartcd
can remember the last 50 (default) unique recently visited directory locations, where you can Fuzzy search and automatically traverse to the selected one.
Synopsis: cd -- [string ...]
If the provided argument is not in your $CDPATH
, then smartcd
will present you with a list of all the sub-directories that matched the argument, where you can Fuzzy search & directly traverse to the selected path.
Synopsis: cd [string ...]
smartcd
can search parent-directories based on the argument string provided. It will list all parent directories that matched the argument string, where you can fuzzy search and automatically traverse to the selected path.
Synopsis: cd .. [string ...]
You can pipe options, (with or without) arguments and as well as multiple directory paths stored in a file to smartcd
.
NOTE: Since v3.2.0, you can also use cd
with options & arguments along with piping, simultaneously.
For example,
echo ri \!git \'lua | cd -- \'color
cat $HOME/_testing/rough/dir_paths.txt | cd "bin 'dot"
Remove invalid paths from log.
cd (-c | --clean)
Print version information.
cd (-v | --version)
# or
echo $SMARTCD_VERSION
Initially, I tried enhancd
which is a very good alternative for the inbuilt cd
command, but the features of enhancd
were more than enough for me and also I had to change my familiarity and regular habit with using some of the default options or arguments that are often used with the inbuilt cd
command, just to familiarize and adapt with the tool.
I started by making smartcd
remember the last 20 unique visited paths using the --
option. I wanted to keep cd
as close to its native implementation, and at the same time increase its usability. The --
option with the cd
command was of no particular use to me, so I just provided an extra functionality to that option.
exa
or tree
, and will show the result in a split/preview window of the filter.smartcd
has inbuilt support for exa
and tree
, i.e., just install either exa
or tree
, and smartcd
will handle the rest.SMARTCD_FZF_PREVIEW_CMD
env with your desired command (with options).exa
or tree
with different options other than the default ones, you can export SMARTCD_FZF_PREVIEW_CMD
env specifying the command with your desired options.Clone the repository.
git clone --depth 1 https://github.com/CodesOfRishi/smartcd.git
Source the smartcd.sh
script in your shell configuration file (.bashrc
and/or .zshrc
).
source path/to/smartcd/smartcd.sh
Where path/to/smartcd/smartcd.sh
is the path to the smartcd.sh
script in the smartcd repository.
Open a new shell or reload your shell configuration file.
Add the below code in your .zshrc
()..bashrc
zinit ice depth=1
zinit light "CodesOfRishi/smartcd"
Open a new shell or reload your shell configuration file.
Add the plugin to Sheldon config file.
sheldon add smartcd --github CodesOfRishi/smartcd
Open a new shell or reload your shell configuration file.
SMARTCD_CONFIG_DIR
smartcd
stores logs in this location, which defaults to ~/.config/.smartcd
. To change location of the log file, export SMARTCD_CONFIG_DIR
with your desired location.
SMARTCD_SELECT_ONE
1
then smartcd
will directly traverse to the only matched directory path.0
then smartcd
will bring the interactive fzf
filter before travering to the path.0
.
SMARTCD_EXACT_SEARCH
1
to perform exact fzf search always. This defaults to 0
.
SMARTCD_FZF_PREVIEW_CMD
fzf
filter to show its result in fzf
's split/preview window.
exa
, it defaults to exa -TaF -I '.git' --icons --group-directories-first --git-ignore --colour=always
.tree
, it defaults to tree -I '.git' -C -a
.SMARTCD_HIST_DIR_LOG_SIZE
smartcd
should remember. This defaults to 50.
SMARTCD_COMMAND
SMARTCD_COMMAND
env with your desired command name. This defaults to cd
.
SMARTCD_FINDER
find
or fd
/fdfind
command.
SMARTCD_GREP
rg
or grep
command.
SMARTCD_BASE_PATHS
SMARTCD_BASE_PATHS=(
"path/to/my/dir1"
"path/to/my/proj1"
"path/to/my/dir2"
"path/to/my/proj2"
)
export SMARTCD_BASE_PATHS
( "${HOME}" )
.SMARTCD_BASE_DIR_KEYBIND
CTRL-k
(default) keystroke to fuzzy search & select to change the base directory to use (for the current shell) from the SMARTCD_BASE_PATHS
array.\\C-k
, i.e., CTRL-k
SMARTCD_BASE_DIR_OPT
SMARTCD_BASE_DIR_OPT
with your desired options with spaces. SmartCd will validate only the first 2 options provided in the env. This defaults to "-b --base"
.
SMARTCD_PARENT_DIR_OPT
SMARTCD_PARENT_DIR_OPT
with your desired option. This defaults to ..
.
SMARTCD_HIST_DIR_OPT
SMARTCD_HIST_DIR_OPT
with your desired option. This defaults to --
.
SMARTCD_LAST_DIR_OPT
SMARTCD_LAST_DIR_OPT
with your desired option. This defaults to -
.
SMARTCD_GIT_ROOT_OPT
SMARTCD_GIT_ROOT_OPT
with your desired option. This defaults to .
.
SMARTCD_CLEAN_LOG_OPT
SMARTCD_CLEAN_LOG_OPT
with your desired options with spaces. SmartCd will validate only the first 2 options provided in the env. This defaults to "-c --clean"
.
SMARTCD_VERSION_OPT
SMARTCD_VERSION_OPT
with your desired options with spaces. SmartCd will validate only the first 2 options provided in the env. This defaults to "-v --version"
.
What if the user configures the same options for multiple features?
SmartCd gives priority in the following order:
SMARTCD_HIST_DIR_OPT
> SMARTCD_PARENT_DIR_OPT
> SMARTCD_LAST_DIR_OPT
> SMARTCD_BASE_DIR_OPT
> SMARTCD_GIT_ROOT_OPT
> SMARTCD_CLEAN_LOG_OPT
> SMARTCD_VERSION_OPT
cd .
won't work if you're in .git/
directory of a git repository.cd .
will follow up any symbolic links. For e.g., if you're in ~/my-proj/foo/bar
and ~/my-proj
is symbolic linked to ~/src/my-proj
, then cd .
command will move you to ~/src/my-proj
.Zsh
, because in Bash
every command in a pipeline is executed as a separate process (i.e., in a subshell).The MIT License (MIT)
Copyright (c) 2021 Rishi K.