Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Break up Zsh configuration files #265

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
58 changes: 44 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,47 @@ There's a few special files in the hierarchy.

- **bin/**: Anything in `bin/` will get added to your `$PATH` and be made
available everywhere.
- **Brewfile**: This is a list of applications for [Homebrew Cask](https://caskroom.github.io) to install: things like Chrome and 1Password and Adium and stuff. Might want to edit this file before running any initial setup.
- **topic/\*.zsh**: Any files ending in `.zsh` get loaded into your
environment.
- **topic/path.zsh**: Any file named `path.zsh` is loaded first and is
expected to setup `$PATH` or similar.
- **topic/completion.zsh**: Any file named `completion.zsh` is loaded
last and is expected to setup autocomplete.
- **topic/install.sh**: Any file named `install.sh` is executed when you run `script/install`. To avoid being loaded automatically, its extension is `.sh`, not `.zsh`.
- **topic/\*.symlink**: Any file ending in `*.symlink` gets symlinked into
your `$HOME`. This is so you can keep all of those versioned in your dotfiles
but still keep those autoloaded files in your home directory. These get
symlinked in when you run `script/bootstrap`.
- **Brewfile**: This is a list of applications for
[Homebrew Cask](http://caskroom.io) to install: things like Chrome
and 1Password and Adium and stuff. Might want to edit this file
before running any initial setup.
- **topic/\*.zsh**: configuration files
- Environment configuration (i.e., `.zshenv`)
- **topic/path.zsh**: Any `path.zsh` file is loaded first and
is expected to setup `$PATH` or similar.
- **topic/env.zsh**: Any `env.zsh` file is loaded
second and is expected to setup any additional environment
(e.g., shell options).
- Interactive configuration (i.e., `.zshrc`)
- **topic/fpath.zsh**: Any `fpath.zsh` file is loaded for
interactive shells only. They are expected to populate
`$fpath`.
- **topic/\*.zsh**: Any files ending in `.zsh` (except those
specified elsewhere) are loaded for interactive shells only.
Interactive configuration can include aliases, color output,
prompt configuration, or anything else that should only be
loaded when a user is interacting with Zsh.
- **topic/*completion.zsh**: Any `completion.zsh` file is
loaded last for interactive shells only. They are expected
to setup autocomplete.
- Login configuration (i.e., `.zprofile`, `.zlogin`, `.zlogout`)
- **topic/profile.zsh**: Any `profile.zsh` file is loaded for
login shells only. Unlike `.zlogin`, these files are loaded
before the interactive files above are loaded.
- **topic/login.zsh**: Any `login.zsh` file is loaded for login
shells only. Unlike `.zprofile`, they are loaded after your
interactive files are loaded above. This is the ideal place
to put anything you want to see when you start up a new login
shell (e.g., cowsay, date, todo, fortune).
- **topic/logout.zsh**: Any `logout.zsh` file is loaded for
login shells only and only when you exit/logout the shell.
- **topic/install.sh**: Any file named `install.sh` is executed when you
run `script/install`. To avoid being loaded automatically, its
extension is `.sh`, not `.zsh`.
- **topic/\*.symlink**: Any files ending in `*.symlink` get symlinked into
your `$HOME`. This is so you can keep all of those versioned in your
dotfiles but still keep those autoloaded files in your home
directory. These get symlinked in when you run `script/bootstrap`.

## install

Expand All @@ -59,8 +88,9 @@ script/bootstrap
This will symlink the appropriate files in `.dotfiles` to your home directory.
Everything is configured and tweaked within `~/.dotfiles`.

The main file you'll want to change right off the bat is `zsh/zshrc.symlink`,
which sets up a few paths that'll be different on your particular machine.
The main file you'll want to change right off the bat is
`zsh/zshenv.symlink`, which sets up a few paths that'll be different on
your particular machine.

`dot` is a simple script that installs some dependencies, sets sane macOS
defaults, and so on. Tweak this script, and occasionally run `dot` from
Expand Down
10 changes: 5 additions & 5 deletions bin/dot
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,18 @@ while test $# -gt 0; do
shift
done

export ZSH=$HOME/.dotfiles
export DOTFILES=$HOME/.dotfiles

# Set macOS defaults
$ZSH/macos/set-defaults.sh
$DOTFILES/macos/set-defaults.sh

# Install homebrew
$ZSH/homebrew/install.sh 2>&1
$DOTFILES/homebrew/install.sh 2>&1

# Upgrade homebrew
echo "› brew update"
brew update

# Install software
echo "› $ZSH/script/install"
$ZSH/script/install
echo "› $DOTFILES/script/install"
$DOTFILES/script/install
4 changes: 2 additions & 2 deletions bin/set-defaults
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/bin/sh
#
# Sets macOS defaults by running $ZSH/macos/set-defaults.sh.
# Sets macOS defaults by running $DOTFILES/macos/set-defaults.sh.

exec $ZSH/macos/set-defaults.sh
exec $DOTFILES/macos/set-defaults.sh
6 changes: 3 additions & 3 deletions git/gitconfig.symlink
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
protocol = https
[alias]
co = checkout
promote = !$ZSH/bin/git-promote
wtf = !$ZSH/bin/git-wtf
rank-contributors = !$ZSH/bin/git-rank-contributors
promote = !$DOTFILES/bin/git-promote
wtf = !$DOTFILES/bin/git-wtf
rank-contributors = !$DOTFILES/bin/git-rank-contributors
count = !git shortlog -sn
[color]
diff = auto
Expand Down
2 changes: 1 addition & 1 deletion system/_path.zsh → system/path.zsh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export PATH="./bin:/usr/local/bin:/usr/local/sbin:$ZSH/bin:$PATH"
export PATH="./bin:/usr/local/bin:/usr/local/sbin:$DOTFILES/bin:$PATH"
export MANPATH="/usr/local/man:/usr/local/mysql/man:/usr/local/git/man:$MANPATH"
4 changes: 2 additions & 2 deletions zsh/config.zsh
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
export LSCOLORS="exfxcxdxbxegedabagacad"
export CLICOLOR=true

fpath=($ZSH/functions $fpath)
fpath=($DOTFILES/functions $fpath)

autoload -U $ZSH/functions/*(:t)
autoload -U $DOTFILES/functions/*(:t)

HISTFILE=~/.zsh_history
HISTSIZE=10000
Expand Down
2 changes: 1 addition & 1 deletion zsh/fpath.zsh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#add each topic folder to fpath so that they can add functions and completion scripts
for topic_folder ($ZSH/*) if [ -d $topic_folder ]; then fpath=($topic_folder $fpath); fi;
for topic_folder ($DOTFILES/*) if [ -d $topic_folder ]; then fpath=($topic_folder $fpath); fi;
2 changes: 1 addition & 1 deletion zsh/prompt.zsh
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ directory_name() {
battery_status() {
if [[ $(sysctl -n hw.model) == *"Book"* ]]
then
$ZSH/bin/battery-status
$DOTFILES/bin/battery-status
fi
}

Expand Down
16 changes: 16 additions & 0 deletions zsh/zlogin.symlink
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# NOTE: Not intended to be used with zprofile, but can be.

# Login configs.
setopt nullglob

# all of our login zsh files
typeset -U login_files
login_files=($DOTFILES/**/login.zsh)

# run all login files
for file in ${login_files}; do
source "$file"
done

unset login_files
unsetopt nullglob
14 changes: 14 additions & 0 deletions zsh/zlogout.symlink
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Logout configs.
setopt nullglob

# all of our logout zsh files
typeset -U logout_files
logout_files=($DOTFILES/**/logout.zsh)

# run all logout files
for file in ${logout_files}; do
source "$file"
done

unset logout_files
unsetopt nullglob
16 changes: 16 additions & 0 deletions zsh/zprofile.symlink
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# NOTE: Not intended to be used with zlogin, but can be.

# Login profile configs.
setopt nullglob

# all of our profile zsh files
typeset -U profile_files
profile_files=($DOTFILES/**/profile.zsh)

# run all profile files
for file in ${profile_files}; do
source "$file"
done

unset profile_files
unsetopt nullglob
26 changes: 26 additions & 0 deletions zsh/zshenv.symlink
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Environment configs.
setopt nullglob extendedglob

# shortcut to this dotfiles path is $DOTFILES
export DOTFILES="$HOME/.dotfiles"

# your project folder that we can `c [tab]` to
export PROJECTS="$HOME/Code"

# path and env zsh files
typeset -U path_files env_files
path_files=($DOTFILES/**/path.zsh~**/fpath.zsh)
env_files=($DOTFILES/**/env.zsh)

# load the path files
for file in ${path_files}; do
source "$file"
done

# load the env files
for file in ${env_files}; do
source "$file"
done

unset path_files env_files
unsetopt nullglob extendedglob
40 changes: 19 additions & 21 deletions zsh/zshrc.symlink
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
# shortcut to this dotfiles path is $ZSH
export ZSH=$HOME/.dotfiles

# your project folder that we can `c [tab]` to
export PROJECTS=~/Code
# Interactive environment configs.
setopt nullglob extendedglob

# Stash your environment variables in ~/.localrc. This means they'll stay out
# of your main dotfiles repository (which may be public, like this one), but
Expand All @@ -12,33 +9,34 @@ then
source ~/.localrc
fi

# all of our zsh files
typeset -U config_files
config_files=($ZSH/**/*.zsh)
# all of our non-path/env/profile/login/logout zsh files
typeset -U fpath_files interactive_files completion_files
fpath_files=($DOTFILES/**/fpath.zsh)
interactive_files=($DOTFILES/**/*.zsh~**/completion.zsh~**/path.zsh~**/env.zsh~**/profile.zsh~**/fpath.zsh~**/login.zsh~**/logout.zsh)
completion_files=($DOTFILES/**/completion.zsh)

# load the path files
for file in ${(M)config_files:#*/path.zsh}
do
source $file
# load fpath config files
for file in ${fpath_files}; do
source "$file"
done

# load everything but the path and completion files
for file in ${${config_files:#*/path.zsh}:#*/completion.zsh}
do
source $file
# load interactive files (everything but the completion, path, env,
# profile, login, and logout files)
for file in ${interactive_files}; do
source "$file"
done

# initialize autocomplete here, otherwise functions won't be loaded
autoload -U compinit
compinit

# load every completion after autocomplete loads
for file in ${(M)config_files:#*/completion.zsh}
do
source $file
for file in ${completion_files}; do
source "$file"
done

unset config_files
unset fpath_files interactive_files completion_files
unsetopt nullglob extendedglob

# Better history
# Credits to https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys
Expand All @@ -47,4 +45,4 @@ autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down
bindkey "^[[B" down-line-or-beginning-search # Down