https://github.com/synoet/cdwe
⚡️(cd with env) Is a configurable cd wrapper that lets you define your environment per directory.
https://github.com/synoet/cdwe
bash cd cli config filesystem fish linux rust zsh
Last synced: 2 days ago
JSON representation
⚡️(cd with env) Is a configurable cd wrapper that lets you define your environment per directory.
- Host: GitHub
- URL: https://github.com/synoet/cdwe
- Owner: synoet
- Created: 2023-07-16T19:41:30.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-06-15T15:24:57.000Z (11 months ago)
- Last Synced: 2025-05-12T20:08:57.662Z (6 days ago)
- Topics: bash, cd, cli, config, filesystem, fish, linux, rust, zsh
- Language: Rust
- Homepage: https://crates.io/crates/cdwe
- Size: 20.1 MB
- Stars: 41
- Watchers: 1
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ⚡️cdwe (cd with env)
A simple configurable cd wrapper that provides powerful utilities for customizing your envionment per directory. \
*(For **ZSH** / **BASH** / **FISH** Shells)*[Installation](#installation) •
[Usage](#usage) •
[Configuration](#configuration) •
[Uninstalling](#uninstalling)
## Features
- **Per Directory Environment Variables**
- **Auto Load .env files in Directories**
- **Auto Execute Commands in Directories**
- **Per Directory Aliases**
- **Works with any CD like Command**## Installation
1. **Install binary**
```bash
cargo install cdwe
```2. **Init your shell**
```bash
cdwe init zsh # zsh shells
cdwe init bash # bash shells
cdwe init fish # fish shells
```3. **Reload your shell and start using!**
```bash
# check that env var gets set
cdwe /Users/synoet/dev/projecta
echo $IS_DEBUG# check that env var gets unset
cdwe ..
echo $IS_DEBUG
```## Usage
### Defining Per Directory Env Variables
---You can explicitly define environment variables in two ways:
```toml
[[directory]]
path = "/Users/synoet/dev/project"
vars = {"IS_DEBUG" = "true", "IS_PROD" = "false"}# or
[[directory]]
path = "/Users/synoet/dev/project"
vars = [
{name="IS_DEBUG", value ="true"},
{name="IS_PROD", value="false"}
]
```
`path`: the path to your directory you are configuring`vars`: a map of env vars to set
*By default env vars will also be loaded in subdirectories, in this example `/Users/synoet/dev/project/src` would also have `IS_DEBUG` and `IS_PROD` set*
*OR*
```toml
[[env_variable]]
name = "IS_DEBUG"
value = "true"
dirs = [
"/Users/synoet/dev/project1",
"/Users/synoet/dev/project2"
]
```
Here you can define one env var for multiple directories.`name`: Is the key of the env variable
`value`: is the value of the env variable
`dirs`: Is a list of directories to load this env var for
### Loading From .env files
---
The directory object also takes a `load_from` field
```toml
[[directory]]
path = "/Users/synoet/dev/project"
vars = {"IS_DEBUG" = "true", "IS_PROD" = "false"}
load_from = [".env"]
```
`load_from`: List of .env file names to auto load in, these should be relative to the dir defined in path.In this example we would try to load in a env file at `/Users/synoet/dev/project/.env`
*Unlike per directory env vars, env files are only loaded in the exact matching directory not in subdirectories*
**OR**
Similarly we can define a single env file for multiple directories
```toml
[[env_file]]
load_from = ".env"
dirs = [
"/Users/synoet/dev/macro/macro-site/astro",
"/Users/synoet/dev/macro/app-monorepo/packages/app"
]
```### Defining Aliases Per Directory
---
Here we can define aliases that will be set and unset as functions only in specific directories```toml
[[directory]]
path = "/Users/synoet/dev/project"
vars = {"IS_DEBUG" = "true", "IS_PROD" = "false"}
load_from = [".env"]
aliases = [
{ name = "build", commands = ["yarn cache clean", "yarn build", "yarn package"] }
]
```Here we define a `build` alias which will live only in `/User/synoet/dev/project/*` and all subdirectories.
`aliases`: a list of aliases to define for the directory
**OR**
```toml
[[alias]]
name = "build"
commands = ["yarn cache clean", "yarn build", "yarn package"]
dirs = [
"/Users/synoet/dev/projecta",
"/Users/synoet/dev/projectb"
]
```
Here you are defining the same alias for multiple directories.### Defining Auto Commands
---
Here we can define commands that will automatically run anytime we cd into a specific directory
```toml
[[directory]]
path = "/Users/synoet/dev/project"
vars = {"IS_DEBUG" = "true", "IS_PROD" = "false"}
load_from = [".env"]
aliases = [
{ name = "build", commands = ["yarn cache clean", "yarn build", "yarn package"] }
]
run = ["git fetch -p", "ls"]
```
In this case every time we enter `/Users/synoet/dev/project` cdwe will automatically run `git fetch -p` and `ls`*Auto Commands also require an exact match and don't propogate to subdirectories*
**OR**
```toml
[[command]]
run = "git fetch -p"
dirs = [
"/Users/synoet/dev/cdwe",
"/Users/synoet/dev/macro/macro-api"
]
```## Configuration
### Global Configuration Options
```toml
[config]
# Shell (Created during cdwe init )
shell = "zsh"
# Custom CD Command (defaults to cd)
cd_command = "z"
# Show alias hints on cd
alias_hints = true
# Show env hints on cd
env_hints = true
# shoe run hints on cd
run_hints = true
```### Example Configuration
```toml
[config]
cd_command = "z"
alias_hints = true
env_hints = true
command_hints = true
run_hints = true
shell = "zsh"# Defined a directory
# Will have env var "TEST" set in this directory
# Will auto run "git fetch -p" whenever you cd into this dir
# Exposes the following aliases in that directory and sub dirs
[[directory]]
path = "/Users/synoet/dev/cdwe"
vars = { "TEST" = "testing" }
runs = ["git fetch -p"]
aliases = [
{ name = "build", commands = ["cargo build --release"]},
{ name = "run", commands = ["cargo run"]},
{ name = "ci", commands = ["cargo fmt", "cargo test"]}
]# sets the "ENV_VAR" env var in the following directories
[[env_variable]]
name = "ENV_VAR"
value = "THIS IS A TEST"
dirs = [
"/Users/synoet/dev/cdwe",
"/Users/synoet/dev/ballast"
]# auto loads from .env file in following directories
[[env_file]]
load_from = ".env"
dirs = [
"/Users/synoet/dev/cdwe",
"/Users/synoet/dev/project-api"
]# will auto run the command "git fetch -p" in the following directories
[[command]]
run = "git fetch -p"
dirs = [
"/Users/synoet/dev/cdwe",
"/Users/synoet/dev/project-api"
]
```### Using CDWE Environment Variables in the paths
If you want to use something like **$HOME** or any other environment variable
set in a path, you can do so by wrapping the environment variable inside of
`{{}}`. Using **$HOME** as an example, you would do {{HOME}}. This can make
using one cdwe.toml across many machines nice if you have different users but a
similar directory structure for each user.## Uninstalling
1. Run cdwe-remove to clean up all shell artifacts
```bash
cdwe-remove #removes the `source ` from your .zshrc/.bashrc/.fishzsh #reload your shell, use bash or fish if you use those.
```2. Uninstall binary
```bash
cargo uninstall cdwe
```